1 แนวคิดอุปกรณ์
จุดประสงค์ของการพัฒนานี้คือการรวบรวมข้อมูลจากเซ็นเซอร์ท้องถิ่นส่งข้อมูลนี้ไปยังอินเทอร์เน็ต ผู้ใช้จะสามารถดูข้อมูลที่มาจากเซ็นเซอร์ได้ทุกที่ในโลกและทำการตัดสินใจระยะไกลในการเปิดใช้งานแอคทูเอเตอร์บางตัวที่จะอยู่ในพื้นที่ถัดจากเซ็นเซอร์
โครงการใช้ Arduino โมดูล UNO และ WiFi ESP8266-01 ข้อมูลจะถูกส่งไปยังคลาวด์ผ่านบริการเว็บของ ThingSpeak.com และอุปกรณ์จะถูกเปิดใช้งานผ่านแอปพลิเคชัน Android ที่พัฒนาโดยใช้ MIT AppInventor
IoT เป็นแนวคิดของเครือข่ายคอมพิวเตอร์ของวัตถุทางกายภาพ ("สิ่งของ") ที่ติดตั้งเทคโนโลยีในตัวสำหรับการโต้ตอบซึ่งกันและกันหรือกับสภาพแวดล้อมภายนอกพิจารณาองค์กรของเครือข่ายดังกล่าวเป็นปรากฏการณ์ที่สามารถสร้างกระบวนการทางเศรษฐกิจและสังคมใหม่โดยไม่ต้องมีส่วนร่วมของมนุษย์
จุดสนใจหลักของโครงการ IoT นี้คือบริการ ThingSpeak.com อุปกรณ์ UNO / ESP-01 ในพื้นที่ได้รับข้อมูลจากเซ็นเซอร์และข้อมูลเกี่ยวกับสถานะของแอคทูเอเตอร์ส่งไปยังอินเทอร์เน็ต "บันทึก" ผ่านช่องทางสถานะเฉพาะของ ThingSpeak.com (ช่องสถานะ ThingSpeak.com) ซึ่งเป็นอุปกรณ์ในท้องถิ่นเดียวกันที่รับข้อมูล " อ่าน” พวกเขาจากช่องข้อมูลอื่น -“ ช่องทางของอุปกรณ์ผู้บริหาร” (ThingSpeak.com Actuator Channels)
ข้อมูลจะถูกรวบรวมโดยใช้เซ็นเซอร์วัดอุณหภูมิและความชื้นสัมพัทธ์อุณหภูมิของดินและความชื้นและเซ็นเซอร์วัดแสงโดยรอบ ข้อมูลนี้จะถูกส่งไปยังบริการคลาวด์ของ ThingSpeak
จะมีอุปกรณ์สำหรับผู้บริหารสองคน - นี่คือปั๊มน้ำไฟฟ้าและหลอดไฟ สถานะเปิด / ปิดของพวกเขาจะถูกส่งไปยังคลาวด์ ข้อมูลจากเซ็นเซอร์สามารถแสดงสถานะปัจจุบันของเรือนกระจกหรือเรือนกระจก ผู้ใช้จะควบคุมอุปกรณ์ผู้บริหารโดยใช้แอปพลิเคชัน Android
2 รายการส่วนประกอบที่จำเป็น
ลิงก์ทั้งหมดมีวัตถุประสงค์เพื่อให้ข้อมูลเท่านั้น
2 x LEDs (แดงและเขียว)
1 x
- $3.00
หลอดไฟ 220V
ตัวต้านทาน 2 x 330 โอห์ม (ใช้กับไฟ LED)
ตัวต้านทาน 2 x 10K โอห์ม (ใช้กับ DHT22 และ LDR)
ตัวต้านทาน 1 x 4K7 โอห์ม (ใช้กับ DS18B20)
คณะกรรมการการสร้างต้นแบบ
จัมเปอร์
แหล่งจ่ายไฟภายนอกสำหรับรีเลย์ 5V DC
3 ชิ้นส่วนเหล็ก
ตอนนี้คุณต้องเชื่อมต่อเซ็นเซอร์ทั้งหมดดังแสดงในแผนภาพ
ทางออกที่ดีที่สุดคือการรวบรวมและทดสอบโครงงานในส่วนต่างๆ
ในลำดับต่อไปนี้:
1. ติดตั้งและทดสอบเซ็นเซอร์ทั้งหมด
2ติดตั้งและกำหนดค่าขั้นต่ำ ESP-01
3. เปลี่ยนการตั้งค่า ESP-01 เป็นการกำหนดค่าและทดสอบขั้นสุดท้าย
4. กำหนดค่าช่องสถานะ ThingSpeak
5. ติดตั้งรหัส ThingSpeak บน Arduino และตรวจสอบสถานะของเซ็นเซอร์บนคลาวด์
6. พัฒนาเวอร์ชันแรกของโปรแกรมบน Android เพื่อตรวจสอบข้อความสถานะจากเซ็นเซอร์
7. ติดตั้งแอคทูเอเตอร์
8. กำหนดค่าช่องทางของ ThingSpeak Actuators
9. ติดตั้งและทดสอบรหัสสำหรับอุปกรณ์ผู้บริหารใน Arduino
10. สร้างโปรแกรมรุ่นที่สองบน Android สำหรับการประกอบอุปกรณ์ทั้งหมด
4 การเชื่อมต่อเซ็นเซอร์
โครงการใช้บางไลบรารีที่รวมอยู่ใน มีความจำเป็นต้องตรวจสอบความพร้อมของพวกเขา การกำหนดค่าเริ่มต้นของไลบรารีเหล่านี้มีดังนี้:
// DS18B20
#include
#include
#define ONE_WIRE_BUS 5 // DS18B20 บนพิน D5
OneWire oneWire (ONE_WIRE_BUS);
DallasTemperature DS18B20 (& oneWire);
int soilTemp = 0;
// DHT
#include "DHT.h"
#include
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT dht (pinoDHT, tipoDHT);
int airTemp = 0;
int airHum = 0;
// LDR (Light)
#define ldrPIN 1
int light = 0;
// ความชื้นในดิน
#define soilHumPIN 0
int soilHum = 0;
ตอนนี้เราเริ่มต้นเซ็นเซอร์ของเราและแสดงใน terminal:
การตั้งค่าเป็นโมฆะ ()
{
Serial.begin (9600);
DS18B20.begin ();
dht.begin ();
}
เป็นโมฆะห่วง ()
{
readSensors ();
displaySensors ();
ล่าช้า (10,000);
}
และในที่สุดเราจะเขียนสองฟังก์ชั่น: หนึ่งอ่านการอ่านจากเซ็นเซอร์และอื่น ๆ จะแสดงบนหน้าจอ:
/ ********* อ่านค่าเซ็นเซอร์ ************* /
เป็นโมฆะ readSensors (เป็นโมฆะ)
{
airTemp = dht.readTemperature ();
airHum = dht.readHumidity ();
DS18B20.requestTemperatures ();
soilTemp = DS18B20.getTempCByIndex (0); // เซ็นเซอร์ 0 จะจับภาพ Soil Temp ใน Celcius
soilHum = แผนที่ (อะนาล็อกอ่าน (soilHumPIN), 1023, 0, 0, 100);
ไฟ = แผนที่ (อะนาล็อกอ่าน (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> สว่าง 100%
}
/ ********* ค่าเซ็นเซอร์แสดงผล ************* /
โมฆะ displaySensors (เป็นโมฆะ)
{
Serial.print ("airTemp (oC):");
อนุกรม. println (airTemp);
Serial.print ("airHum (%):");
อนุกรม. println (airHum);
Serial.print ("soilTemp (oC):");
อนุกรม. println (soilTemp);
Serial.print ("soilHum (%):");
อนุกรม. println (soilHum);
Serial.print ("light (%):");
อนุกรม. println (แสง);
Serial.println ("");
}
ภาพถ่ายแสดงวิธีการแสดงข้อมูลบนหน้าจอ
สามารถดาวน์โหลดซอร์สโค้ดได้จากผู้แต่ง
4 ESP8266-01 การกำหนดค่าพื้นฐาน
วิธีที่เร็วที่สุดในการ "พูดคุย" กับโมดูลคือคำสั่ง AT โปรเซสเซอร์มีโปรเซสเซอร์ประมวลผลคำสั่ง AT อยู่แล้ว โดยค่าเริ่มต้นโมดูลมาพร้อมกับการตั้งค่าจากโรงงานที่ 115200 บอดคุณจะต้องตั้งค่า 9600 บอดในการตั้งค่า
ประการแรกคุณต้องเชื่อมต่อโมดูลดังแสดงในรูป
( โปรดทราบว่าเทอร์มินัล Tx ของ ESP-01 เชื่อมต่อกับเทอร์มินัล Tx ของ UNO เช่นเดียวกับเทอร์มินัล Rx ที่เชื่อมต่อกัน การเชื่อมต่อนี้จะมีการเปลี่ยนแปลงในภายหลัง ).
จากนั้นเชื่อมต่อ UNO กับคอมพิวเตอร์เปิด IDE และดาวน์โหลดตัวอย่างที่อยู่ นี่เป็นรหัสว่างเปล่าเพื่อให้ไม่มีข้อขัดแย้งระหว่าง ESP-01 และ UNO รหัสนี้ถูกอัปโหลดไปยัง Ardunio ก่อนที่จะเชื่อมต่อ ESP-01 กับมันเพื่อให้แน่ใจว่า Ardunio จะไม่ใช้หมุด Tx และ Rx สำหรับสิ่งอื่นใด
ตอนนี้คุณต้องเปิด IDE Serial Monitor ให้ตั้งค่า baud rate เป็น 115200 ในการตั้งค่าและส่งคำสั่ง AT ไปยัง IDE Serial Monitor ESP-01 ควรส่งคำตอบตกลง
ตอนนี้คุณต้องเปลี่ยนอัตราข้อมูลในโมดูล ESP-01 ในการทำสิ่งนี้ใน IDE ให้คำสั่ง
AT + CIOBAUD = 9600
อาจเกิดขึ้นว่า ESP-01 กลับสู่การตั้งค่าจากโรงงานจากนั้นคุณจะต้องใช้คำสั่งอื่น:
AT + UART_DEF = , , , ,
ตัวอย่างเช่น 9600 baud / 8 data bits / 1 stop bits และไม่มี parity และ flow control
AT + UART_DEF = 9600,8,1,0,0
ตอนนี้เปลี่ยนอัตราการถ่ายโอนข้อมูลในการตั้งค่า IDE เป็น 9600 และส่งคำสั่ง AT การตอบสนองตกลงควรมา
ถัดไปคุณต้องสลับโมดูลเป็นโหมด STA เพื่อให้สามารถเชื่อมต่อกับจุดเชื่อมต่อเครือข่ายของคุณ
AT + CWMODE = 1
สำหรับโมดูลที่จะเชื่อมต่อกับเครือข่ายให้ป้อนคำสั่ง AT + CWJAP = "network_name", "network_name_1"ที่ไหน network_name เป็นชื่อเครือข่ายของคุณและ network_name_1 - รหัสผ่านสำหรับเครือข่ายของคุณ (รหัสผ่านและชื่อเครือข่ายจะต้องอยู่ในเครื่องหมายคำพูด)
ถ้าเห็นคำตอบ เชื่อมต่อ WIFI WIFI GOT IPจากนั้นทำการเชื่อมต่อ ตรวจสอบที่อยู่ IP ด้วยคำสั่ง
AT + CIFSR
. ที่อยู่ที่ปรากฏในจอภาพของคุณคุณสามารถใช้ในอนาคต เมื่อคุณกำหนดค่าโมดูลแล้วคุณสามารถเชื่อมต่อได้อย่างถาวร แต่คุณต้องเปลี่ยนวงจรสวิตชิ่งตามที่แสดงในรูป
• ESP-01 RX (สีเหลือง) -> UNO Pin D7
• ESP-01 TX (สีส้ม) -> UNO Pin D6
• ESP-01 Ch-Pd (สีน้ำตาล) -> Vcc (3.3V)
•รีเซ็ต ESP-01 (สีน้ำเงิน) -> UNO Pin D8
• ESP-01 Vcc (สีแดง) -> 3.3V
• ESP-01 Gnd (สีดำ) -> UNO GND
โปรดทราบว่าไลบรารี Software Serial ใช้พิน UNO Pin D7 เช่น TX และมันเชื่อมต่อกับเอาท์พุทของ ESP-01 RXในขณะที่ UNO Pin D6 เช่น rxเชื่อมต่อกับ ESP-01 เท็กซัส.
ป้อนรหัสขนาดเล็กเพื่อตรวจสอบการเชื่อมต่อและการกำหนดค่าที่ถูกต้องของโมดูล ESP-01
#include
ซอฟต์แวร์อนุกรม esp8266 (6.7); // Rx ==> ขา 6; TX ==> Pin7
#define speed8266 9600
การตั้งค่าเป็นโมฆะ ()
{
esp8266.begin (ความเร็ว 8266);
Serial.begin (ความเร็ว 8266);
Serial.println ("การทดสอบการติดตั้ง ESP8266 - ใช้ AT coomands");
}
เป็นโมฆะห่วง ()
{
ในขณะที่ (esp8266.available ())
{
Serial.write (esp8266.read ());
}
ในขณะที่ (Serial.available ())
{
esp8266.write (Serial.read ());
}
}
ตอนนี้มีทีม AT ไม่กี่คน ดูผลลัพธ์ในการตรวจสอบพอร์ตอนุกรม
* AT =====> ESP8266 ส่งคืนตกลง
* AT + RST =====> ESP8266 รีสตาร์ทและส่งคืน OK
* AT + GMR =====> ESP8266 ส่งคืน AT เวอร์ชัน; รุ่น SDK; ID; ตกลง
* AT + CWMODE? => ESP8266 ส่งคืนชนิดโหมด
* AT + CWLAP ===> ESP8266 จะส่งกลับจุดเชื่อมต่อใกล้
* AT + CIFSR ===> ESP8266 คืนค่า IP ที่ออกแบบไว้
สามารถดาวน์โหลดรหัสโปรแกรมได้ที่
6 การเชื่อมต่อของเซ็นเซอร์และ ESP-01
หลังจากเชื่อมต่อและตรวจสอบเซ็นเซอร์ทั้งหมดแล้วรวมทั้งตรวจสอบโมดูล ESP-01 จำเป็นต้องเตรียมข้อมูลสำหรับส่งไปยังอินเทอร์เน็ต
7 สิ่งที่พูด
หนึ่งในส่วนที่สำคัญที่สุดของโครงการคือแพลตฟอร์ม IoT แบบเปิดซึ่งจะช่วยให้คุณสามารถรวบรวมข้อมูลจากเซ็นเซอร์ประมวลผลและวิเคราะห์ได้ ในการทำเช่นนี้ไปที่และสร้างบัญชีของคุณ ถัดไปคุณต้องสร้างช่องที่จะมีแอคทูเอเตอร์ 2 ตัวเซ็นเซอร์ 5 ตัวและฟิลด์สำรองข้อมูลหนึ่งฟิลด์
•ฟิลด์ 1: แอคชูเอเตอร์ 1 (อุปกรณ์ 1)
•ฟิลด์ 2: แอคทูเอเตอร์ 2 (อุปกรณ์ 2)
•ฟิลด์ที่ 3: อุณหภูมิอากาศในหน่วย oC (อุณหภูมิอากาศเป็นหน่วยองศาเซลเซียส)
•ยื่น 4: ความชื้นสัมพัทธ์อากาศเป็น% (ความชื้นสัมพัทธ์เป็น%)
•ฟิลด์ที่ 5: อุณหภูมิดินใน oC (อุณหภูมิดินในหน่วยองศาเซลเซียส)
•ฟิลด์ที่ 6: ความชื้นในดินเป็น% (ความชื้นของดินเป็น%)
•ฟิลด์ 7: ความส่องสว่างเป็น% (สว่างเป็น%)
•สนามที่ 8: สำรอง
เขตข้อมูล 8 ถูกสงวนไว้สำหรับการขยายในอนาคตหรือสำหรับการดีบัก ในโครงการนี้จะใช้เป็นตัวนับข้อผิดพลาดการสื่อสารระหว่าง Arduino / ESP-01 และ ThingSpeak.com
เมื่อคุณสร้างช่องสถานะแล้วคุณจะต้องบันทึกคีย์ดังที่แสดงในภาพถ่าย
8 การส่งสถานะเซ็นเซอร์ไปยังคลาวด์
ในขณะนี้เรามีบริการคลาวด์ที่กำหนดค่าไว้แล้วและเซ็นเซอร์ของเราจะรวบรวมข้อมูลในพื้นที่ ตอนนี้คุณต้องใช้ข้อมูลนี้และส่งไปยังคลาวด์บน ThingSpeak.com
ในการเขียนข้อมูลไปยังช่องทาง ThingSpeak คุณต้องส่งสตริง GET จะทำในสามขั้นตอน
ส่งคำสั่ง "Start cmd"
AT + CIPSTART = "TCP", "184.106.153.149", 80
ความยาวของสตริงเพิ่มเติม
AT + CIPSEND = 116
และในที่สุดสตริง GET ที่จะเขียนข้อมูลของเราในช่องสถานีสถานะที่สงวนไว้
รับ / อัปเดต Api_key = your_saved_key_here & field1 = pump & fieldlamp = 0 & field3 = airTemp & field4 = airHum & field5 = soilTemp & field6 = soilHum & field7 = light & field8 = อะไหล่
โปรดทราบว่าเราไม่ควรเขียนข้อมูลลงในช่องมากกว่า 1 ครั้งใน 16 วินาที
รหัสที่ส่งจะทำทั้งหมดนี้
// Thingspeak
String statusChWriteKey = "คีย์เขียนของคุณที่นี่"; // ช่องสถานะ id: 385184
#include
ซอฟต์แวร์อนุกรมอนุกรม (6, 7); // Rx, Tx
#define HARDWARE_RESET 8
// DS18B20
#include
#include
#define ONE_WIRE_BUS 5 // DS18B20 บนพิน D5
OneWire oneWire (ONE_WIRE_BUS);
DallasTemperature DS18B20 (& oneWire);
int soilTemp = 0;
// DHT
#include "DHT.h"
#include
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT dht (pinoDHT, tipoDHT);
int airTemp = 0;
int airHum = 0;
// LDR (Light)
#define ldrPIN 1
int light = 0;
// ความชื้นในดิน
#define soilHumPIN 0
int soilHum = 0;
// ตัวแปรที่จะใช้กับตัวจับเวลา
long writeTimingSeconds = 17; // ==> กำหนดเวลาตัวอย่างเป็นวินาทีเพื่อส่งข้อมูล
startWriteTiming ยาว = 0;
ยาว elapsedWriteTime = 0;
// ตัวแปรที่จะใช้กับแอคชูเอเตอร์
บูลีนปั๊ม = 0;
บูลีน lamp = 0;
int อะไหล่ = 0;
ข้อผิดพลาดบูลีน;
การตั้งค่าเป็นโมฆะ ()
{
Serial.begin (9600);
pinMode (HARDWARE_RESET, OUTPUT);
digitalWrite (HARDWARE_RESET, HIGH);
DS18B20.begin ();
dht.begin ();
EspSerial.begin (9600); // Comunicacao com Modulo WiFi
EspHardwareReset (); // รีเซ็ตเป็น Modulo WiFi
startWriteTiming = millis (); // เริ่มต้น "นาฬิกาโปรแกรม"
}
เป็นโมฆะห่วง ()
{
start: // label
ข้อผิดพลาด = 0;
elapsedWriteTime = millis () - startWriteTiming;
if (elapsedWriteTime> (writeTimingSeconds * 1000))
{
readSensors ();
writeThingSpeak ();
startWriteTiming = millis ();
}
if (error == 1) // ส่งอีกครั้งหากการส่งไม่สมบูรณ์
{
Serial.println ("<<<< ข้อผิดพลาด >>>>");
ความล่าช้า (2000);
เริ่มต้นแล้ว; // ไปที่ป้ายกำกับ "เริ่มต้น"
}
}
/ ********* อ่านค่าเซ็นเซอร์ ************* /
เป็นโมฆะ readSensors (เป็นโมฆะ)
{
airTemp = dht.readTemperature ();
airHum = dht.readHumidity ();
DS18B20.requestTemperatures ();
soilTemp = DS18B20.getTempCByIndex (0); // เซ็นเซอร์ 0 จะจับภาพ Soil Temp ใน Celcius
ไฟ = แผนที่ (อะนาล็อกอ่าน (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> สว่าง 100%
soilHum = แผนที่ (อะนาล็อกอ่าน (soilHumPIN), 1023, 0, 0, 100);
}
/ ********* Conexao com TCP com Thingspeak ******* /
เป็นโมฆะ writeThingSpeak (เป็นโมฆะ)
{
startThingSpeakCmd ();
// เตรียมสตริง da ดารับ
String getStr = "GET / update? Api_key =";
getStr + = statusChWriteKey;
getStr + = "& field1 =";
getStr + = สตริง (ปั๊ม);
getStr + = "& field2 =";
getStr + = สตริง (หลอด);
getStr + = "& field3 =";
getStr + = สตริง (airTemp);
getStr + = "& field4 =";
getStr + = สตริง (airHum);
getStr + = "& field5 =";
getStr + = สตริง (soilTemp);
getStr + = "& field6 =";
getStr + = สตริง (soilHum);
getStr + = "& field7 =";
getStr + = สตริง (ไฟ);
getStr + = "& field8 =";
getStr + = สตริง (สำรอง);
getStr + = "\ r \ n \ r \ n";
sendThingSpeakGetCmd (getStr);
}
/ ********* รีเซ็ต ESP ************* /
โมฆะ EspHardwareReset (เป็นโมฆะ)
{
Serial.println ("การรีเซ็ต ....... ");
digitalWrite (HARDWARE_RESET, LOW);
ล่าช้า (500);
digitalWrite (HARDWARE_RESET, HIGH);
ดีเลย์ (8000); // Tempo จำเป็นต้องมีการปรับปรุง
Serial.println ("RESET");
}
/ ********* เริ่มการสื่อสารกับ ThingSpeak ************* /
เป็นโมฆะ startThingSpeakCmd (เป็นโมฆะ)
{
EspSerial.flush (); // limpa o buffer antes de começar a gravar
String cmd = "AT + CIPSTART = \" TCP \ ", \" ";
cmd + = "184.106.153.149"; // Endereco IP de api.thingspeak.com
cmd + = "\", 80 ";
EspSerial.println (cmd);
Serial.print ("enviado ==> Start cmd:");
อนุกรม. println (cmd);
if (EspSerial.find ("ข้อผิดพลาด"))
{
Serial.println ("ข้อผิดพลาด AT + CIPSTART");
กลับ;
}
}
/ ********* ส่ง GET cmd ไปที่ ThingSpeak ************* /
String sendThingSpeakGetCmd (String getStr)
{
String cmd = "AT + CIPSEND =";
cmd + = สตริง (getStr.length ());
EspSerial.println (cmd);
Serial.print ("enviado ==> lenght cmd:");
อนุกรม. println (cmd);
if (EspSerial.find ((char *) ">"))
{
EspSerial.print (getStr);
Serial.print ("enviado ==> getStr:");
Serial.println (getStr);
หน่วงเวลา (500); // จังหวะการประมวลผลสำหรับการรับ, การหน่วงเวลาหมายถึงไม่ว่างไม่ให้แสดงผล
String messageBody = "";
ในขณะที่ (EspSerial.available ())
{
สายสตริง = EspSerial.readStringUntil ('\ n');
if (line.length () == 1)
{// เนื้อหาจริงเริ่มต้นหลังจากบรรทัดว่าง (ที่มีความยาว 1)
messageBody = EspSerial.readStringUntil ('\ n');
}
}
Serial.print ("ได้รับ MessageBody:");
Serial.println (messageBody);
ส่งคืนข้อความร่างกาย;
}
อื่น
{
EspSerial.println ("AT + CIPCLOSE"); // แจ้งเตือนผู้ใช้
Serial.println ("ESP8266 ข้อผิดพลาดของ CIPSEND: RESENDING"); // ส่งซ้ำ ...
ว่าง = อะไหล่ + 1;
ข้อผิดพลาด = 1;
ส่งคืน "ข้อผิดพลาด";
}
}
คุณสามารถเห็นความคืบหน้าในการตรวจสอบแบบอนุกรม
สามารถดาวน์โหลดซอร์สโค้ดได้ที่
9 android app - ตอนที่หนึ่ง
ก่อนอื่นคุณต้องสร้างส่วนต่อประสานผู้ใช้ ภาพแสดงองค์ประกอบหลักที่มองเห็นและมองไม่เห็น
หลังจากนั้นคุณต้องสร้างบล็อก รายการเมนูตรงกับหมายเลขสกรีนช็อต
1 ตัวแปรสถานะที่ควรประกาศเป็นโกลบอล
2 ทุก ๆ สองวินาที (ขึ้นอยู่กับ Clock1) กระบวนการจะถูกเรียก "ReadArduino"
โพรซีเดอร์ส่งคืนค่าของตัวแปรที่ควรแสดงบนหน้าจอ ในกรณีนี้ค่าสถานะ (0 และ 1) สำหรับแอคทูเอเตอร์จะถูกแปลงเป็น "เปิด" และ "ปิด" เพื่อการรับรู้ที่ดีขึ้น
ค่าเหล่านี้ (สถานะ) จะแสดงใน "ทางลัด" ที่เกี่ยวข้อง
3 รูทีน readArduino เป็นหลักจะอ่านช่องสถานะใน ThingSpeak ดังนั้นคุณต้องระบุ URL ที่จะถูกส่งไปยัง Thingspeak ในการทำสิ่งนี้ตัวแปรโกลบอล 3 ตัวจะต้องประกาศและรวมกันเพื่อสร้าง URL ที่จะถูกส่งไปยัง ThingSpeak GET ควรถูกส่งไปยังองค์ประกอบของเว็บที่เรียกว่า «ArduFarmBotStatusCh»
4 ข้อความที่ได้รับจากคำสั่งก่อนหน้าจะมาถึงในรูปแบบ JSon ข้อความนี้ต้องถูกประมวลผลเพื่อให้แต่ละฟิลด์อ่านและเก็บไว้ในตัวแปรโกลบอลที่สอดคล้องกัน
5 สิ่งสุดท้ายที่ต้องทำคือเรียกขั้นตอน“ Alarm” ซึ่งจะวิเคราะห์สถานะของเซ็นเซอร์ดินสองตัว หากอุณหภูมิต่ำเกินไป (ในกรณีของเรา 10oC) ข้อความจะปรากฏขึ้น เช่นเดียวกันกับความชื้นหากต่ำกว่า 60%
โปรดทราบว่าเราได้กำหนดตัวจับเวลาอื่น (Clock2) ซึ่งตั้งโปรแกรมให้ทำงานทุกวินาที จำเป็นเพียงเพื่อ "เปลี่ยน" สีของข้อความ (จากสีขาวเป็นสีแดง) ข้อความจะกระพริบ
สามารถดาวน์โหลดรหัสแอปพลิเคชันได้ที่
10 การเชื่อมต่อของแอคทูเอเตอร์
คำสั่งสำหรับการเปิดและปิดเครื่องสูบน้ำและหลอดไฟจะได้รับจากระยะไกล เอาท์พุทของ Ardunio จะเปิดใช้งานรีเลย์และ LED โดยใช้คำสั่งเหล่านี้ ภาพแสดงวิธีการเชื่อมต่อแอคชูเอเตอร์ โปรดทราบว่าเอาต์พุตรีเลย์ GND ไม่เชื่อมต่อ ไปยังเอาท์พุท GNDUNO วิธีนี้จะมีการรบกวนพลังงานน้อยลงเมื่อรีเลย์กำลังทำงาน
11 การกำหนดค่าของตัวกระตุ้นช่อง (Actuators Channels)
การกระทำทั้งหมดทำซ้ำขั้นตอนการกำหนดค่าสถานะช่อง มีความจำเป็นต้องสร้างสองช่องสำหรับแต่ละอุปกรณ์ สำหรับแต่ละช่องให้เขียนรหัสช่อง, ปุ่มอ่านและเขียน เราจะเขียนเฉพาะในฟิลด์แรกของแต่ละช่อง ตัวอย่างเช่น
รหัสช่อง 375598 ==> LED สีแดง (ปั๊ม)
◦ Field1 = 0 ==> ปิดปั๊ม
◦ Field1 = 1 ==> เปิดปั๊ม
2. Channel ID 375599 ==> LED สีเขียว (หลอด)
◦ Field1 = 0 ==> ปิดหลอดไฟ
◦ Field1 = 1 ==> เปิดหลอดไฟ
11 การโหลดและการทดสอบตัวกระตุ้นรหัสใน Ardunio
เมื่อเราส่งข้อมูลไปยังคลาวด์เรา“ เขียน” ข้อมูลนี้ไปยัง ThingSpeak ช่องสถานะ“ ส่ง” (อัปโหลด) ข้อมูลนี้ ตอนนี้เราต้อง“ อ่าน” ข้อมูลจากช่อง Actuator“ ยอมรับ” (ดาวน์โหลด) ข้อมูลนี้
ในการทำเช่นนี้ให้ส่งสตริง GET และขั้นตอนนี้ประกอบด้วย 3 ขั้นตอน
"เริ่ม cmd"
AT + CIPSTART = "TCP", "184.106.153.149", 80
ความยาวสาย
AT + CIPSEND = 36
และรับสตริงตัวเอง
GET / ช่อง / 375598 / ช่อง / 1 / ครั้งสุดท้าย
แชแนลจะ“ อ่าน” ทุก 10 วินาที
หลังจากส่ง GET เราต้องยอมรับคำตอบจาก ThingSpeak คำตอบจะต้องเป็น 0 หรือ 1 สำหรับแต่ละช่อง หากมีค่าอื่นใดเราก็จะเพิกเฉยต่อค่านั้น ๆ
ความแตกต่างที่สำคัญระหว่างชิ้นส่วนนี้และชิ้นส่วนก่อนหน้านั้นมีเฉพาะในฟังก์ชั่นเท่านั้น readThingSpeak (String channelID)
ด้านล่างเป็นรหัสที่ใช้ในการดำเนินการตามที่อธิบายไว้
// Thingspeak
String canalID1 = "999999"; // Actuator1
String canalID2 = "999999"; // Actuator2
#include
ซอฟต์แวร์อนุกรมอนุกรม (6, 7); // Rx, Tx
#define HARDWARE_RESET 8
// ตัวแปรที่จะใช้กับตัวจับเวลา
readTimingSeconds ยาว = 10; // ==> กำหนดเวลาตัวอย่างเป็นวินาทีเพื่อรับข้อมูล
startReadTiming ยาว = 0;
ยาว elapsedReadTime = 0;
// รีเลย์
#define ACTUATOR1 10 // LED สีแดง ==> ปั๊ม
#define ACTUATOR2 12 // LED สีเขียว ==> หลอดไฟ
บูลีนปั๊ม = 0;
บูลีน lamp = 0;
int อะไหล่ = 0;
ข้อผิดพลาดบูลีน;
การตั้งค่าเป็นโมฆะ ()
{
Serial.begin (9600);
pinMode (ACTUATOR1, OUTPUT);
pinMode (ACTUATOR2, OUTPUT);
pinMode (HARDWARE_RESET, OUTPUT);
digitalWrite (ACTUATOR1, สูง); // o móduloreléé ativo em LOW
digitalWrite (ACTUATOR2, สูง); // o móduloreléé ativo em LOW
digitalWrite (HARDWARE_RESET, HIGH);
EspSerial.begin (9600); // Comunicacao com Modulo WiFi
EspHardwareReset (); // รีเซ็ตเป็น Modulo WiFi
startReadTiming = millis (); // เริ่มต้น "นาฬิกาโปรแกรม"
}
เป็นโมฆะห่วง ()
{
start: // label
ข้อผิดพลาด = 0;
elapsedReadTime = millis () - startReadTiming;
if (elapsedReadTime> (readTimingSeconds * 1000))
{
int คำสั่ง = readThingSpeak (canalID1);
if (command! = 9) pump = command;
ล่าช้า (5,000);
คำสั่ง = readThingSpeak (canalID2);
if (command! = 9) lamp = command;
takeActions ();
startReadTiming = millis ();
}
if (error == 1) // ส่งอีกครั้งหากการส่งไม่สมบูรณ์
{
Serial.println ("<<<< ข้อผิดพลาด >>>>");
ความล่าช้า (2000);
เริ่มต้นแล้ว; // ไปที่ป้ายกำกับ "เริ่มต้น"
}
}
/ ********* ดำเนินการตามคำสั่งของ ThingSpeak ************* /
ถือเป็นโมฆะ takeActions (เป็นโมฆะ)
{
Serial.print ("Pump:");
อนุกรม. println (ปั๊ม);
Serial.print ("Lamp:");
อนุกรม. println (หลอดไฟ);
if (pump == 1) digitalWrite (ACTUATOR1, LOW);
อื่น digitalWrite (ACTUATOR1, สูง);
ถ้า (lamp == 1) digitalWrite (ACTUATOR2, LOW);
อื่น digitalWrite (ACTUATOR2, สูง);
}
/ ********* อ่านคำสั่ง Actuators จาก ThingSpeak ************* /
int readThingSpeak (String channelID)
{
startThingSpeakCmd ();
คำสั่ง int;
// เตรียมสตริง da ดารับ
String getStr = "GET / channels /";
getStr + = channelID;
getStr + = "/ field / 1 / last";
getStr + = "\ r \ n";
String messageDown = sendThingSpeakGetCmd (getStr);
if (messageDown [5] == 49)
{
คำสั่ง = messageDown [7] -48;
Serial.print ("รับคำสั่งที่ได้รับ:");
Serial.println (คำสั่ง);
}
คำสั่งอื่น = 9;
คำสั่งส่งคืน;
}
/ ********* รีเซ็ต ESP ************* /
โมฆะ EspHardwareReset (เป็นโมฆะ)
{
Serial.println ("การรีเซ็ต ....... ");
digitalWrite (HARDWARE_RESET, LOW);
ล่าช้า (500);
digitalWrite (HARDWARE_RESET, HIGH);
ดีเลย์ (8000); // Tempo จำเป็นต้องมีการปรับปรุง
Serial.println ("RESET");
}
/ ********* เริ่มการสื่อสารกับ ThingSpeak ************* /
เป็นโมฆะ startThingSpeakCmd (เป็นโมฆะ)
{
EspSerial.flush (); // limpa o buffer antes de começar a gravar
String cmd = "AT + CIPSTART = \" TCP \ ", \" ";
cmd + = "184.106.153.149"; // Endereco IP de api.thingspeak.com
cmd + = "\", 80 ";
EspSerial.println (cmd);
Serial.print ("enviado ==> Start cmd:");
อนุกรม. println (cmd);
if (EspSerial.find ("ข้อผิดพลาด"))
{
Serial.println ("ข้อผิดพลาด AT + CIPSTART");
กลับ;
}
}
/ ********* ส่ง GET cmd ไปที่ ThingSpeak ************* /
String sendThingSpeakGetCmd (String getStr)
{
String cmd = "AT + CIPSEND =";
cmd + = สตริง (getStr.length ());
EspSerial.println (cmd);
Serial.print ("enviado ==> lenght cmd:");
อนุกรม. println (cmd);
if (EspSerial.find ((char *) ">"))
{
EspSerial.print (getStr);
Serial.print ("enviado ==> getStr:");
Serial.println (getStr);
หน่วงเวลา (500); // จังหวะการประมวลผลสำหรับการรับ, การหน่วงเวลาหมายถึงไม่ว่างไม่ให้แสดงผล
String messageBody = "";
ในขณะที่ (EspSerial.available ())
{
สายสตริง = EspSerial.readStringUntil ('\ n');
if (line.length () == 1)
{// เนื้อหาจริงเริ่มต้นหลังจากบรรทัดว่าง (ที่มีความยาว 1)
messageBody = EspSerial.readStringUntil ('\ n');
}
}
Serial.print ("ได้รับ MessageBody:");
Serial.println (messageBody);
ส่งคืนข้อความร่างกาย;
}
อื่น
{
EspSerial.println ("AT + CIPCLOSE"); // แจ้งเตือนผู้ใช้
Serial.println ("ESP8266 ข้อผิดพลาดของ CIPSEND: RESENDING"); // ส่งซ้ำ ...
ว่าง = อะไหล่ + 1;
ข้อผิดพลาด = 1;
ส่งคืน "ข้อผิดพลาด";
}
}
คุณสามารถดาวน์โหลดได้ที่
12 ส่งคำสั่งไปยังอุปกรณ์
ในขั้นตอนนี้เรามีแชแนลแอคทูเอเตอร์ที่กำหนดค่าไว้เพื่อเปลี่ยนค่าของฟิลด์ 1 สำหรับอุปกรณ์แต่ละชิ้น เราต้องตรวจสอบว่าอุปกรณ์ทำงานออกคำสั่งอย่างถูกต้อง ในตอนท้ายของโปรเจ็กต์จะมีการใช้แอปพลิเคชัน Android สำหรับสิ่งนี้ แต่สามารถทำได้ผ่านเบราว์เซอร์
เปิดปั๊ม (LED สีแดง)
https://api.thingspeak.com/update?api_key=Сохраненный_ключ_канала_1&field1=1
ปั๊มปิด (LED สีแดงดับ)
https://api.thingspeak.com/update?api_key=Saved Channel_key_1 & field1 = 0
เปิดไฟ (LED สีเขียวติด)
https://api.thingspeak.com/update?api_key=Saved Channel_key_2 & field1 = 1
ปิดหลอดไฟ (LED สีเขียวดับ)
https://api.thingspeak.com/update?api_key=Saved Channel_key_2 & field1 = 0
14 การสิ้นสุดโปรแกรม Android
ในส่วนก่อนหน้านี้มีโปรแกรมง่ายๆที่“ อ่าน” ข้อมูลจากช่องและแสดงบนหน้าจอ ตอนนี้เราต้องทำให้โปรแกรม "เขียน" คำสั่งใน Actuator Channal เพื่อให้คอนโทรลเลอร์สามารถอ่านคำสั่งเหล่านี้และหลอดไฟที่ปั๊มทำงานได้
เพื่อให้ผู้ใช้สามารถส่งคำสั่งแอปพลิเคชันจะมีสองปุ่มสำหรับแต่ละอุปกรณ์ หากเปิดใช้งานสีน้ำเงินถ้าปิดใช้งานจะเป็นสีแดง
ด้วยการคลิกปุ่มในแอปพลิเคชันคุณสามารถเห็นผลลัพธ์ในการตรวจสอบแบบอนุกรม
สามารถดาวน์โหลดรหัสได้ที่
15 การชุมนุมรอบชิงชนะเลิศ
ในขั้นตอนนี้จะมีแอพพลิเคชั่น Android ที่สมบูรณ์ซึ่งเป็นส่วนที่ "ประกอบ" อย่างสมบูรณ์ แต่ไม่มีรหัสในตัวควบคุมที่จะอ่านข้อมูลและส่งคำสั่งไปยังคลาวด์อย่างต่อเนื่อง คุณเพียงแค่ต้องรวมส่วนทั้งหมดของรหัสที่เขียนก่อนหน้านี้แน่นอนรหัสมีตัวเลือกการตรวจสอบเพิ่มเติม (ตัวอย่างเช่นถ้า ESP-01 ค้าง) เมื่อต้องการทำเช่นนี้ก่อนที่คำสั่ง read หรือ write แต่ละคำสั่ง AT จะถูกส่งและถ้าคำตอบที่ตกลงนั้นไม่ได้มาจากโมดูลแสดงว่าโมดูลนั้นถูกรีบูตโดยทางโปรแกรม
รหัสโครงการเต็มสามารถดาวน์โหลดได้ที่
ที่อยู่คุณสามารถรับการอัพเดทสำหรับไฟล์โปรแกรม
นอกจากนี้คุณยังสามารถอ่านความคิดเห็นในลิงค์ไปยังแหล่งที่มาหากสิ่งที่ไม่ชัดเจน