» อิเล็กทรอนิกส์ » Arduino »การจัดการเรือนกระจกหรือเรือนกระจกจากที่ใดก็ได้ในโลก (ตัวอย่างการนำไปปฏิบัติ)

การจัดการเรือนกระจกหรือเรือนกระจกจากที่ใดก็ได้ในโลก (ตัวอย่างการนำไปปฏิบัติ)

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 จะถูกส่งและถ้าคำตอบที่ตกลงนั้นไม่ได้มาจากโมดูลแสดงว่าโมดูลนั้นถูกรีบูตโดยทางโปรแกรม

รหัสโครงการเต็มสามารถดาวน์โหลดได้ที่

ที่อยู่คุณสามารถรับการอัพเดทสำหรับไฟล์โปรแกรม

นอกจากนี้คุณยังสามารถอ่านความคิดเห็นในลิงค์ไปยังแหล่งที่มาหากสิ่งที่ไม่ชัดเจน
8.3
8.6
8.4

เพิ่มความคิดเห็น

    • รอยยิ้มรอยยิ้มxaxaตกลงdontknowyahooNea
      นายรอยขีดข่วนคนโง่ใช่ใช่ใช่ก้าวร้าวลับ
      ขอโทษเต้นdance2dance3ให้อภัยช่วยเหลือเครื่องดื่ม
      หยุดเพื่อนดีgoodgoodนกหวีดหน้ามืดตามัวลิ้น
      ควันการตบมือเครย์ประกาศเป็นขี้ปากดอน t_mentionดาวน์โหลด
      ความร้อนโมโหlaugh1ภาคตะวันออกเฉียงเหนือประชุมmoskingเชิงลบ
      not_iข้าวโพดคั่วลงโทษอ่านทำให้ตกใจกลัวค้นหา
      ยั่วยุthank_youนี้to_clueumnikรุนแรงเห็นด้วย
      ไม่ดีbeeeblack_eyeblum3หน้าแดงโม้ความเบื่อ
      เซ็นเซอร์การหยอกล้อsecret2ขู่ชัยชนะYusun_bespectacled
      shokrespektฮ่า ๆprevedยินดีต้อนรับkrutoyya_za
      ya_dobryiผู้ช่วยne_huliganne_othodiFLUDห้ามใกล้

เราแนะนำให้คุณอ่าน:

มอบให้กับสมาร์ทโฟน ...