สร้าง 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 และ เรื่องเวลา

Leave a Reply

Your email address will not be published.