สร้าง Cloud Arduino ด้วย php & MySQL (ตอนที่ 2)
ตอนนี้จะมาย่อยกันเรื่อง โค้ดของ arduino ก่อน
Code ที่รวมจาก esp8266 2 ตัวมารวมกันในตัวเดียว
#include <Wire.h> #include <ArduinoJson.h> #include <ESP8266WiFi.h> #include <NTPClient.h> #include <WiFiUdp.h> #include <ESP8266HTTPClient.h> #include "DHT.h" #include <WiFiUdp.h> #include <Arduino.h> #include <Wire.h> // this #include still required because the RTClib depends on it #include "RTClib.h" #if defined(ARDUINO_ARCH_SAMD) // for Zero, output on USB Serial console, remove line below if using programming port to program the Zero! #define Serial SerialUSB #endif RTC_Millis rtc; // ----- แก้ค่า config 7 ค่าข้างล่างนี้ -------------------------------------------------------- //const char* ssid = "AndroidAP-PS"; //const char* password = "pwle0575"; const char* ssid = "true_home2G_F78"; // ชื่อ ssid const char* password = "96104427"; // รหัสผ่าน wifi const char* host = "keepgreen.samongthailand.com"; //const char* timestamp = "datetime"; #define DHTPIN1 D4 // GPIO2 ขาที่ต่อเข้ากับขา DATA (บางโมดูลใช้คำว่า OUT) ของ DHT #define DHTTYPE1 DHT11 // e.g. DHT11, DHT21, DHT22 #define DHTPIN2 D3 #define DHTTYPE2 DHT11 #define ECPIN A0 DHT dht1(DHTPIN1, DHTTYPE1); DHT dht2(DHTPIN2, DHTTYPE2); WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP); //int timestamp = "0"; String url; // ใช้สำหรับ โปรแกรมส่วนการส่ง int count = 0; int controlloop = 0; int ECVal = 0; //===================== void setup() { Serial.begin(115200); //=========== สำหรับการอ่านสถานะคำสั่ง led จาก server ====== delay(100); pinMode(D5, OUTPUT); pinMode(D6, OUTPUT); pinMode(D7, OUTPUT); digitalWrite(D5, 0); digitalWrite(D6, 0); digitalWrite(D7, 0); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } digitalWrite(D5, 0); digitalWrite(D6, 0); digitalWrite(D7, 0); //delay(10); //===== สิ้นสุด void setup สำหรับ การอ่านสถานะ led จาก server ====== //==== เริ่ม setup สำหรับ การส่งข้อมูลขึ้น server ===== rtc.begin(DateTime(F(__DATE__), F(__TIME__))); //delay(100); dht1.begin(); dht2.begin(); timeClient.begin(); // เตรียม เวลาสำหรับ time stamp } void loop() { // getPCtime(); // === void loop for led status reading === Serial.print("connecting to "); Serial.println(host); WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } if (count == 0){ url = "/api/led/read_all.php?id=1"; count = count + 1; Serial.println("Here1"); } else if (count == 1){ url = "/api/led/read_all.php?id=2"; count = count + 1; Serial.println("Here2"); } else if (count == 2){ url = "/api/led/read_all.php?id=3"; count = count + 1; Serial.println("Here3"); } Serial.print("Requesting URL: "); Serial.println(url); client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(200); String section="header"; while(client.available()){ String line = client.readStringUntil('\r'); //Serial.print(line); // we’ll parse the HTML body here if (section=="header") { // headers.. if (line=="\n") { // skips the empty space at the beginning section="json"; } } else if (section=="json") { // print the good stuff section="ignore"; String result = line.substring(1); // Parse JSON int size = result.length() + 1; char json[size]; result.toCharArray(json, size); StaticJsonBuffer<700> jsonBuffer; JsonObject& json_parsed = jsonBuffer.parseObject(json); if (!json_parsed.success()) { Serial.println("parseObject() failed"); return; } //String led = json_parsed["led"][0]["status"]; String led1 = json_parsed["led"][0]["status"]; String led2 = json_parsed["led"][1]["status"]; String led3 = json_parsed["led"][2]["status"]; // string led = json_parsed["table name""][array number]["value of filed"] //if(count == 1){ if(led1 == "on"){ digitalWrite(D5, 1); delay(10); Serial.println("D5 is On..!"); } else if(led1 == "off"){ digitalWrite(D5, 0); delay(10); Serial.println("D5 is Off..!"); } //} //else if(count == 2){ if(led2 == "on"){ digitalWrite(D6, 1); delay(10); Serial.println("D6 is On..!"); } else if(led2 == "off"){ digitalWrite(D6, 0); delay(10); Serial.println("D6 is Off..!"); } //} //else if(count == 3){ if(led3 == "on"){ digitalWrite(D7, 1); delay(10); Serial.println("D7 is On..!"); } else if(led3 == "off"){ digitalWrite(D7, 0); delay(10); Serial.println("D7 is Off..!"); } count = 0; //} if (count == 3) count = 0; } } Serial.println(); Serial.println("closing connection"); //delay(10); // == end of void for led status === if (controlloop == 2){ // count 2 loop before datalogger 1 loop = 7 second timeClient.update(); String timestamp = timeClient.getFormattedTime(); float h1 = dht1.readHumidity(); float t1 = dht1.readTemperature(); float h2 = dht2.readHumidity(); float t2 = dht2.readTemperature(); float EC = analogRead(ECPIN); ECVal = EC*100/1024; Serial.println("EC value = " + String(ECVal)); if (isnan(h1) || isnan(t1) || isnan(h2) || isnan(t2)) { Serial.println("Failed to read from DHT sensor"); if (isnan(h1)|| isnan(t1)){Serial.println("DHT1 failed");} if (isnan(h2)|| isnan(t2)){Serial.println("DHT2 failed");} return; } Serial.print("connecting to "); Serial.println(host); if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } String url = "/api/weather/insert.php?temperature=" + String(t1) + "&humidity=" + String(h1) + "&pressure=" + String(ECVal) +"&time_stamp=" + String(timestamp); Serial.print("Resquesting URL: "); Serial.println(url); client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(100); while(client.available()){ String line = client.readStringUntil('\r'); Serial.print(line); } Serial.println(); Serial.println("closing connection"); delay(10); controlloop=0; } controlloop=controlloop+1; }
ส่วนนี้คือ ส่วนที่อยู่ก่อน void setup()
#include <ESP8266WiFi.h> นี่ต้องมีเลยสำหรับ บอร์ด ESP8266 แล้วเอามาจากไหน ก็ต้องาวน์โหลด และวางไว้ก่อนอัพโหลดโค้ดลง บอร์ด (ไว้ค่อยอธิบายอีกที )
#include <NTPClient.h> นี่เตรียมไว้ก่อน ไว้จัดการเรื่อง เวลามาตรฐาน สำหรับการอ่าน timestamp ในการบันทึกข้อมูล เพราะจำเป็นที่จะต้องลงเวลาด้วย
// พวกนี้คือคอมเม้นท์
บาง libraly ก็ซ้ำมา เอาออกบ้างก็ได้ครับ
#include “DHT.h” นี่ก็จำเป็น
#include <Wire.h> นี่เอาไว้เรื่องจอ Cryltal แต่รอบนี้ยังไม่ลอง
#include “RTClib.h” นี่ก็เรื่อง เวลา
นี่เรียกใช้ function เวลา
อันนี้คือ ชื่อ WiFi บ้านใครก็บ้านใคร และ password ด้วย ผมลืมเอาออกก่อนส่ง แต่ไม่เป็นไร จะใช้ก็มาหน้าบ้านผมละกัน
ส่วนชื่อโเมนนี่ก็ตั้งให้ตรง หรืออาจะใช้ subdomain หรือใช้ IP address หากทดสอบในวงเดียวกัน หรือใช้ VPS
DHTPIN ต่อขา D4 และเรียกใช้ Libraly ระบุประเภท DHT บางคนอาจจะใช้ DHT22 หากระบุไม่ตรงก็อ่านค่าคนละเรื่องเลย หรือไม่อ่านด้วยซ้ำ ลองดูได้ครับ
ส่วนสองบรรทัดหลังนั่น เรื่อง ต่อ wifi และ เรื่องเวลา