» Điện tử » Arduino »Quản lý nhà kính hoặc nhà kính từ bất cứ nơi nào trên thế giới (ví dụ thực hiện)

Quản lý nhà kính hoặc nhà kính từ bất cứ nơi nào trên thế giới (ví dụ thực hiện)

1 Khái niệm thiết bị



Mục đích của sự phát triển này là thu thập dữ liệu từ các cảm biến cục bộ, gửi dữ liệu này lên Internet. Người dùng sẽ có thể xem dữ liệu đến từ các cảm biến ở bất cứ đâu trên thế giới và đưa ra quyết định từ xa về việc kích hoạt một số bộ truyền động nhất định sẽ được đặt cục bộ, bên cạnh các cảm biến

Dự án sử dụng Arduino Mô-đun UNO và WiFi ESP8266-01. Dữ liệu sẽ được truyền lên đám mây thông qua dịch vụ web ThingSpeak.com và các thiết bị sẽ được kích hoạt thông qua ứng dụng Android được phát triển bằng MIT AppInventor.

Quản lý nhà kính hoặc nhà kính từ bất cứ nơi nào trên thế giới (ví dụ thực hiện)


IoT là một khái niệm về một mạng máy tính của các đối tượng vật lý (những thứ khác) được trang bị các công nghệ tích hợp để tương tác với nhau hoặc với môi trường bên ngoài, coi tổ chức của các mạng đó là một hiện tượng có thể xây dựng lại các quá trình kinh tế và xã hội, loại bỏ nhu cầu tham gia của con người từ các hoạt động và hoạt động của con người.


Trọng tâm chính của dự án IoT này sẽ là dịch vụ ThingSpeak.com. Thiết bị UNO / ESP-01 cục bộ nhận dữ liệu từ các cảm biến và dữ liệu về trạng thái của các bộ truyền động, gửi nó đến bản ghi Internet Internet thông qua kênh trạng thái ThingSpeak.com cụ thể (Kênh trạng thái ThingSpeak.com), cùng một thiết bị cục bộ nhận dữ liệu, " đọc sách của họ từ một kênh dữ liệu khác - kênh của các thiết bị điều hành, (Kênh truyền động ThingSpeak.com).



Dữ liệu sẽ được thu thập bằng cảm biến nhiệt độ và độ ẩm tương đối, nhiệt độ và độ ẩm của đất và cảm biến ánh sáng xung quanh. Dữ liệu này sẽ được gửi đến đám mây dịch vụ ThingSpeak.

Sẽ có hai thiết bị điều hành - đây là máy bơm nước và đèn. Trạng thái BẬT / TẮT của họ cũng sẽ được gửi lên đám mây. Dữ liệu từ các cảm biến, ví dụ, có thể hiển thị trạng thái hiện tại của nhà kính hoặc nhà kính. Người dùng sẽ điều khiển các thiết bị điều hành bằng ứng dụng Android.


2 Danh sách các thành phần cần thiết



Tất cả các liên kết chỉ dành cho mục đích thông tin.






2 x đèn LED (đỏ và xanh)
1 x
- $3.00
Đèn 220v
Điện trở 2 x 330 ohm (được sử dụng với đèn LED)
Điện trở 2 x 10K ohm (được sử dụng với DHT22 và LDR)
1 x 4K7 ohm điện trở (được sử dụng với DS18B20)
Bánh mì
Nhảy
Nguồn điện bên ngoài cho rơle 5V DC

3 phần sắt



Bây giờ bạn cần kết nối tất cả các cảm biến, như thể hiện trong sơ đồ.



Giải pháp lý tưởng sẽ là lắp ráp và thử nghiệm dự án theo từng phần.

Theo trình tự sau:
1. Cài đặt và kiểm tra tất cả các cảm biến
2.Cài đặt và cấu hình tối thiểu ESP-01
3. Thay đổi thiết lập ESP-01 thành cấu hình và kiểm tra cuối cùng
4. Cấu hình kênh trạng thái ThingSpeak
5. Cài đặt mã ThingSpeak trên Arduino và kiểm tra trạng thái của các cảm biến trên đám mây
6. Phát triển phiên bản đầu tiên của chương trình trên Android để kiểm tra thông báo trạng thái từ các cảm biến
7. Cài đặt bộ truyền động
8. Cấu hình các kênh Thiết bị truyền động ThingSpeak
9. Cài đặt và kiểm tra mã cho các thiết bị điều hành trên Arduino
10. Tạo phiên bản thứ hai của chương trình trên Android cho toàn bộ thiết bị.

4 Kết nối cảm biến





Dự án sử dụng một số thư viện được bao gồm trong. Nó là cần thiết để kiểm tra sự sẵn có của họ. Cấu hình ban đầu của các thư viện này như sau:
// DS18B20
#inc loại 
#include 
#define ONE_WIRE_BUS 5 // DS18B20 trên pin D5
OneWire oneWire (ONE_WIRE_BUS);
DallasTem Nhiệt độ DS18B20 (& oneWire);
int earthTemp = 0;

// DHT
#inc loại "DHT.h"
#inc loại 
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT dht (pinoDHT, tipoDHT);
int airTemp = 0;
int airHum = 0;

// LDR (Ánh sáng)
#define ldrPIN 1
int ánh sáng = 0;

// Độ ẩm đất
#define đấtHumPIN 0
int đấtHum = 0;


Bây giờ chúng tôi khởi tạo các cảm biến của mình và hiển thị chúng trong thiết bị đầu cuối:
thiết lập void ()
{
  Nối tiếp.begin (9600);
  DS18B20.begin ();
  dht.begin ();
}

vòng lặp void ()
{
  readSensors ();
  displaySensors ();
  độ trễ (10000);
}

Và cuối cùng, chúng ta sẽ viết hai chức năng: một chức năng đọc các bài đọc từ các cảm biến và phần còn lại hiển thị chúng trên màn hình:
/ ********* Đọc giá trị cảm biến ****** / 4 /
void readSensors (void)
{
  airTemp = dht.readTem Nhiệt độ ();
  airHum = dht.readHumids ();

  DS18B20.requestTemperatures ();
  earthTemp = DS18B20.getTempCBy Index (0); // Cảm biến 0 sẽ chụp Soil Temp trong Celcius
  
  earthHum = map (analogRead (earthHumPIN), 1023, 0, 0, 100);
 
  ánh sáng = bản đồ (analogRead (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> sáng 100%

}

/ ********* Hiển thị giá trị cảm biến ****** / 4 /
void displaySensors (void)
{
  Serial.print ("airTemp (oC):");
  Serial.println (airTemp);
  Serial.print ("airHum (%):");
  Nối tiếp.println (airHum);
  Serial.print ("earthTemp (oC):");
  Serial.println (earthTemp);
  Serial.print ("earthHum (%):");
  Nối tiếp.println (earthHum);
  Serial.print ("ánh sáng (%):");
  Nối tiếp.println (ánh sáng);
  Nối tiếp.println ("");
}


Ảnh hiển thị cách dữ liệu được hiển thị trên màn hình.


Mã nguồn có thể được tải xuống từ tác giả.

4 cấu hình cơ bản ESP8266-01



Cách nhanh nhất để "nói chuyện" với mô-đun là lệnh AT. Bộ xử lý đã có bộ xử lý lệnh AT. Theo mặc định, mô-đun đi kèm với cài đặt gốc của 115200 baud, bạn cần đặt 9600 baud trong cài đặt.

Trước tiên, bạn cần kết nối mô-đun, như trong ảnh



( Lưu ý rằng thiết bị đầu cuối Tx của ESP-01 được kết nối với thiết bị đầu cuối Tx của UNO, giống như các thiết bị đầu cuối Rx được kết nối với nhau. Kết nối này sẽ được thay đổi sau. ).

Sau đó kết nối UNO với máy tính, mở IDE và tải xuống ví dụ được đặt. Đây là mã trống để không có xung đột giữa ESP-01 và UNO. Mã này đã được tải lên Ardunio trước khi kết nối ESP-01 với nó, để chắc chắn rằng Ardunio sẽ không sử dụng chân Tx và Rx cho bất kỳ điều gì khác.
Bây giờ bạn cần mở Trình giám sát nối tiếp IDE, đặt tốc độ baud thành 115200 trong cài đặt và gửi lệnh AT đến Trình giám sát nối tiếp IDE. ESP-01 nên gửi câu trả lời OK

Bây giờ bạn cần thay đổi tốc độ dữ liệu trong mô-đun ESP-01. Để làm điều này, trong IDE, đưa ra lệnh

AT + CIOBAUD = 9600


Có thể xảy ra khi ESP-01 trở về cài đặt gốc, sau đó bạn sẽ cần sử dụng một lệnh khác:

AT + UART_DEF = , , , , 


Ví dụ 9600 baud / 8 bit dữ liệu / 1 bit stop và không kiểm soát luồng và chẵn lẻ

AT + UART_DEF = 9600,8,1,0,0


Bây giờ thay đổi tốc độ truyền dữ liệu trong cài đặt IDE thành 9600 và gửi lệnh AT, phản hồi OK sẽ xuất hiện.
Tiếp theo, bạn cần chuyển mô-đun sang chế độ STA để nó có thể kết nối với điểm truy cập của mạng.

AT + CWMODE = 1


Để mô-đun kết nối với mạng, hãy nhập lệnh AT + CWJAP = "network_name", "network_name_1"ở đâu tên mạng Là tên của mạng của bạn và mạng_name_1 - mật khẩu cho mạng của bạn (mật khẩu và tên mạng phải được đặt trong dấu ngoặc kép)
Nếu bạn thấy câu trả lời WIFI KẾT NỐI WIFI GOT IP, sau đó kết nối được thiết lập. Xác nhận địa chỉ IP bằng lệnh
AT + CIFSR
.

Địa chỉ xuất hiện trong màn hình của bạn, bạn có thể sử dụng trong tương lai. Khi bạn đã cấu hình mô-đun, bạn có thể kết nối nó vĩnh viễn, nhưng để làm được điều này, bạn cần thay đổi mạch chuyển mạch của nó, như trong hình.


• ESP-01 RX (Vàng) -> UNO Pin D7
• ESP-01 TX (Cam) -> Pin UNO D6
• ESP-01 Ch-Pd (Nâu) -> Vcc (3.3V)
• Đặt lại ESP-01 (Màu xanh) -> Pin UNO D8
• ESP-01 Vcc (Đỏ) -> 3,3V
• ESP-01 Gnd (Đen) -> UNO GND

Lưu ý rằng thư viện Phần mềm Nối tiếp sử dụng chân UNO Pin D7 như tx và nó kết nối với đầu ra của ESP-01 Rxtrong khi UNO Pin D6 như rxkết nối với ESP-01 TX.

Nhập một mã nhỏ để kiểm tra kết nối và cấu hình chính xác của mô-đun ESP-01
#include 
Phần mềm đặc biệt Esp8266 (6.7); // Rx ==> Chân 6; TX ==> Pin7

#define tốc độ8266 9600

thiết lập void ()
{
  Esp8266.begin (speed8266);
  Nối tiếp.begin (speed8266);
  Serial.println ("Kiểm tra thiết lập ESP8266 - sử dụng AT coomands");
}

vòng lặp void ()
{
  while (Esp8266.av Available ())
  {
    Nối tiếp.write (Esp8266.read ());
  }
  while (serial.av Available ())
  {
    Esp8266.write (Nối tiếp.read ());
  }
}


Bây giờ một vài đội AT. Xem kết quả trong Màn hình nối tiếp.



* AT =====> ESP8266 trả về OK
* AT + RST =====> ESP8266 khởi động lại và trả về OK
* AT + GMR =====> ESP8266 trả về Phiên bản AT; Phiên bản SDK; id; Được rồi
* TẠI + CWMODE? => ESP8266 trả về loại chế độ
* AT + CWLAP ===> ESP8266 trả về các điểm truy cập gần
* AT + CIFSR ===> ESP8266 trả về IP được chỉ định

Mã chương trình có thể được tải xuống tại

6 kết nối cảm biến và ESP-01




Sau khi tất cả các cảm biến được kết nối và kiểm tra, cũng như mô-đun ESP-01 được kiểm tra, cần phải chuẩn bị dữ liệu để gửi tới Internet.

7 điều





Một trong những phần quan trọng nhất của dự án là nền tảng IoT mở, cho phép bạn thu thập dữ liệu từ các cảm biến, xử lý và phân tích chúng. Để làm điều này, đi đến và tạo tài khoản của bạn. Tiếp theo, bạn cần tạo một kênh trong đó sẽ có 2 bộ truyền động, 5 cảm biến và một trường sao lưu.
• Trường 1: Thiết bị truyền động 1 (thiết bị 1)
• Trường 2: Thiết bị truyền động 2 (thiết bị 2)
• Trường 3: Nhiệt độ không khí tính theo oC (nhiệt độ không khí tính bằng độ C)
• Nộp 4: Độ ẩm không khí tương đối tính theo% (Độ ẩm tương đối tính theo%)
• Trường 5: Nhiệt độ đất tính theo oC (Nhiệt độ đất tính bằng gr)
• Trường 6: Độ ẩm của đất tính theo% (độ ẩm của đất tính theo%)
• Trường 7: Độ sáng tính theo% (độ rọi tính theo%)
• Trường 8: Phụ tùng

Trường 8 được dành riêng để mở rộng trong tương lai hoặc để gỡ lỗi. Trong dự án này, nó được sử dụng như một bộ đếm lỗi giao tiếp giữa Arduino / ESP-01 và ThingSpeak.com.

Khi bạn đã tạo Kênh trạng thái, bạn cần ghi lại các phím, như trong ảnh.

8 Gửi trạng thái cảm biến lên đám mây



Hiện tại, chúng tôi có một dịch vụ đám mây được cấu hình và các cảm biến của chúng tôi thu thập dữ liệu cục bộ. Bây giờ bạn cần lấy dữ liệu này và gửi nó lên đám mây trên ThingSpeak.com.

Để ghi dữ liệu lên kênh ThingSpeak, bạn cần gửi một chuỗi GET. Điều này sẽ được thực hiện trong ba giai đoạn.
Gửi lệnh "Bắt đầu cmd"
AT + CIPSTART = "TCP", "184.106.153.149", 80

Chiều dài chuỗi hơn nữa

AT + CIPSEND = 116


Và cuối cùng, một chuỗi GET sẽ ghi dữ liệu của chúng ta vào các trường Kênh trạng thái dành riêng.

NHẬN / cập nhật?


Xin lưu ý rằng chúng ta không nên ghi dữ liệu lên kênh quá 1 lần trong 16 giây.

Mã được gửi sẽ làm tất cả điều này.
// Thingspeak
Chuỗi statusChWriteKey = "KEY VIẾT CỦA BẠN TẠI ĐÂY"; // Id kênh trạng thái: 385184

#include 
Phần mềm EspSerial (6, 7); // Rx, Tx
#define HARDWARE_RESET 8

// DS18B20
#inc loại 
#include 
#define ONE_WIRE_BUS 5 // DS18B20 trên pin D5
OneWire oneWire (ONE_WIRE_BUS);
DallasTem Nhiệt độ DS18B20 (& oneWire);
int earthTemp = 0;

// DHT
#inc loại "DHT.h"
#inc loại 
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT dht (pinoDHT, tipoDHT);
int airTemp = 0;
int airHum = 0;

// LDR (Ánh sáng)
#define ldrPIN 1
int ánh sáng = 0;

// Độ ẩm đất
#define đấtHumPIN 0
int đấtHum = 0;

// Các biến được sử dụng với bộ định thời
viết dàiTimingSeconds = 17; // ==> Xác định thời gian mẫu tính bằng giây để gửi dữ liệu
bắt đầu dàiWriteTiming = 0;
thời gian dài trôi quaWriteTime = 0;

// Các biến được sử dụng với Thiết bị truyền động
bơm boolean = 0;
đèn boolean = 0;

int tùng = 0;
lỗi boolean;

thiết lập void ()
{
  Nối tiếp.begin (9600);
  
  pinMode (HARDWARE_RESET, OUTPUT);
  
  kỹ thuật sốWrite (HARDWARE_RESET, CAO);
  
  DS18B20.begin ();
  dht.begin ();

  EspSerial.begin (9600); // Comunicacao com Modulo WiFi
  EspHardwareReset (); // Đặt lại làm Modulo WiFi
  startWriteTiming = millis (); // bắt đầu "đồng hồ chương trình"
}

vòng lặp void ()
{
  bắt đầu: // nhãn
  lỗi = 0;
  
  elapsedWriteTime = millis () - startWriteTiming;
  
  if (elapsedWriteTime> (writeTimingSeconds * 1000))
  {
    readSensors ();
    writeT BreathSpeak ();
    startWriteTiming = millis ();
  }
  
  if (error == 1) // Gửi lại nếu quá trình truyền chưa hoàn thành
  {
    Sê-ri.println ("<<<< LRI >>>>");
    trì hoãn (2000);
    bắt đầu goto; // đi đến nhãn "bắt đầu"
  }
}

/ ********* Đọc giá trị cảm biến ****** / 4 /
void readSensors (void)
{
  airTemp = dht.readTem Nhiệt độ ();
  airHum = dht.readHumids ();

  DS18B20.requestTemperatures ();
  earthTemp = DS18B20.getTempCBy Index (0); // Cảm biến 0 sẽ chụp Soil Temp trong Celcius
             
  ánh sáng = bản đồ (analogRead (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> sáng 100%
  earthHum = map (analogRead (earthHumPIN), 1023, 0, 0, 100);

}

/ ********* Conexao com TCP com Thingspeak ******* /
void writeT BreathSpeak (void)
{

  startT BreathSpeakCmd ();

  // chuẩn bị chuỗi da NHẬN
  Chuỗi getStr = "NHẬN / cập nhật? Api_key =";
  getStr + = statusChWriteKey;
  getStr + = "& field1 =";
  getStr + = Chuỗi (bơm);
  getStr + = "& field2 =";
  getStr + = Chuỗi (đèn);
  getStr + = "& field3 =";
  getStr + = Chuỗi (airTemp);
  getStr + = "& field4 =";
  getStr + = Chuỗi (airHum);
  getStr + = "& field5 =";
  getStr + = String (earthTemp);
  getStr + = "& field6 =";
  getStr + = String (earthHum);
  getStr + = "& field7 =";
  getStr + = Chuỗi (ánh sáng);
  getStr + = "& field8 =";
  getStr + = Chuỗi (dự phòng);
  getStr + = "\ r \ n \ r \ n";

  sendT BreathSpeakGetCmd (getStr);
}

/ ********* Đặt lại ESP ****** / GIỜ /
void EspHardwareReset (void)
{
  Serial.println ("Đặt lại .......");
  kỹ thuật sốWrite (HARDWARE_RESET, THẤP);
  độ trễ (500);
  kỹ thuật sốWrite (HARDWARE_RESET, CAO);
  độ trễ (8000); // Tempo Needário para começar a ler
  Serial.println ("THIẾT LẬP");
}

/ ********* Bắt đầu liên lạc với ThingSpeak ****** / 4 /
void startT BreathSpeakCmd (void)
{
  EspSerial.flush (); // limpa o đệm antes de começar a gravar
  
  Chuỗi cmd = "AT + CIPSTART = \" TCP \ ", \" ";
  cmd + = "184.106.153.149"; // Endereco IP de api.thingspeak.com
  cmd + = "\", 80 ";
  EspSerial.println (cmd);
  Serial.print ("enviado ==> Bắt đầu cmd:");
  Nối tiếp.println (cmd);

  if (EspSerial.find ("Lỗi"))
  {
    Serial.println ("lỗi AT + CIPSTART");
    trở về
  }
}

/ ********* gửi một cmd NHẬN cho ThingSpeak ****** / 4 /
Chuỗi sendT BreathSpeakGetCmd (Chuỗi getStr)
{
  Chuỗi cmd = "AT + CIPSEND =";
  cmd + = Chuỗi (getStr.length ());
  EspSerial.println (cmd);
  Serial.print ("enviado ==> chiều dài cmd:");
  Nối tiếp.println (cmd);

  if (EspSerial.find ((char *) ">"))
  {
    EspSerial.print (getStr);
    Serial.print ("enviado ==> getStr:");
    Serial.println (getStr);
    delay (500); // tempo para processar o GET, sem este delay apresenta busy no próimumo comando

    Chuỗi tin nhắnBody = "";
    while (EspSerial.av Available ())
    {
      Chuỗi dòng = EspSerial.readStringUntil ('\ n');
      if (line.length () == 1)
      {// nội dung thực tế bắt đầu sau dòng trống (có độ dài 1)
        messageBody = EspSerial.readStringUntil ('\ n');
      }
    }
    Serial.print ("MessageBody nhận được:");
    Serial.println (messageBody);
    trả lại tin nhắnBody;
  }
  khác
  {
    EspSerial.println ("AT + CIPCLOSE"); // cảnh báo người dùng
    Serial.println ("ESP8266 CIPSEND ERROR: RESENDING"); // Gửi lại ...
    phụ tùng = phụ tùng + 1;
    lỗi = 1;
    trả lại "lỗi";
  }
}

Bạn có thể xem tiến trình trong Màn hình nối tiếp.

Mã nguồn có thể được tải xuống tại

9 ứng dụng android - phần một



Đầu tiên bạn cần tạo giao diện người dùng. Hình ảnh cho thấy các yếu tố chính có thể nhìn thấy và vô hình.



Sau đó, bạn cần tạo khối. Các mục menu tương ứng với số ảnh chụp màn hình.

1 Các biến trạng thái cần được khai báo là toàn cục

2 Cứ sau hai giây (tùy thuộc vào Clock1), một thủ tục được gọi "đọc"


Quy trình trả về giá trị của các biến sẽ được hiển thị trên màn hình. Trong trường hợp này, giá trị trạng thái (0 và 1) cho các bộ truyền động được chuyển đổi thành BẠC TRÊN và BẮT ĐẦU để nhận thức tốt hơn.

Các giá trị này (Trạng thái) sẽ được hiển thị trong Phím tắt tương ứng

3 Thói quen readArduino về cơ bản sẽ đọc kênh trạng thái trong ThingSpeak. Vì vậy, bạn cần xác định URL sẽ được gửi tới Thingspeak. Để làm điều này, 3 biến toàn cục phải được khai báo và kết hợp để tạo URL sẽ được gửi đến ThingSpeak. GET nên được gửi đến một thành phần web được gọi là "ArduFarmBotStatusCh"

4 Văn bản nhận được từ lệnh trước sẽ đến ở định dạng JSon. Văn bản này cần được xử lý sao cho mỗi trường được đọc và lưu trữ trong biến toàn cục tương ứng.

5 Điều cuối cùng cần làm là gọi thủ tục Cảnh báo Cảnh báo, sẽ phân tích trạng thái của hai cảm biến đất. Nếu nhiệt độ quá thấp (trong trường hợp của chúng tôi là 10oC), một thông báo sẽ được hiển thị. Tương tự cho độ ẩm nếu nó dưới 60%.

Xin lưu ý rằng chúng tôi đã xác định một bộ đếm thời gian khác (Clock2), được lập trình để nó chạy mỗi giây. Chỉ cần "chuyển" màu của văn bản tin nhắn (từ trắng sang đỏ). Tin nhắn sẽ nhấp nháy.

Mã ứng dụng có thể được tải xuống tại

10 Kết nối bộ truyền động




Các lệnh để bật và tắt bơm và đèn sẽ được nhận từ xa. Đầu ra của Ardunio sẽ kích hoạt rơle và đèn LED, thực hiện các lệnh này. Hình ảnh cho thấy các cơ cấu chấp hành nên được kết nối. Xin lưu ý rằng đầu ra rơle GND KHÔNG KẾT NỐI đến đầu ra GNDUNO. Bằng cách này sẽ có ít nhiễu điện hơn khi rơle đang chạy.

11 cấu hình của bộ truyền động kênh (Kênh chấp hành)




Tất cả các hành động lặp lại thủ tục để cấu hình kênh Trạng thái. Cần phải tạo hai kênh cho mỗi thiết bị. Đối với mỗi kênh, hãy viết ID kênh, đọc và ghi phím. Chúng tôi sẽ chỉ viết trong trường đầu tiên của mỗi kênh. Ví dụ:
ID kênh 375598 ==> Đèn LED đỏ (Bơm)
Trường1 = 0 ==> Bơm TẮT
Field1 = 1 ==> Bơm ON
2. ID kênh 375599 ==> Đèn LED xanh (Đèn)
Trường1 = 0 ==> Tắt đèn
Trường1 = 1 ==> Đèn BẬT

11 bộ tải và kiểm tra bộ truyền động mã ở Ardunio.



Khi chúng tôi gửi dữ liệu lên đám mây, chúng tôi đã viết dữ liệu này cho ThingSpeak. Kênh trạng thái, truyền tải dữ liệu (tải lên) dữ liệu này. Bây giờ chúng tôi phải đọc dữ liệu từ các kênh của Bộ truyền động, chấp nhận dữ liệu trên mạng (tải xuống) dữ liệu này.

Để làm điều này, hãy gửi một chuỗi GET và quy trình này bao gồm 3 giai đoạn.
"Bắt đầu cmd"
AT + CIPSTART = "TCP", "184.106.153.149", 80

Độ dài dòng
AT + CIPSEND = 36

Và chính chuỗi GET
NHẬN / kênh / 375598 / trường / 1 / lần cuối

Các kênh sẽ được đọc trên mạng cứ sau 10 giây

Sau khi gửi GET, chúng tôi phải chấp nhận phản hồi từ ThingSpeak. Câu trả lời phải là 0 hoặc 1, cho mỗi kênh. Nếu có bất kỳ giá trị nào khác, thì chúng ta chỉ cần bỏ qua chúng.

Sự khác biệt chính giữa phần này và phần trước chỉ có trong chức năng readT BreathSpeak (Chuỗi kênhID)
Dưới đây là mã thực hiện các hành động được mô tả.

// Thingspeak
Chuỗi CanalID1 = "999999"; // Thiết bị truyền động1
Chuỗi CanalID2 = "999999"; // Thiết bị truyền động2

#include 
Phần mềm EspSerial (6, 7); // Rx, Tx
#define HARDWARE_RESET 8

// Các biến được sử dụng với bộ định thời
dài đọcTimingSeconds = 10; // ==> Xác định thời gian mẫu tính bằng giây để nhận dữ liệu
bắt đầu dàiReadTiming = 0;
thời gian dài trôi quaReadTime = 0;

// Rơle
#define ACTUATOR1 10 // LED ĐỎ ==> Bơm
#define ACTUATOR2 12 // Đèn LED XANH ==> Đèn
bơm boolean = 0;
đèn boolean = 0;

int tùng = 0;
lỗi boolean;

thiết lập void ()
{
  Nối tiếp.begin (9600);
  
  pinMode (ACTUATOR1, OUTPUT);
  pinMode (ACTUATOR2, OUTPUT);
  pinMode (HARDWARE_RESET, OUTPUT);

  kỹ thuật sốWrite (ACTUATOR1, CAO); // o módulo relé é ativo em THẤP
  kỹ thuật sốWrite (ACTUATOR2, CAO); // o módulo relé é ativo em THẤP
  kỹ thuật sốWrite (HARDWARE_RESET, CAO);

  EspSerial.begin (9600); // Comunicacao com Modulo WiFi
  EspHardwareReset (); // Đặt lại làm Modulo WiFi
  startReadTiming = millis (); // bắt đầu "đồng hồ chương trình"
}

vòng lặp void ()
{
  bắt đầu: // nhãn
  lỗi = 0;
  
  elapsedReadTime = millis () - startReadTiming;

  if (elapsedReadTime> (readTimingSeconds * 1000))
  {
    int lệnh = readT BreathSpeak (CanalID1);
    if (lệnh! = 9) pump = lệnh;
    trì hoãn (5000);
    lệnh = readT BreathSpeak (CanalID2);
    if (lệnh! = 9) đèn = lệnh;
    TakeActions ();
    startReadTiming = millis ();
  }
  
  if (error == 1) // Gửi lại nếu quá trình truyền chưa hoàn thành
  {
    Sê-ri.println ("<<<< LRI >>>>");
    trì hoãn (2000);
    bắt đầu goto; // đi đến nhãn "bắt đầu"
  }
}

/ ********* Thực hiện các hành động dựa trên các lệnh của ThingSpeak ****** / 4 /
void TakeActions (void)
{
  Serial.print ("Bơm:");
  Serial.println (bơm);
  Serial.print ("Đèn:");
  Serial.println (đèn);
  if (pump == 1) digitalWrite (ACTUATOR1, THẤP);
  khác kỹ thuật sốWrite (ACTUATOR1, CAO);
  if (đèn == 1) kỹ thuật sốWrite (ACTUATOR2, THẤP);
  khác kỹ thuật sốWrite (ACTUATOR2, CAO);
}

/ ********* Đọc lệnh Actuators từ ThingSpeak ****** / 4 /
int readT BreathSpeak (Chuỗi kênhID)
{
  startT BreathSpeakCmd ();
  lệnh int;
  // chuẩn bị chuỗi da NHẬN
  Chuỗi getStr = "GET / kênh /";
  getStr + = channelID;
  getStr + = "/ các trường / 1 / lần cuối";
  getStr + = "\ r \ n";

  Chuỗi messageDown = sendT BreathSpeakGetCmd (getStr);
  if (messageDown [5] == 49)
  {
    lệnh = messageDown [7] -48;
    Serial.print ("Lệnh đã nhận:");
    Serial.println (lệnh);
  }
  lệnh khác = 9;
  trả lại lệnh;
}

/ ********* Đặt lại ESP ****** / GIỜ /
void EspHardwareReset (void)
{
  Serial.println ("Đặt lại .......");
  kỹ thuật sốWrite (HARDWARE_RESET, THẤP);
  độ trễ (500);
  kỹ thuật sốWrite (HARDWARE_RESET, CAO);
  độ trễ (8000); // Tempo Needário para começar a ler
  Serial.println ("THIẾT LẬP");
}

/ ********* Bắt đầu liên lạc với ThingSpeak ****** / 4 /
void startT BreathSpeakCmd (void)
{
  EspSerial.flush (); // limpa o đệm antes de começar a gravar
  
  Chuỗi cmd = "AT + CIPSTART = \" TCP \ ", \" ";
  cmd + = "184.106.153.149"; // Endereco IP de api.thingspeak.com
  cmd + = "\", 80 ";
  EspSerial.println (cmd);
  Serial.print ("enviado ==> Bắt đầu cmd:");
  Nối tiếp.println (cmd);

  if (EspSerial.find ("Lỗi"))
  {
    Serial.println ("lỗi AT + CIPSTART");
    trở về
  }
}

/ ********* gửi một cmd NHẬN cho ThingSpeak ****** / 4 /
Chuỗi sendT BreathSpeakGetCmd (Chuỗi getStr)
{
  Chuỗi cmd = "AT + CIPSEND =";
  cmd + = Chuỗi (getStr.length ());
  EspSerial.println (cmd);
  Serial.print ("enviado ==> chiều dài cmd:");
  Nối tiếp.println (cmd);

  if (EspSerial.find ((char *) ">"))
  {
    EspSerial.print (getStr);
    Serial.print ("enviado ==> getStr:");
    Serial.println (getStr);
    delay (500); // tempo para processar o GET, sem este delay apresenta busy no próimumo comando

    Chuỗi tin nhắnBody = "";
    while (EspSerial.av Available ())
    {
      Chuỗi dòng = EspSerial.readStringUntil ('\ n');
      if (line.length () == 1)
      {// nội dung thực tế bắt đầu sau dòng trống (có độ dài 1)
        messageBody = EspSerial.readStringUntil ('\ n');
      }
    }
    Serial.print ("MessageBody nhận được:");
    Serial.println (messageBody);
    trả lại tin nhắnBody;
  }
  khác
  {
    EspSerial.println ("AT + CIPCLOSE"); // cảnh báo người dùng
    Serial.println ("ESP8266 CIPSEND ERROR: RESENDING"); // Gửi lại ...
    phụ tùng = phụ tùng + 1;
    lỗi = 1;
    trả lại "lỗi";
  }
}


Bạn có thể tải nó tại

12 lệnh gửi đến thiết bị



Ở giai đoạn này, chúng tôi có một kênh chấp hành được cấu hình thay đổi giá trị của trường 1 cho mỗi thiết bị. Chúng tôi phải xác minh rằng các thiết bị thực hiện đúng các lệnh. Vào cuối dự án, một ứng dụng Android sẽ được sử dụng cho việc này, nhưng nó cũng có thể được thực hiện thông qua trình duyệt.

Bật bơm (đèn LED màu đỏ)
https://api.thingspeak.com/update?api_key=Satted_channel_key_1&field1=1

Tắt bơm (tắt đèn LED đỏ)
https://api.thingspeak.com/update?api_key= Kênh đã lưu_key_1 & field1 = 0

Bật đèn (đèn LED màu xanh lá cây đang bật)
https://api.thingspeak.com/update?api_key= Kênh đã lưu_key_2 & field1 = 1

Tắt đèn (tắt đèn LED xanh)
https://api.thingspeak.com/update?api_key= Kênh đã lưu_key_2 & field1 = 0


14 Kết thúc chương trình Android




Trong phần trước, có một chương trình đơn giản là đọc dữ liệu từ kênh và hiển thị trên màn hình. Bây giờ chúng ta cần tạo chương trình, ghi các lệnh trong Actuator Barkal, để các lệnh này có thể được đọc bởi bộ điều khiển và đèn với bơm hoạt động tương ứng.

Để người dùng có thể gửi lệnh, ứng dụng sẽ có hai nút cho mỗi thiết bị. Nếu bật, màu xanh; nếu tắt, màu đỏ.

Bằng cách nhấp vào các nút trong ứng dụng, bạn có thể thấy kết quả trong Màn hình nối tiếp.

Mã có thể được tải xuống tại

15 Lắp ráp cuối cùng



Ở giai đoạn này, có một ứng dụng Android đã hoàn thành, một phần cứng được lắp ráp hoàn chỉnh, nhưng không có mã nào trong bộ điều khiển sẽ liên tục đọc dữ liệu và gửi lệnh lên đám mây. Bạn chỉ cần kết hợp tất cả các đoạn mã được viết trước đó. Tất nhiên, mã có các tùy chọn xác minh bổ sung (ví dụ: nếu ESP-01 đóng băng). Để thực hiện việc này, định kỳ, trước mỗi lệnh đọc hoặc ghi, lệnh AT được gửi.Và nếu câu trả lời OK không đến từ mô-đun, thì mô-đun sẽ được khởi động lại theo chương trình.

Mã dự án đầy đủ có thể được tải xuống tại

Tại địa chỉ bạn có thể nhận được cập nhật cho các tập tin chương trình.

Bạn cũng có thể đọc các bình luận về liên kết đến nguồn, nếu có gì đó không rõ ràng.
8.3
8.6
8.4

Thêm một bình luận

    • cườinhững nụ cườixaxađược rồikhông biếtyahookhông
      ông chủvết xướcđồ ngốcvângvâng-vânghung hăngbí mật
      xin lỗinhảynhảy2nhảy3ân xágiúp đỡđồ uống
      dừng lạibạn bètốttốt lànhcòingấtlưỡi
      hút thuốcvỗ taycraytuyên bốgiễu cợtdon-t_mentiontải về
      nhiệttôi rấtcười1mdacuộc họpmoskingtiêu cực
      không phảibỏng ngôtrừng phạtđọcsợsợ hãitìm kiếm
      chế nhạocảm ơncái nàyto_cluecựu sinh viêncấp tínhđồng ý
      xấubeeeđen_eyeblum3đỏ mặttự hàobuồn chán
      bị kiểm duyệtdễ chịubí mật2đe dọachiến thắngyusun_bespectacled
      shokrespekthahacó trướcchào mừngkrutoyya_za
      ya_dobryingười trợ giúpne_huliganne_othodifludcấmđóng

Chúng tôi khuyên bạn nên đọc:

Đưa nó cho điện thoại thông minh ...