ESP8266-Arduino Nano-Serial Data-Data logger
การเชื่อมต่อ สื่อสารระหว่าง ESP8266 กับ Arduino นอกจากจะทำการสื่อสารด้วย I2C แล้ว ยังสามารถสื่อสารด้วย Serial โดยการใช้ Software Serial
ตัวอย่างการใช้งาน
- ใช้ ESP8266 เพียวตัวเดียว
- ใช้ Arduino Nano เพียงตัวเดียว เพื่อวัดสัญญาณ Analog A0-A7, และ วัด อุณหภูมิและความชื้นด้วย AM2302 ที่จะให้ค่าวัดออกมาอีก 2 รายการ
ครั้งก่อน เราทำการทดสอบการอ่านข้อมูลด้วย I2C ในครั้งนี้จะมาลองการสื่อสารอนุกรม
การเชื่อมต่อ
Arduino Nano ESP8266
D11 D5
D10 D6
ขออภัยครับ บนบอร์ดทดลอง มีแุปกรณ์อื่นๆ ที่ไม่เกี่ยวกับเรื่องนี้มาเกะกะตาด้วย
///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //Libraries #include <Wire.h> #include <ESP8266WiFi.h> //// #include <SoftwareSerial.h> SoftwareSerial chat(D5, D6); // RX, TX ///// #include <math.h> //====== #include <Adafruit_Sensor.h> #include <DHT.h> // กรณีนี้ต้องใช้คู่กันกับ DHT_U.h #include <DHT_U.h> #define DHTPIN 6 // Pin which is connected to the DHT sensor. // Uncomment the type of sensor in use: //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT_Unified dht(DHTPIN, DHTTYPE); uint32_t delayMS; //// // //// char* host = "xxxxxx.com"; char* code = "xxxxx"; char* dID = "xx"; float dustDensity = 35; String response ="0"; String response_c = "0"; String a ; float temp_0 = 0; float tempF_0 = 0; float humid_0 = 0; float vHumidity = 0; float vTemperature = 0; String data1 ; String data2 ; // standard float data3 = 0; float data4 = 0; float data5 = 0; float data6 = 0; float data7 = 0; float data8 = 0; float data9 = 0; float data10 = 0; float data11 = 0; float data12 = 0; float data13 = 0; float data14 = 0; float data15 = 0; float data16 = 0; float data17 = 0; float data18 = 0; float data19 = 0; float data20 = 0; float temperatureC = 0; float temperatureF = 0; int counter = 1; int sentcount = 0; ///////////////////////////////////////////////////////////////////////////// void master_i2c_setup() { Wire.begin(); Serial.println("I2C Master Demonstration"); } ///////////////////////////////////////////////////////////////////////////// // Arduino setup function. /////////////// const char* ssid = "76/151"; const char* password = "xxxxxx"; const char* ssid1 = "76/151"; const char* password1 = "xxxxxx"; const char* ssid2 = "76/151"; const char* password2 = "xxxxxxx"; // Helper functions to print a data value to the serial monitor. void WiFisetup() { Serial.println(); Serial.print("Connecting to "); Serial.println(ssid1); WiFi.begin(ssid1, password1); delay(1000); if (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Failed to connected and WiFi setup "); WiFi.begin(ssid2, password2); delay(1000); if (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Failed to connected and WiFi setup "); } else{ ssid = ssid2; password = password2; } } else{ ssid = ssid1; password = password1; Serial.println(""); Serial.println("WiFi connected OK"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } } /// void AM2302_setup() { dht.begin(); Serial.println("DHTxx Unified Sensor Example"); // Print temperature sensor details. sensor_t sensor; dht.temperature().getSensor(&sensor); Serial.println("------------------------------------"); Serial.println("Temperature"); Serial.print ("Sensor: "); Serial.println(sensor.name); Serial.print ("Driver Ver: "); Serial.println(sensor.version); Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id); Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" *C"); Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" *C"); Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" *C"); Serial.println("------------------------------------"); // Print humidity sensor details. dht.humidity().getSensor(&sensor); Serial.println("------------------------------------"); Serial.println("Humidity"); Serial.print ("Sensor: "); Serial.println(sensor.name); Serial.print ("Driver Ver: "); Serial.println(sensor.version); Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id); Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println("%"); Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println("%"); Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println("%"); Serial.println("------------------------------------"); // Set delay between sensor readings based on sensor details. delayMS = sensor.min_delay / 1000; } /// void setup() { delay(10000); Serial.begin(9600); chat.begin(4800); delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFisetup(); //WiFi.begin(ssid1, password1); delay(1000); if (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Failed connected setup "); } else{ Serial.println(""); Serial.println("WiFi OK connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); // We start by connecting to a WiFi network } } int value = 0; void serverloop() { delay(1000); ++value; data1 = String(data1); data2 = String(data2); //AM2302_loop(); data3 = temp_0; data4 = humid_0; Serial.print("data1 rain mm = ");Serial.println(data1); Serial.print("data2 soil = ");Serial.println(data2); Serial.print("data3 temp = ");Serial.println(data3); Serial.print("data4 humid = ");Serial.println(data4); Serial.print("connecting to "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // We now create a URI for the request String url = "/api/insertData?device_id=" + String(dID)+"&code="+String(code)+"&data1=" +String(data1) +"&data2=" + String(data2)+"&data3=" +String(data3)+"&data4=" +String(data4)+"&data5=" +String(data5) +"&data6=" +String(data6)+"&data7=" +String(data7)+"&data8=" +String(data8)+"&data9=" +String(data9) +"&data10=" +String(data10)+"&data11=" +String(data11)+"&data12=" +String(data12)+"&data13=" +String(data13) +"&data14=" +String(data14)+"&data15=" +String(data15)+"&data16=" +String(data16)+"&data17=" +String(data17) +"&data18=" +String(data18)+"&data19=" +String(data19)+"&data20=" +String(data20); Serial.print("Requesting URL: "); Serial.println(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); //unsigned long timeout = millis(); delay(1000); while (client.available() == 0) { Serial.println(">>> Client Timeout !"); client.stop(); return; } // Read all the lines of the reply from server and print them to Serial while(client.available()) { String line = client.readStringUntil('\r'); //Serial.print(line); ถอดคอมเม้น? ออก เพื่อดูการตอบสนองจาก Server } Serial.println(); Serial.println("endloop server "); delay(1000); } //==== void loop() { if (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Failed to connected and WiFi setup "); WiFisetup(); } serial_loop(); serverloop(); data1 = ""; data2 = ""; } void serial_loop() { Serial.println("Please wait Serial.."); while (a == "") { chat.print("Input1"); a = chat.readString(); delay(100); Serial.print("."); } Serial.print(" Answer 1 ");Serial.println(a); data1 = String(a); delay(1000); a=""; while (a == "") { chat.print("Input2"); a = chat.readString(); delay(100); Serial.print("."); } Serial.print(" Answer 2 ");Serial.println(a); data2=String(a); a=""; }
และโค้ดสำหรับ Arduino Nano กรณีนี้ ทำการทดลองเพียง 2 input ที่ A0, A1
#include <EEPROM.h> #include <SoftwareSerial.h> SoftwareSerial chat(10, 11); // RX, TX int i; int sensorValue; float rainmm ; void setup() { Serial.begin(9600); chat.begin(4800); } void loop() { input1_loop(); input2_loop(); if (chat.readString()){ // chat.print(1); if(chat.readString()== "Input1"){ chat.print(String(sensorValue)); } if(chat.readString()== "Input2"){ chat.print(String(rainmm)); } Serial.print("Send = "); Serial.println(i); } i++; delay(1000); } void input1_loop() { // read the value from the sensor: sensorValue = analogRead(A0); //Serial.print(" Analog read := ");Serial.println(sensorValue); if (sensorValue > 580) { rainmm = 80.437-0.0977*sensorValue; } else { if (sensorValue > 509) { rainmm = 443.6-0.717*sensorValue; } else { if (sensorValue > 466) { rainmm = 903.74-1.6059*sensorValue; } else{ rainmm = 770.06-1.3314*sensorValue; } } } delay(1000); //answer=String(255); Serial.print("A0 signal : ");Serial.println(sensorValue); } void input2_loop() { // read the value from the sensor: sensorValue = analogRead(A0); //Serial.print(" Analog read := ");Serial.println(sensorValue); if (sensorValue > 580) { rainmm = 80.437-0.0977*sensorValue; } else { if (sensorValue > 509) { rainmm = 443.6-0.717*sensorValue; } else { if (sensorValue > 466) { rainmm = 903.74-1.6059*sensorValue; } else{ rainmm = 770.06-1.3314*sensorValue; } } } delay(1000); //answer=String(255); }
ขอบคุณ โค้ดที่มา (บางส่วน) จาก Myarduino.net
จากตัวอย่าง ESP8266 จะส่งคำสั่งขอค่า ผลลัพธ์ Input1, Input2 จาก Arduino Nano โดย Arduino Nano จะทำการวัดค่าและคำนวณต่างๆ ตามที่กำหนดในโปรแกรม แล้วทะยอยส่งค่าผ่านทาง Serial Port ที่กำหนดด้วย SoftwareSerial ได้อย่างง่ายดาย และแม่นยำ
ข้อดีของการสื่อสารวิธีนี้ คือ ลดค่าความเพี้ยนในการใช้ งาน WiFi บนบอร์ด ESP8266 โดยให้ค่าวัดที่แม่นยำ