ESP8266_IoTwebconfig ต้นแบบ code ติดต่อ WiFi

เป็น code ที่ผมทำไว้ ใช้เป็น master ในการติดต่อ WiFi เมื่อนำไปใช้แล้ว จะแทรก code อื่นๆ ก็เพิ่มเอาได้เลยครับ เพื่อความสะดวก

อย่าลืมนะครับ : ใช้ esp8266 เวอร์ชัน 2.4.2 หรือใหม่กว่า

แบบที่ 1 ติดต่อ WiFi โดยเฉพาะ

ภาพ
ภาพ
ภาพ

//ใช้ esp8266 เวอร์ชัน 2.4.2 หรือใหม่กว่า

#include <IotWebConf.h>

// ชื่อเริ่มต้นของ AP SSID + AP PASSWORD ในครั้งแรก หลังจาก UPLOAD Code เข้าไปยัง ESP ตัวใหม่ ในครั้งแรก (สามารถเปลี่ยนได้เมื่อเข้าไปยังหน้า Config )
const char thingName[] = "PUY IOT FIRST";
const char wifiInitialApPassword[] = "111111111";
#define CONFIG_VERSION "dem2"


// -- Callback method declarations.
void configSaved();


#include <DNSServer.h>
DNSServer dnsServer;
#include <ESP8266WebServer.h>
ESP8266WebServer server(80);//Server on port 80


IotWebConf iotWebConf(thingName, &dnsServer, &server, wifiInitialApPassword, CONFIG_VERSION);



String SSID_NAME;
String PASSWORD_NAME;

String SSID_AP;
String PASSWORD_AP;

String IP;
String Sub_M;
String Gate_way;


#include <EEPROM.h>

#define STATUS_PIN D0 // ให้ไฟ D0 แสดงสถานะการทำงาน



void setup()
{

  Serial.begin(115200);
  Serial.println();
  Serial.println(" ระบบเริ่มต้นทำงาน... ");

  EEPROM.begin(1024);//ที่เป็น 1024 เนื่องจาก 0-511 ใช้กับ USER  512-1024 ใช้กับ Libraries IoTWebconf


  iotWebConf.setStatusPin(STATUS_PIN);
  iotWebConf.setConfigSavedCallback(&configSaved);
  iotWebConf.getApTimeoutParameter()->visible = true;




  // เริ่มต้นการกำหนดค่า
  iotWebConf.init();

  // ตั้งค่าตัวจัดการ URL ที่จำเป็นบนเว็บเซิร์ฟเวอร์
  server.on("/", handleRoot);
  server.on("/config", [] { iotWebConf.handleConfig(); });
  server.onNotFound([]() {
    iotWebConf.handleNotFound();
    iotWebConf.handleCaptivePortal();
  });


  Serial.println("พร้อม");





  SSID_NAME = iotWebConf.getWifiSsidParameter()->valueBuffer;
  PASSWORD_NAME = iotWebConf.getWifiPasswordParameter()->valueBuffer;
  SSID_AP = iotWebConf.getThingNameParameter()->valueBuffer;
  PASSWORD_AP = iotWebConf.getApPasswordParameter()->valueBuffer;



}//void setup




void loop()
{

  // -- ควรเรียก doLoop ให้บ่อยที่สุด
  iotWebConf.doLoop();

  delay(500);

}






/**
   Handle web requests to "/" path.
*/
void handleRoot()
{


  Serial.println(" ตั้งค่าการเชื่อมต่อ ");
  Serial.println("");
  // -- ให้ IotWebConf ทดสอบและจัดการคำขอแคปทีฟพอร์ทัล
  if (iotWebConf.handleCaptivePortal())
  {
    // -- ให้ IotWebConf ทดสอบและจัดการคำขอแคปทีฟพอร์ทัล
    return;
  }


  String s = "<!DOCTYPE html><html lang=\"en-TH\"><head><meta charset=\"UTF-8\"name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\"/><title>PUY IOT</title>";
  s += "<title>การจัดการการตั้งค่าด้วย IotWebConf</title></head><body>ตั้งชื่อโปรเจค";
  s += "<ul>";

  s += "</ul>";
  s += "Go to <a href='config'>configure page</a> to change values.";
  s += "</body></html>\n";

  server.send(200, "text/html", s);
}







void configSaved()
{
  Serial.println("อัปเดตการกำหนดค่าแล้ว");
  Serial.println("");

  Serial.println(" บันทึก! ค่าทั้งหมดแล้ว");
  Serial.println("");
  Serial.println("ยกเลิกการเชื่อมต่อ AP เดิม และเชื่อมต่อ ระบบ WiFi ปกติ");
  Serial.println("");
  //ให้แสดง ข้อมูล AP: SSID และ PASSORD ที่เปลี่ยนแล้วออกมา
  SSID_AP = iotWebConf.getThingNameParameter()->valueBuffer;
  PASSWORD_AP = iotWebConf.getApPasswordParameter()->valueBuffer;

}

แบบที่ 2 ESP8266_IoTwebconfig_4Data_3TokenLine เพิ่มข้อมูลได้ 4 ข้อมูล 3 Token line ไม่รวม Blynk

//ใช้ esp8266 เวอร์ชัน 2.4.2 หรือใหม่กว่า

#include <IotWebConf.h>

// ชื่อเริ่มต้นของ AP SSID + AP PASSWORD ในครั้งแรก หลังจาก UPLOAD Code เข้าไปยัง ESP ตัวใหม่ ในครั้งแรก (สามารถเปลี่ยนได้เมื่อเข้าไปยังหน้า Config )
const char thingName[] = "PUY IOT FIRST";
const char wifiInitialApPassword[] = "111111111";
#define CONFIG_VERSION "dem2"


// -- Callback method declarations.
void configSaved();


#include <DNSServer.h>
DNSServer dnsServer;
#include <ESP8266WebServer.h>
ESP8266WebServer server(80);//Server on port 80

String SSID_NAME;
String PASSWORD_NAME;

String SSID_AP;
String PASSWORD_AP;

String IP;
String Sub_M;
String Gate_way;


#include <EEPROM.h>

#define STATUS_PIN D0 // ให้ไฟ D0 แสดงสถานะการทำงาน

#include <TridentTD_LineNotify.h>


#define Data1 45
char Data_1[Data1];

#define Data2 45
char Data_2[Data2];

#define Data3 45
char Data_3[Data3];

#define Data4 45
char Data_4[Data4];


#define Line_Token1 45
char Line_Token_1[Line_Token1];

#define Line_Token2 45
char Line_Token_2[Line_Token2];

#define Line_Token3 45
char Line_Token_3[Line_Token3];


IotWebConf iotWebConf(thingName, &dnsServer, &server, wifiInitialApPassword, CONFIG_VERSION);

IotWebConfParameter Data__1 = IotWebConfParameter("Data1", "Data1", Data_1, Data1);
IotWebConfSeparator separator1 = IotWebConfSeparator();
IotWebConfParameter Data__2 = IotWebConfParameter("Data2", "Data2", Data_2, Data2);
IotWebConfSeparator separator2 = IotWebConfSeparator();
IotWebConfParameter Data__3 = IotWebConfParameter("Data3", "Data3", Data_3, Data3);
IotWebConfSeparator separator3 = IotWebConfSeparator();
IotWebConfParameter Data__4 = IotWebConfParameter("Data4", "Data4", Data_4, Data4);
IotWebConfSeparator separator4 = IotWebConfSeparator();

IotWebConfParameter TokenLine1 = IotWebConfParameter("Line_Token1", "Line_Token1", Line_Token_1, Line_Token1);
IotWebConfSeparator separator5 = IotWebConfSeparator();
IotWebConfParameter TokenLine2 = IotWebConfParameter("Line_Token2", "Line_Token2", Line_Token_2, Line_Token2);
IotWebConfSeparator separator6 = IotWebConfSeparator();
IotWebConfParameter TokenLine3 = IotWebConfParameter("Line_Token3", "Line_Token3", Line_Token_3, Line_Token3);


void setup()
{

  Serial.begin(115200);
  Serial.println();
  Serial.println(" ระบบเริ่มต้นทำงาน... ");

  EEPROM.begin(1024);//ที่เป็น 1024 เนื่องจาก 0-511 ใช้กับ USER  512-1024 ใช้กับ Libraries IoTWebconf


  iotWebConf.setStatusPin(STATUS_PIN);


  iotWebConf.addParameter(&Data__1);
  iotWebConf.addParameter(&separator1);
  iotWebConf.addParameter(&Data__2);
  iotWebConf.addParameter(&separator2);
  iotWebConf.addParameter(&Data__3);
  iotWebConf.addParameter(&separator3);
  iotWebConf.addParameter(&Data__4);
  iotWebConf.addParameter(&separator4);
  iotWebConf.addParameter(&TokenLine1);
  iotWebConf.addParameter(&separator5);
  iotWebConf.addParameter(&TokenLine2);
  iotWebConf.addParameter(&separator6);
  iotWebConf.addParameter(&TokenLine3);




  iotWebConf.setConfigSavedCallback(&configSaved);
  iotWebConf.getApTimeoutParameter()->visible = true;




  // เริ่มต้นการกำหนดค่า
  iotWebConf.init();

  // ตั้งค่าตัวจัดการ URL ที่จำเป็นบนเว็บเซิร์ฟเวอร์
  server.on("/", handleRoot);
  server.on("/config", [] { iotWebConf.handleConfig(); });
  server.onNotFound([]() {
    iotWebConf.handleNotFound();
    iotWebConf.handleCaptivePortal();
  });


  Serial.println("พร้อม");





  SSID_NAME = iotWebConf.getWifiSsidParameter()->valueBuffer;
  PASSWORD_NAME = iotWebConf.getWifiPasswordParameter()->valueBuffer;
  SSID_AP = iotWebConf.getThingNameParameter()->valueBuffer;
  PASSWORD_AP = iotWebConf.getApPasswordParameter()->valueBuffer;




}//void setup












void loop()
{
//วนไม่รู้จบละทีนี้
  if (IP != "0.0.0.0") {
    LINE.setToken(Line_Token_1);
    LINE.notify("1");

    LINE.setToken(Line_Token_2);
    LINE.notify("2");

    LINE.setToken(Line_Token_3);
    LINE.notify("3");
  }



  // -- ควรเรียก doLoop ให้บ่อยที่สุด
  iotWebConf.doLoop();

  delay(500);

}






/**
   Handle web requests to "/" path.
*/
void handleRoot()
{


  Serial.println(" ตั้งค่าการเชื่อมต่อ ");
  Serial.println("");
  // -- ให้ IotWebConf ทดสอบและจัดการคำขอแคปทีฟพอร์ทัล
  if (iotWebConf.handleCaptivePortal())
  {
    // -- ให้ IotWebConf ทดสอบและจัดการคำขอแคปทีฟพอร์ทัล
    return;
  }


  String s = "<!DOCTYPE html><html lang=\"en-TH\"><head><meta charset=\"UTF-8\"name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\"/><title>PUY IOT</title>";
  s += "<title>การจัดการการตั้งค่าด้วย IotWebConf</title></head><body>ตั้งชื่อโปรเจค";
  s += "<ul>";
  s += "<li>ข้อมูล 1: ";
  s += Data_1;
  s += "<li>ข้อมูล 2: ";
  s += Data_2;
  s += "<li>ข้อมูล 3: ";
  s += Data_3;
  s += "<li>ข้อมูล 4: ";
  s += Data_4;
  s += "<li>Token Line 1: ";
  s += Line_Token_1;
  s += "<li>Token Line 2: ";
  s += Line_Token_2;
  s += "<li>Token Line 3: ";
  s += Line_Token_3;
  s += "</ul>";
  s += "Go to <a href='config'>configure page</a> to change values.";
  s += "</body></html>\n";

  server.send(200, "text/html", s);
}







void configSaved()
{
  Serial.println("อัปเดตการกำหนดค่าแล้ว");
  Serial.println("");

  Serial.println(" บันทึก! ค่าทั้งหมดแล้ว");
  Serial.println("");
  Serial.println("ยกเลิกการเชื่อมต่อ AP เดิม และเชื่อมต่อ ระบบ WiFi ปกติ");
  Serial.println("");
  //ให้แสดง ข้อมูล AP: SSID และ PASSORD ที่เปลี่ยนแล้วออกมา
  SSID_AP = iotWebConf.getThingNameParameter()->valueBuffer;
  PASSWORD_AP = iotWebConf.getApPasswordParameter()->valueBuffer;

}

กรณีตัวอย่างการเพิ่ม Blynk เข้าไป

//ใช้ esp8266 เวอร์ชัน 2.4.2 หรือใหม่กว่า

#include <IotWebConf.h>

// -- Initial name of the Thing. Used e.g. as SSID of the own Access Point.
const char thingName[] = "PUY IOT FIRST";
const char wifiInitialApPassword[] = "111111111";
#include <TridentTD_LineNotify.h>

String LineText;
String string1 = "ศาลา2 ระบบควบคุมเริ่มทำงาน  MCU RESET ครั้งที่  ";


int blynk_Connect = 0;
int Line1_status = 0;
int Line2_status = 0;


#define Line_Token 45
#define Blynk_Token 34

#define CONFIG_VERSION "dem2"


// -- Callback method declarations.
void configSaved();
boolean formValidator();

#include <DNSServer.h>
DNSServer dnsServer;
#include <ESP8266WebServer.h>
ESP8266WebServer server(80);//Server on port 80
//WebServer server(80);

char Line_Token_1[Line_Token];
//8HBPx7WHUTjGoPWACom1i98WEHGeCDFx9L7kry
//QerWyEZdBShylI3iTTxZo1vLy2NQa7AXFgYLM
char Blynk_Token_1[Blynk_Token];
//Y2cb7t9y4zv8Ky_DHrot2YGBGZb9g

IotWebConf iotWebConf(thingName, &dnsServer, &server, wifiInitialApPassword, CONFIG_VERSION);
IotWebConfParameter Token_Line = IotWebConfParameter("Line_token", "Line_token", Line_Token_1, Line_Token);
IotWebConfSeparator separator1 = IotWebConfSeparator();
IotWebConfParameter Token_Blynk = IotWebConfParameter("Blynk_Token", "Blynk_Token", Blynk_Token_1, Blynk_Token);


String SSID_NAME;
String PASSWORD_NAME;
String IP;
String Sub_M;
String Gate_way;

String SSID_AP;
String PASSWORD_AP;


#include <BlynkSimpleEsp8266.h>
//#include <BlynkSimpleEsp32.h>

#define BLYNK_DEBUG
#define BLYNK_PRINT Serial
int blynkIsDownCount = 0;
BlynkTimer timer;

//-------------สำหรับ Server local ที่แจกให้ เพิ่ม **** แค่ 2 บรรทัดนี้--------------
//(ถ้าเป็น Blynk Server ปกติไม่ต้องใส่)  ----------//
char server1[] = "oasiskit.com";
//int port = 8080;



#include <EEPROM.h>



int MCU_Reset = 0;
int count_MCU_Rset;
int Amount_Mcu_Reset;
int reset_MCU;


#define STATUS_PIN D0

const char* host = "www.google.co.th";
int Internet;





#include "DHT.h"
#define DHTPIN D5
#define DHTTYPE    DHT22
DHT dht(DHTPIN, DHTTYPE);

float h ;
float t ;

//int Relay_fan = D6;

int Temp = 0;
int Humid = 0;


//Temp
float tmax;
String t_max1;
float t_max2;

float tmin;
String t_min1;
float t_min2;

//Humid
float hmax;
String h_max1;
float h_max2;


float hmin;
String h_min1;
float h_min2;




WidgetLED led_1(V10);


#define RelayFan D6
















BLYNK_WRITE(V12)//reset Counter MCU Reset
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Amount_Mcu_Reset = EEPROM.put(101, 0);
    EEPROM.commit();

    count_MCU_Rset = EEPROM.put(150, 0);
    EEPROM.commit();


    Blynk.virtualWrite(V11, count_MCU_Rset);

  }
  if (pinValue == 0) {

  }
}




BLYNK_WRITE(V1)

{
  t_max1 = param.asString();//รับค่าข้อความจาก Blynk เข้ามา เก็บในรูปแบบ String

  t_max2 = t_max1.toFloat();//แปลงค่าจาก String เป็น Float

  EEPROM.put(300, t_max2); //เขียนค่า
  EEPROM.commit(); //จบการเขียน

  tmax = EEPROM.get(300, t_max2);//อ่าน ค่า
  Serial.println(tmax);

  delay(100);

}



BLYNK_WRITE(V2)

{
  t_min1 = param.asString();//รับค่าข้อความจาก Blynk เข้ามา เก็บในรูปแบบ String

  t_min2 = t_min1.toFloat();//แปลงค่าจาก String เป็น Float

  EEPROM.put(310, t_min2); //เขียนค่า
  EEPROM.commit(); //จบการเขียน

  tmin = EEPROM.get(310, t_min2);//อ่าน ค่า
  Serial.println(tmin);

  delay(100);

}




BLYNK_WRITE(V3)

{
  h_max1 = param.asString();//รับค่าข้อความจาก Blynk เข้ามา เก็บในรูปแบบ String

  h_max2 = h_max1.toFloat();//แปลงค่าจาก String เป็น Float

  EEPROM.put(320, h_max2); //เขียนค่า
  EEPROM.commit(); //จบการเขียน

  hmax = EEPROM.get(320, h_max2);//อ่าน ค่า
  Serial.println(hmax);

  delay(100);

}



BLYNK_WRITE(V4)

{
  h_min1 = param.asString();//รับค่าข้อความจาก Blynk เข้ามา เก็บในรูปแบบ String

  h_min2 = h_min1.toFloat();//แปลงค่าจาก String เป็น Float

  EEPROM.put(330, h_min2); //เขียนค่า
  EEPROM.commit(); //จบการเขียน

  hmin = EEPROM.get(330, h_min2);//อ่าน ค่า
  Serial.println(hmin);

  delay(100);

}











void setup()
{

  Serial.begin(115200);
  Serial.println();
  Serial.println(" Starting up... ");

  pinMode(RelayFan , OUTPUT);
  digitalWrite(RelayFan , 0);//D6  Relay เป็น High Active 1 on  0 oFF
  EEPROM.begin(1024);


  iotWebConf.setStatusPin(STATUS_PIN);
  iotWebConf.addParameter(&Token_Line);
  iotWebConf.addParameter(&Token_Blynk);

  iotWebConf.setConfigSavedCallback(&configSaved);
  iotWebConf.setFormValidator(&formValidator);
  iotWebConf.getApTimeoutParameter()->visible = true;




  // -- Initializing the configuration.
  iotWebConf.init();

  // -- Set up required URL handlers on the web server.
  server.on("/", handleRoot);
  server.on("/config", [] { iotWebConf.handleConfig(); });
  server.onNotFound([]() {
    iotWebConf.handleNotFound();
    iotWebConf.handleCaptivePortal();
  });

  Serial.println("Ready");
  Serial.println("Finish");





  // Blynk.config(blynk_token);////เริ่มการเชื่อมต่อ Blynk Server แบบปกติ
  Blynk.config(Blynk_Token_1, server1, 8080);
  ////เริ่มการเชื่อมต่อ Blynk Server*********สำหรับ Server local ที่แจกให้ เพิ่ม, server, port  แค่นี้จบ



  timer.setInterval(30000L, reconnecting);  //Function reconnect
  timer.setInterval(500L, internet);
  dht.begin();

  timer.setInterval(2000L, checkT_H);

  tmax = EEPROM.get(300, t_max2);
  Serial.print("tmax in Void setup : ");
  Serial.println(tmax);

  tmin = EEPROM.get(310, t_min2);
  Serial.print("tmin in Void setup : ");
  Serial.println(tmin);

  hmax = EEPROM.get(320, h_max2);
  Serial.print("hmax in Void setup : ");
  Serial.println(hmax);

  hmin = EEPROM.get(330, h_min2);
  Serial.print("hmin in Void setup : ");
  Serial.println(hmin);



  //  timer.setInterval(1000L, reconnecting);

  SSID_NAME = iotWebConf.getWifiSsidParameter()->valueBuffer;


  PASSWORD_NAME = iotWebConf.getWifiPasswordParameter()->valueBuffer;

  SSID_AP = iotWebConf.getThingNameParameter()->valueBuffer;

  PASSWORD_AP = iotWebConf.getApPasswordParameter()->valueBuffer;



  LINE.setToken(Line_Token_1);




  count_MCU_Rset = EEPROM.get(150, Amount_Mcu_Reset);
  Serial.print("count_MCU_Rset =  ");
  Serial.println(count_MCU_Rset);

  reset_MCU = count_MCU_Rset + 1;
  //  Serial.print("reset_MCU =  ");
  //  Serial.println(reset_MCU);
  Amount_Mcu_Reset = EEPROM.put(101, reset_MCU);
  EEPROM.commit();
  //  Serial.print("Amount_Mcu_Reset =  ");
  //  Serial.println(Amount_Mcu_Reset);

  count_MCU_Rset = EEPROM.put(150, Amount_Mcu_Reset);
  EEPROM.commit();
  Serial.print("count_MCU_Rset =  ");
  Serial.println(count_MCU_Rset);




}//void setup




void loop()
{



  if (Internet  == 1 && MCU_Reset == 0) {

    LineText = string1 + count_MCU_Rset;
    LINE.notify(LineText);
    delay (200);


    MCU_Reset = 1;

  }




  if (Blynk.connected())
  {
    Blynk.run();

    blynk_Connect = 1;

    Blynk.virtualWrite(V11, count_MCU_Rset);


  } else {

    blynk_Connect = 0;

  }



  //แจ้งเตือน กรณี Blynk เชื่อมต่อ OK  1 ครั้ง
  if (blynk_Connect == 1 && Line1_status == 0) {

    LINE.notify("MCU FAN ศาลา2  เชื่อมต่อ Blynk Server ได้แล้ว");
    //LINE.notify("ศาลา2 เชื่อมต่อ Blynk Server ได้แล้ว");
    delay (200);
    Line1_status = 1;


  }

  else if (blynk_Connect == 1  && Line1_status == 1) {
    delay(10);

    Line2_status = 0;
  }




  //แจ้งเตือน กรณี Blynk หลุด  1 ครั้ง  กรณี Internet มา
  if (Internet == 1 && blynk_Connect == 0 && Line2_status == 0) {

    LINE.notify("MCU FAN!!ศาลา2 เชื่อมต่อ Blynk Server ไม่ได้");
    //LINE.notify("ศาลา2!!!  เชื่อมต่อ Blynk Server ไม่ได้");

    delay (200);
    Line2_status = 1;



  }

  else if (blynk_Connect == 0  && Line2_status == 1) {
    delay(10);

    Line1_status = 0;
  }


  timer.run();






  // -- doLoop should be called as frequently as possible.
  iotWebConf.doLoop();

  delay(500);




}


void internet()
{
  WiFiClient client;
  if (client.connect(host, 80))
  {
    // Serial.println("connected");
    Internet = 1;
    client.stop();
    delay(100);


  }
  else {
    //Serial.println("connection failed!");
    Internet = 0;
    client.stop();

  }
}




void reconnecting()
{
  if (!Blynk.connected())
  {
    blynkIsDownCount++;
    BLYNK_LOG("blynk server is down! %d  times", blynkIsDownCount);
    Blynk.connect(5000);
  }
}


BLYNK_CONNECTED()
{


}












/**
   Handle web requests to "/" path.
*/
void handleRoot()
{


  Serial.println(" NOW! CONFIG AP ");

  // -- Let IotWebConf test and handle captive portal requests.
  if (iotWebConf.handleCaptivePortal())
  {
    // -- Captive portal request were already served.
    return;
  }
  String s = "<!DOCTYPE html><html lang=\"en\"><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\"/>";
  s += "<title>IotWebConf 03 Custom Parameters</title></head><body>ESP8266 FAN CTRL";
  s += "<ul>";

  s += "<li>String param value1: ";
  s += Line_Token_1;
  s += "<li>String param value2: ";
  s += Blynk_Token_1;

  s += "</ul>";
  s += "Go to <a href='config'>configure page</a> to change values.";
  s += "</body></html>\n";

  server.send(200, "text/html", s);
}







void configSaved()
{
  Serial.println("Configuration was updated.");


  Serial.println(" SAVE! CONFIG AP");

  Serial.println(" DISCON. CONFIG!");




  SSID_AP = iotWebConf.getThingNameParameter()->valueBuffer;

  PASSWORD_AP = iotWebConf.getApPasswordParameter()->valueBuffer;

}

boolean formValidator()
{
  Serial.println("Validating form.");
  boolean valid = true;

  int l = server.arg(Token_Line.getId()).length();
  if (l < 3)
  {
    Token_Line.errorMessage = "Please provide at least 3 characters for this test!";
    valid = false;
  }



  return valid;
}


void checkT_H()
{

  if (Internet == 1) {

loop:
    t = dht.readTemperature();
    h = dht.readHumidity();


    //-----------------ถ้าอ่านค่าไม่ได้ ให้  t = 0 ,h = 0 เพื่อสะดวกในการวิเคราะห์ค่า---------
    if (isnan(h) || isnan(t)) {
      //Serial.println("Failed to read from DHT sensor!");
      //delay(500);
      //display.clear();
      //display.drawString(5, 0, "Failed DHT22");
      //t = 0;
      //h = 0;
      Serial.println("***");
      delay(1000);
      goto loop ;
    }
    //---------------------------------------------------------------------
    else {
      //Serial.println("อ่านค่าได้แล้ว");
      //    Serial.print("temp : ");
      //    Serial.println(t);
      //    Serial.print("Humid :");
      //    Serial.println(h);


      Blynk.virtualWrite(V8, t);
      Blynk.virtualWrite(V9, h);


      if ( t > tmin && t <= tmax ) {

        Temp = 0;

      }  else   {

        Temp = 1;
      }

      if ( h > hmin && h <= hmax ) {

        Humid = 0;

      }  else   {

        Humid = 1;
      }


      //  Serial.print("Temp =  ");
      //  Serial.println(Temp);
      //
      //  Serial.print("Humid =  ");
      //  Serial.println(Humid);



      //ใช้หลักการทำงานแบบ 4 สถานะ


      if ( Temp == 1 && Humid == 1 ) {//temp  ปกติ    humit  ปกติ

        //digitalWrite(Relay_fan, 0);//FAN ON
        led_1.on();
        digitalWrite(RelayFan , 1);
      }


      if ( Temp == 0 && Humid == 1 ) {//temp  ผิดปกติ    humit  ปกติ

        //digitalWrite(Relay_fan, 0);//FAN ON
        led_1.on();
        digitalWrite(RelayFan , 1);
      }



      if ( Temp == 1 && Humid == 0 ) {//temp  ปกติ    humit  ผิดกติ

        //digitalWrite(Relay_fan, 0);//FAN ON
        led_1.on();
        digitalWrite(RelayFan , 1);
      }


      if ( Temp == 0 && Humid == 0 ) {//temp  ผิดปกติ    humit  ผิดกติ

        //digitalWrite(Relay_fan, 1);//FAN  OFF
        led_1.off();
        digitalWrite(RelayFan , 0);

      }



      return;//ถ้าไม่ใส่มันจะไม่ return ค่า =0,h=0

    }

  }
  iotWebConf.doLoop();
}

Library :slight_smile: https://drive.google.com/file/d/1wYoMqNQCYDoJ1nEmKX_h2ct7OvEfy9kz/view?usp=sharing

ที่เคยลง Post ไป :slight_smile: