Smart Farm by ESP12-F

เรามาลองใช้ข้าวของในท้องตลาดมาทำ Smart Farm กันดูบ้างครับ  โดยเน้นการปิดเปิดด้วย Timer หรือ ปุ่มกดก็ได้  โดยจะเริ่มจากการใช้ แอพ ตั้งเวลาปิดเปิดกันก่อน
มาลองดูหน้าตาของอุปกรณ์กันก่อนนะครับ   เป็นบอร์ดที่ซื้อมาจาก Lazada นี่เอง รวมทั้งมาลงตัวกับกล่องจาก Lazada เช่นกัน

บนบอร์ดมี  ESP-12F  และ Relay 4 ตัว   และบอร์ดนี้ยังสามารถจ่ายไฟเข้าได้ทั้ง 220 Vac,  7-30 Vdc จึงทำให้สะดวกที่จะใช้เป็นบอร์ดสำหรับการทดสอบสมาร์ทฟาร์ม

สำหรับบอร์ดนี้  ไม่มี port USB สำหรับการอัพโหลดโปรแกรม  สำเป็นต้องใช้   USB-UART-Shield มาต่อใช้เองโดยมีขั้นตอนดังนี้

  1. จาก TTL มายังบอร์ดต่อดังนี้ GND-GND, VCC5V-5V, RT-TX, TX-RX
  2. บนบอร์ด  ให้ทำการต่อ IO0 เข้ากับ GND  เพื่อทำการ อัพโหลดโปรแกรม  และถอดออกเมื่ออัพโหลดเสร็จแล้ว



การเขียนโปรแกรมอื่นๆ ที่เหลือ ก็ทำตามปกติ  โดยในตัวอย่างนี้จะทดลองโปรแกรมเล็กๆ กันก่อน
หลังอัพโหลดโปรแกรมเสร็จ เมื่อถอดสายจั๊มแล้วก็ Reset เพื่อให้โปรแกรมเริ่มทำงานใหม่อีกที  ก็เป็นอันว่าจบกระบวนการ

สำหรับโค้ด เราลองใช้โค้ดสำหรับ ESP32 โดยแก้ไขเรื่อง  ขา  เหลือเพียง 4 Relays  และ  WiFi  แก้ไขเป็น ESP8266WiFi.h ก็เป็นอันว่าใช้ได้

///////////////  Demo for ESP32 ///////////////////////
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <Arduino.h>
#include <Ticker.h>
#include <Wire.h>
#include <math.h>
#include <ArduinoJson.h>
#include <Arduino_JSON.h>
///============
#define  LED      0
const int Relay1 = 16;
const int Relay2 = 14;
const int Relay3 = 12;
const int Relay4 = 13;
const int SW = 2;
//===================
#include <Adafruit_Sensor.h>
//===========
const char* ssid      = "Asenal2021_2G";
const char* password  = "kb75699212";
//=====
const char* host = "otrixiot.com";
char* code = "xxxxxx";
char* dID = "xxx";
float data1,data2,data3,data4,data5,data6,data7,data8,data9,data10 ;
float data11,data12,data13,data14,data15,data16,data17,data18,data19,data20 ;
String led1 = "00:00";
String led2 = "00:00";
String led3 = "1";
String R1,R2,R3,R4,R5,R6,R7,R8 ;
String RR1,RR2,RR3,RR4,RR5,RR6,RR7,RR8 ;
//int counter = 1;
int i ;
int cnt = 10;           //ประกาศตัวแปรเป็น global
int sentcount = 0;
String url ;
//
String iddevice = dID;
String cccode = code;
String ccode =  code;
long lastMillis = 100;
//////////////////////////////////////////////////////////
void Aboutme()
{
  Serial.println("File name : GFM  ");
}
/////////////////////////////////////////////////////////
void WiFisetup()
{
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
  }
  delay(1500);
  if (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Failed to connected ssdi1 and WiFi setup ");
  }
  else{
  Serial.println("");
  Serial.println("WiFi connected OK");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  }
}
bool state = true;
void WiFiForwardSetup()
{
    // We start by connecting to a WiFi network
    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    /*
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    */
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
}
void setup()
{
  //WIFI Kit series V1 not support Vext control
  Serial.begin(115200);
  WiFisetup();
  //WiFiForwardSetup();
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
  pinMode(Relay3, OUTPUT);
  pinMode(Relay4, OUTPUT);
  pinMode(SW, INPUT);
}
void loop()
{
  data1 = random(15.5,75.5);
  data2 = random(17.5,19.5);
  data3 = random(19.5,21.5);
  data4 = random(21.5,23.5);
  data5 = random(33.5,35.5);
  data6 = random(45.5,47.5);
  data7 = random(17.5,19.5);
  data8 = random(19.5,21.5);
  data9 = random(21.5,23.5);
  data10 = random(23.5,25.5);
  data11 = random(25.5,27.5);
  data12 = random(27.5,29.5);
  data13 = random(29.5,31.5);
  data14 = random(31.5,33.5);
  data15 = random(33.5,35.5);
  data16 = random(35.5,37.5);
  data17 = random(37.5,39.5);
  data18 = random(39.5,41.5);
  data19 = random(41.5,43.5);
  data20 = random(43.5,45.5);
  if (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("Failed to connected and will restart WiFi setup ");
        WiFi.disconnect();
        WiFi.begin(ssid, password);
        WiFiForwardSetup();
  }
  Forward_loop();
  read_master_status_FromServer();
  digitalWrite(Relay1,1);
  digitalWrite(Relay3,1);
  Restart_loop();
}
///////////////////////////////////
int value = 0;
void Forward_loop()
{
    ++value;
    Serial.print("connecting to server Otrixiot .... ");
    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(iddevice)+"&code="+String(ccode)+"&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();
    while (client.available() == 0) {
        if (millis() - timeout > 5000) {
            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);
    }
    Serial.println();
    Serial.println("closing connection");
    delay(1000);
}
////  read  control ====
void read_master_status_FromServer()
{
 Serial.print("Reading control command from Server ... connecting to ");
 Serial.println(host);
WiFiClient client;
delay(1500);
if (client.connect(host, 80))
  {
    Serial.println("reconnecting...");
         url = "/api/getRealyStatus/"+String(dID)+"/"+String(code)+"/"+"abZYrshRYR243askdSKSKSK5646dkfmTURDsand";
         Serial.print("Requesting URL: ");
         //Serial.println(url); // comment to prevent hacker
         client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n\r\n");
         delay(2000);
         String section="header";
         while(client.available())
         {
            //Serial.println("Connection 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);
                  StaticJsonDocument <2000> doc;
                  DeserializationError error = deserializeJson(doc, json);
                  if (error)
                     return;
                      Serial.println("parseObject() OK ...");
                      //Serial.println(result); // show all json found
                      String master_state = doc["result"]["masterStatus"];
                      String led1 = doc["result"]["relayStatus"]["data6_H"];
                      String led2 = doc["result"]["relayStatus"]["data6_L"];
                      String led3 = doc["result"]["relayStatus"]["data3_status"];
                      String RR1 = doc["result"]["relayStatus"]["data1_status"];
                      String RR2 = doc["result"]["relayStatus"]["data2_status"];
                      String RR3 = doc["result"]["relayStatus"]["data3_status"];
                      String RR4 = doc["result"]["relayStatus"]["data4_status"];
                      String RR5 = doc["result"]["relayStatus"]["data5_status"];
                      String RR6 = doc["result"]["relayStatus"]["data6_status"]; // Timer relay 6 in platform
                      String RR7 = doc["result"]["relayStatus"]["data7_status"]; // Timer relay 7 in platform
                      String RR8 = doc["result"]["relayStatus"]["data8_status"]; // Timer relay 8 in platform
                      R1 = RR1; R2 = RR2; R3 = RR3; R4 = RR4; R5 = RR5; R6 = RR6; R7 = RR7;  R8 = RR8;
                      Serial.println("Relay : "+String(R1)+" "+String(R2)+" "+String(R3)+" "+String(R4)+" "+String(R5)+" "+String(R6)+" "+String(R7)+" "+String(R8));
                      Serial.print("Relay 1 := ");Serial.println(led1);
                      Serial.print("Master state = ");Serial.println(master_state);
                      Serial.print("R8 for Relay : ");Serial.println(R8);
                      Serial.print("Pump Start     : ");Serial.println(led1);
                      Serial.print("Pump Stop      : ");Serial.println(led2);
                      Serial.print("Led3           : ");Serial.println(led3);
                      Serial.print("Master Status  : ");Serial.println(master_state);
                      Serial.print("Timer Relay R5 : ");Serial.println(R5);
                      Serial.println("Relay : "+String(R1)+" "+String(R2)+" "+String(R3)+" "+String(R4)+" "+String(R5)+" "+String(R6)+" "+String(R7)+" "+String(R8));
                      delay(1000);
             } // if found json
          } // end while client available
    } // end if host connected
    else
    {
      // if you couldn't make a connection:
      Serial.println("connection failed read server 1");
    }
}
void Restart_loop() {
  Serial.println(cnt);   // แสดงค่าตัวเลขแต่ละรอบ
  // เมื่อรันครบ 10 รอบ (10วินาที) ให้สั่ง reset
  if (cnt == 0) {
    Serial.println("Reset..");
    ESP.restart();       // คำสั่งรีเซ็ต ESP
  }
  cnt--;                 // ลดค่าตัวแปร cnt ไปรอบละ 1 หน่วย
  delay(1000);           // รอ 1 วินาที
}
////////////////////////