คอนไพล์ผ่านแต่ใช้งานไม่ได้ ESP32

คอนไพล์ผ่านแต่ใช้งานไม่ได้ครับ


ไม่เชื่อมต่ออะไรเลยครับต้องแก้ไขยังไงครับ

code ที่ใช้ครับ

// *** (1) PROJECT INFO ***
  #define BLYNK_PRINT Serial
  
// *** (2) SYSTEM CONFIGURATION ***
    char auth[] = "d240db934aa4403784f9afe0722e95d8";
    char ssid[] = "ABC99_2.4G";
    char pass[] = "99999999";
    
//LINE TOKEN
  #define LINE_TOKEN "WRvPbVG4sX9y7HIyX0EjBSkSgnJetLh5ZBjY22aaFCt"
  
//ค่าเปอร์เซ็นต์ความชื้นในดินที่ต้องการให้เร่ิมรดน้ำต้นไม้
  #define TempCooling 31
  #define HumFanning 79
  
// *** (3) LIBRARY INCLUDE ***
  #include <TridentTD_LineNotify.h>
  #include <WiFi.h>
  #include <WiFiClient.h>
  #include <WiFiClientSecure.h>
  #include <BlynkSimpleEsp32.h>
  #include <DHT.h>
  #include <time.h>

//ระบุรุ่นเซ็นเซอร์วัดความชื้นสัมพัทธ์และอุณมหภูมิเป็นรุ่น DHT22
  #define DHTTYPE DHT22 

// *** (4) GPIO PIN SETUP ***
  #define DHTPIN 32
  #define LdrSensorPIN 35
  #define ButtonCoolPIN 25
  #define ButtonFanPIN 33
  #define LEDSensorPIN 26
  #define CoolingPIN 27
  #define FanningPIN 14
  #define LEDWiFiPIN 2
  #define LEDCoolingPIN 4
  #define LEDFanningPIN 15 
  #define RelayCoolPIN 5
  #define RelayFanPIN 18

//การกำหนดขา Vitual Pin ที่สร้างขึ้นให้กับ Widget ต่างๆ ใน Blynk Mobile APP
  #define Widget_Humidity V1
  #define Widget_Temperature V2
  #define Widget_LightRawValue V5
  #define Widget_LightLevel V6
  #define Widget_CoolingButton V7
  #define Widget_FanningButton V14
  #define Widget_SendSensorStatus V8
  #define Widget_CoolingStatus V9
  #define Widget_FanningStatus V13
  #define Widget_WifiSignal V10
  #define Widget_WifiRawValue V11
  #define Widget_Terminal V12
  
    WidgetLED LEDSensor(Widget_SendSensorStatus);
    WidgetLED LEDCooling(Widget_CoolingStatus);
    WidgetLED LEDFanning(Widget_FanningStatus);
    WidgetTerminal terminal(Widget_Terminal);
     
// *** (6) NTP SERVER SETUP ***
    char ntp_server1[20] = "time.navy.mi.th";
    char ntp_server2[20] = "clock.nectec.or.th";
    char ntp_server3[20] = "th.pool.ntp.org";
    
//เรียกใช้การตั้งเวลาของ Blynk
    BlynkTimer timer;
    DHT dht(DHTPIN, DHTTYPE);
    
//กำหนดตัวแปรเริ่มต้น
     int WifiSignal;
     bool isFirstConnect = true;
     byte oldtemperature;
     byte oldhumidity;
     int CurrentWiFiSignal;
     int MapReadLightValue;
     int CurrentLightValue;
     int h;
     int t;
    
// *** (8) BLYNK CONNECTED FUNCTION ***
    BLYNK_CONNECTED() {
         digitalWrite(LEDWiFiPIN, HIGH);
//ถ้าเป็นการเชื่อมต่อ Blynk Server ครั้งแรกหลังบอร์ดรีบูต
      if(isFirstConnect) {
//ให้ซิงค์ข้อมูลทั้งหมดล่าสุดจาก Blynk Server
         Blynk.syncAll();
         Blynk.syncVirtual(Widget_FanningButton);
         Blynk.syncVirtual(Widget_CoolingButton);
      isFirstConnect = false;
   }
} 

// *** (9) BLYNK BUTTON FUNCTION ***
     BLYNK_WRITE(Widget_CoolingButton) {
//ค่าที่ได้จาก Widget_WateringButton (V7) จะเป็น 0 และ 1 ถ้ามีการปดปุ่ม
        if (param.asInt() == 1) {
        if (digitalRead(RelayCoolPIN) != LOW) {
//เรียกใช้ฟังก์ชันปั้มน้ำ
           digitalWrite(RelayCoolPIN, LOW);
      } 
  } 
        else {
           digitalWrite(RelayCoolPIN, HIGH);  
    }
}

     BLYNK_WRITE(Widget_FanningButton) {
//ค่าที่ได้จาก Widget_WateringButton (V7) จะเป็น 0 และ 1 ถ้ามีการปดปุ่ม
        if (param.asInt() == 1) {
        if (digitalRead(RelayFanPIN) != LOW) {
//เรียกใช้ฟังก์ชันรดน้ำ
           digitalWrite(RelayFanPIN, LOW);
      } 
   } 
        else {
           digitalWrite(RelayFanPIN, HIGH);  
   }
}

// *** (10) FUNCTION SETUP() ***
     void setup() {
//เรียกใช้งาน Serial Monitor
         Serial.begin(115200);
         dht.begin();

//กำหนดโหมดใช้งานให้กำขา GPIO
      pinMode(LEDWiFiPIN, OUTPUT);
      pinMode(LEDSensorPIN, OUTPUT);
      pinMode(LEDCoolingPIN, OUTPUT);
      pinMode(LEDFanningPIN, OUTPUT);
      pinMode(CoolingPIN, OUTPUT);
      pinMode(FanningPIN, OUTPUT);
      pinMode(RelayCoolPIN, OUTPUT);
      pinMode(RelayFanPIN, OUTPUT);
      pinMode(ButtonCoolPIN, INPUT_PULLUP);
      pinMode(ButtonFanPIN, INPUT_PULLUP);

//ตั้งสถานะเริ่มต้นให้กับขา GPIO เพื่อป้องกันการทำงานเองตอนที่บอร์ด ESP32 รีบูต
      digitalWrite(LEDWiFiPIN, LOW);
      digitalWrite(LEDSensorPIN, LOW);
      digitalWrite(LEDCoolingPIN, LOW);
      digitalWrite(LEDFanningPIN, LOW);
      digitalWrite(RelayCoolPIN, HIGH);
      digitalWrite(RelayFanPIN, HIGH);
         Serial.println("Setting IO Done.");

   timer.setInterval(1000L, GetDHT22);
   timer.setInterval(2000L, sendSensor);

//TASK1: ลูปเช็คค่าความชื้นดิน ถ้าต่ำกว่าที่กำหนดให้เร่ิมการรดน้ำต้นไม้
     xTaskCreate(&Task1, "Task1", 2000, NULL, 9, NULL);
//(Task6 ผมก็อปมาจาก task1 แล้วสร้างเพิ่ม task6 ขึ้นมาครับ)
     xTaskCreate(&Task6, "Task6", 2000, NULL, 9, NULL);
//TASK2: ลูปอ่านค่าการกดปุ่มสวิตซ์ ถ้ามีการกดปุ่มสวิตซ์ให้เริ่มการรดน้ำต้นไม้
     xTaskCreate(&Task2, "Task2", 1000, NULL, 9, NULL);
//(Task7 ผมก็อปมาจาก task2 แล้วสร้างเพิ่ม task7 ขึ้นมาครับ)
     xTaskCreate(&Task7, "Task7", 1000, NULL, 9, NULL);
//TASK3: ลูปให้หลอดไฟ LED กระพริบ ถ้ามีการรดน้ำต้นไม้
     xTaskCreate(&Task3, "Task3", 3000, NULL, 8, NULL);
//(Task8 ผมก็อปมาจาก task3 แล้วสร้างเพิ่ม task8 ขึ้นมาครับ)
     xTaskCreate(&Task8, "Task8", 3000, NULL, 8, NULL);
//TASK4: ลูปเช็คการเชื่อมต่อ WiFi และให้เชื่อมต่อใหม่เองแบบอัตโนมัติ
     xTaskCreate(&Task4, "Task4", 3000, NULL, 10, NULL);
//TASK5: รดน้ำต้นไม้ตามเวลาที่กำหนด
     xTaskCreate(&Task5, "Task5", 3000, NULL, 9, NULL);
//(Task9 ผมก็อปมาจาก task5 แล้วสร้างเพิ่ม task9 ขึ้นมาครับ)
     xTaskCreate(&Task9, "Task9", 3000, NULL, 9, NULL);
//TASK4: ลูปเช็คการเชื่อมต่อ WiFi และให้เชื่อมต่อใหม่เองแบบอัตโนมัติ
     xTaskCreate(&Task10, "Task10", 3000, NULL, 10, NULL);

//ทำการเชื่อมต่อ WiFi
         Blynk.connectWiFi(ssid, pass);

//แสดงข้อความใน Serial Monitor
           Serial.println();
           Serial.println("Welcom to smartfram IoT");
           Serial.print("WiFi Connected: ");
           Serial.println(WiFi.localIP());
           Serial.print("WiFi signal RSSI: ");
           Serial.print(WiFi.RSSI());
           Serial.println("dBm");

//ดึงเวลาจากอินเตอร์เน็ตจาก NTP Time Server
    configTime(7 * 3600, 0, ntp_server1, ntp_server2, ntp_server3);

//แสดงข้อความใน Serial Monitor
         Serial.println("Waiting for time.");
     while (!time(nullptr)) {
         Serial.print(".");
       vTaskDelay(100 / portTICK_PERIOD_MS);}

//แสดงข้อความใน Serial Monitor
         Serial.println();
         Serial.println("Current time: " + NowString());

//ทำการเชื่อมต่อ BLYNK SERVER
      Blynk.config(auth,"Blynk.jpnet.co.th",8080);
      Blynk.connect();
 }
 
// *** (11) FUNCTION LOOP() ***
    void loop() {
       timer.run();
       Blynk.run();
 }

// *** (12) FUNCTION SENDSENSOR() ***
    void sendSensor() {
       digitalWrite(LEDWiFiPIN, HIGH);
          LEDSensor.on();
       Serial.print(NowString());
       Serial.println(", Send data to blynk server");
       Serial.print(NowString());
       Serial.print(", Wifi Signal: ");
       Serial.print(WifiPercentSignal());
       Serial.println("%");
          Blynk.virtualWrite(Widget_Humidity, h);
          Blynk.virtualWrite(Widget_Temperature, t);
          Blynk.virtualWrite(Widget_LightRawValue, analogRead(LdrSensorPIN));
          Blynk.virtualWrite(Widget_LightLevel, LdrPercentValue());
          Blynk.virtualWrite(Widget_WifiSignal, WifiPercentSignal());
          Blynk.virtualWrite(Widget_WifiRawValue, WiFi.RSSI());
       Serial.print(NowString());
       Serial.println(", Send DHT22 / LDR sensors / WIFIto blynk server.");
          digitalWrite(LEDWiFiPIN, LOW);
          LEDSensor.off();
}

// *** (17) CURRENT DATETIME ***
    String NowString() {
      int getcount = 1;
        time_t now = time(nullptr);
      struct tm* newtime = localtime(&now);
      String myyear = String(newtime->tm_year + 1900);  
  
  //ถ้าปียังเป็นปี 1970 ให้ดึงค่าเวลาใหม่ พยายามสูงสุด 4 ครั้ง
        while(myyear == "1970" && getcount <= 4) {    
          time_t now = time(nullptr);
          struct tm* newtime = localtime(&now);
          myyear = String(newtime->tm_year + 1900);   
      vTaskDelay(100 / portTICK_PERIOD_MS);    
    getcount++;
  }
      String tmpTime = "";
      String tmpNow = "";
        tmpNow += String(newtime->tm_year + 1900);
        tmpNow += "-";
     if(newtime->tm_mon < 10) 
        tmpNow += "0";
        tmpNow += String(newtime->tm_mon + 1);
        tmpNow += "-";
     if(newtime->tm_mday < 10) 
        tmpNow += "0";
        tmpNow += String(newtime->tm_mday);
        tmpNow += " ";
     if(newtime->tm_hour < 10)
        tmpNow += "0";
        tmpNow += String(newtime->tm_hour);
        tmpNow += ":";
     if(newtime->tm_min < 10)
        tmpNow += "0";
        tmpNow += String(newtime->tm_min);
        tmpNow += ":";
     if(newtime->tm_sec < 10)
        tmpNow += "0";
        tmpNow += String(newtime->tm_sec);
     return tmpNow;
}

// *** (18) FUNCTION GetDHT11 ***
     void GetDHT22() {
//กำหนดค่าตัวแปรอุณหภูมิ
       float h = dht.readHumidity();
       float t = dht.readTemperature(); 
       int count = 1;
     while(isnan(h) || isnan(t)&& count <= 4) {
         Serial.print(NowString());
         Serial.println(", DHT22 get failed ");
         Serial.print(count);
           dht.readHumidity();
           dht.readTemperature();
         vTaskDelay(1500/ portTICK_PERIOD_MS);
     if(count == 4)  
           LINE.notify("DHT22 get failed 4 times.");
           count++;
  }
     if(isnan(h)) 
          h = oldhumidity;
     if(isnan(t)) 
          t = oldtemperature;
        Serial.print(NowString());
        Serial.print(", Humidity: ");
        Serial.print(h);
        Serial.print("% | ");
        Serial.print("Temperature: ");
        Serial.print(t);
        Serial.println("C");
//เก็บสำรองข้อมูล temperature & humidity
    oldtemperature = t;
    oldhumidity = h;
}

// *** (19) FUNCTION WifiPercentSignal ***
//หาค่าสัญญาณ RSSI ของ WIFI แล้ว MAP ให้อยู่ในรูปของเปอร์เซ็นต์
     int WifiPercentSignal() {
          CurrentWiFiSignal = WiFi.RSSI();
            if(CurrentWiFiSignal > -40) CurrentWiFiSignal = -40;
            if(CurrentWiFiSignal < -90) CurrentWiFiSignal = -90;
         WifiSignal = map(CurrentWiFiSignal, -90, -40, 0, 100);
     return WifiSignal;
}

// *** (21) FUNCTION LdrPercentValue ***
//อ่านค่าจากเซ็นเซอร์อนาล๊อก LDR
     int LdrPercentValue() {
          CurrentLightValue = analogRead(LdrSensorPIN);
            if(CurrentLightValue > 4000) CurrentLightValue = 4000;
            if(CurrentLightValue < 100) CurrentLightValue = 100;
          MapReadLightValue = map(CurrentLightValue, 4000, 100, 0, 100);
            Serial.print(NowString());
            Serial.print(", Light sensor value: ");
            Serial.println(MapReadLightValue);
     return MapReadLightValue;
}

// TASK1: ลูปเช็คอุณหภูมิ
      void Task1(void *pvParameter){
        for (;;){
            if(t <= TempCooling && t != 0) 
              digitalWrite(CoolingPIN, 0); 
       }
    vTaskDelay(1000 / portTICK_PERIOD_MS);
 }

//TASK6: ลูปเช็คค่าความชื้น
     void Task6(void *pvParameter){
       for (;;) {
           if(h >= HumFanning && h != 0) 
              digitalWrite(FanningPIN, 0);
       }
    vTaskDelay(2000 / portTICK_PERIOD_MS);
}

// TASK2: ลูปเช็คสถานะของสวิตซ์ ถ้ามีการกดสวิตซ์จะเป็นการเปิดปั๊มคูลลิ่ง
     void Task2(void *pvParameter){
       for (;;) {
         boolean state = 0;
         boolean data;
         data = digitalRead(ButtonCoolPIN);
           if(data == 0) {
              vTaskDelay(10 / portTICK_PERIOD_MS);
           }
                if(digitalRead(ButtonCoolPIN) == 0) {
                   digitalWrite(CoolingPIN, 0);
      }
           else 
               if(data == 1 ){
                  vTaskDelay(10 / portTICK_PERIOD_MS);
           }
                   if(digitalRead(ButtonCoolPIN) == 1) {
                      digitalWrite(CoolingPIN, 1);
      } 
           vTaskDelay(100 / portTICK_PERIOD_MS);
    }
   }

//TASK7: ลูปเช็คสถานะของสวิตซ์ ถ้ามีการกดสวิตซ์จะเป็นการเปิดพัดลม
         void Task7(void *pvParameter){
           for (;;) {   
             boolean state = 0;
             boolean data;
                  data = digitalRead(ButtonFanPIN);
                    if(data == 0 ) {
                       vTaskDelay(10 / portTICK_PERIOD_MS);
                    }
                          if(digitalRead(ButtonFanPIN) == 0) {
                              digitalWrite(FanningPIN, 0);
            }
                 else if 
                    (data == 1 ) {
                         vTaskDelay(10 / portTICK_PERIOD_MS);
                  }
                      if(digitalRead(ButtonFanPIN) == 1) {
                           digitalWrite(FanningPIN, 1);
           }
                   vTaskDelay(100 / portTICK_PERIOD_MS);
        }
      }

// TASK3: ลูปเช็คค่าขา CoolingPin ถ้าเปลี่ยนสถานะเป็น 0
          void Task3(void *pvParameter){
             for (;;) {
                   if(digitalRead(CoolingPIN) == 0) 
                       digitalWrite(LEDCoolingPIN, HIGH);
                       LEDCooling.on();
                          vTaskDelay(500 / portTICK_PERIOD_MS);
                       digitalWrite(LEDCoolingPIN, LOW);
                       LEDCooling.off();
                   vTaskDelay(500 / portTICK_PERIOD_MS);
            } 
        }

//TASK8: ลูปเช็คค่าขา FanningPin ถ้าเปลี่ยนสถานะเป็น 0
         void Task8(void *pvParameter){
            for (;;) {
                  if(digitalRead(FanningPIN) == 0)
                      digitalWrite(LEDFanningPIN, HIGH);
                      LEDFanning.on();
                         vTaskDelay(500 / portTICK_PERIOD_MS);
                      digitalWrite(LEDFanningPIN, LOW);
                      LEDFanning.off();
                  vTaskDelay(500 / portTICK_PERIOD_MS);
            }
        }

//TASK4: ลูปเช็คสัญญาณ wifi ถ้าติดต่อไม่ได้ให้ต่อใหม่
         void Task4(void *p) {  
            for (;;) {
                 if(WiFi.status() != WL_CONNECTED) {      
                     digitalWrite(LEDWiFiPIN, LOW);
                     Serial.println("WiFi Disconnected.");      
                     WiFi.begin((char*)ssid, (char*)pass);    
        } 
            else {      
                   digitalWrite(LEDWiFiPIN, HIGH);
        }  
      vTaskDelay(5000 / portTICK_PERIOD_MS); 
  }
}

// TASK5: เปิดปั้มคูลลิ่ง
          void Task5(void *pvParameter){
            for (;;){
                 if(digitalRead(CoolingPIN) == 0) {
                     digitalWrite(RelayCoolPIN, LOW);
                     LEDCooling.on();
                     Blynk.virtualWrite(Widget_CoolingButton, 1);
                     terminal.print(NowString());
                     terminal.println(", Start");
                     Serial.print(NowString());
                     Serial.println(", Air running...");
                     LINE.notify("Air running...");
            }
                 if (digitalRead(CoolingPIN) == 1){
                      digitalWrite(RelayCoolPIN, HIGH);
                        digitalWrite(CoolingPIN, 1);
                        LEDCooling.off();
                        Blynk.virtualWrite(Widget_CoolingButton, 0);
        }
    }
}
// TASK9: เปิดพัดลมระบายอากาศ
          void Task9(void *pvParameter){
             for (;;) {
                 if(digitalRead(FanningPIN) == 0){
                     digitalWrite(RelayFanPIN, LOW);
                     LEDFanning.on();
                     Blynk.virtualWrite(Widget_FanningButton, 1);
                     terminal.print(NowString());
                     terminal.println(", Start");
                     Serial.print(NowString());
                     Serial.println(", Ventilating...");
                     LINE.notify("Ventilating...");
            }
                if (digitalRead(FanningPIN) == 1){
                     digitalWrite(RelayFanPIN, HIGH);
                     LEDFanning.off();
                     Blynk.virtualWrite(Widget_FanningButton, 0);
        }
    }
}
void Task10(void *p) {  
  for(;;) {    
    if(!Blynk.connected()){    
      //แสดงข้อความบนคอนโซล
      Serial.println("Not connected to Blynk server.");
      Serial.println("Connecting to Blynk server...");
      Blynk.disconnect();
      //delay(1000);
      vTaskDelay(1000 / portTICK_PERIOD_MS);
      if(WiFi.status() == WL_CONNECTED){
        Blynk.config(auth,"Blynk.jpnet.co.th",8080);
        Blynk.connect();  
      }
      // try to connect to server  
    }
    vTaskDelay(10000 / portTICK_PERIOD_MS); 
  } //while
}
/* -------------------------------------------------*/

เหมือนว่าที่ task1 และ 6 มีปัญหา

เบื้องต้นลองตัดสอง task นี้ออกไปก่อน แล้วรันดูว่าได้ไหม

เบื้องต้นแก้ไขตามที่บอกแล้วครับ มีการดเชื่อมต่อไวไฟ และ blynk แต่ไว WiFi Disconnected ออกเองตลอดครับ


ดูๆเหมือนจะมีปัญหาที่ task อื่นรึป่าวครับ ผมเข้าใจการใช้งาน task ผิดรึป่าวครับ

ปิด task ทั้งหมกใช้งานได้ปกติครับ


แก้ยังไงดีครับ

ลองใส่กลับเข้าไปทุก task แล้วแก้ เป็นแบบนี้ให้หมด แล้วดูว่าได้ไหม

ขอเป็นช่วง 6 โมงเย็นนะครับ ผมเลิกงานแล้วจะอัพเดทให้ครับ

จัดไปครับลองดู

1 Likes

ขึ้น error ครับ


ตอนนี้ยังแก้ไขไม่ได้เลยครับ มันสามารถเปลี่ยนฟังก์ชั่น task เป็นฟังก์ชั่นอื่นได้ไหมครับ

โทษทีครับตัดท้ายนี้ทิ้งไปก่อนครับ ลืมไปโค้ตนี้ไม่ได้แบ่ง core

เชื่อมต่อได้ครับ แต่ disconnect เองตลอดครับ

ลองเปลี่ยนการเชื่อม wifi เป็นแบบ multi wifi ดูครับ

ทำแบบไหนครับพี่

โหลด library multi wifi มาใช้ดูครับ

ตอนนี้ทุกอย่างโอเคหมดแล้ว แสดงอุณหภูมิ ความชื้น ค่าไวไฟ ค่าแอลดีอาร์ ผ่าน blynk ได้ แต่พอเปิด task แค่ task เดียวก็รวนหมดเลยครับ connect แล้วก็ disconnect วนซ้ำๆ เรื่อยๆเลยครับ
( ไม่ว่าจะเป็น task ไหนก็รวนหมดครับ )

เดียวผมจะเทสบอร์ดผมดูว่าเป็นเหมือนกันไหม

1 Likes

ครับ ขอบคุณครับพี่
ผมสงสัยว่าจะต้องมี library อะไรรึป่าวครับ

ขอโทษนะครับ พอดีผมทำงานทุกวันเลยไม่ค่อยได้อัพเดทข้อมูลต่างๆให้ พี่จะได้ช่วยแก้ไขได้ถูกจุด :pray:

เบื้องต้นเทสแล้วเป็นเหมือนกันครับ คือตอนนี้ที่สังเกตดูเรา แยก task ออกมามากเกินไปนะ บ้าง task มันสามารถ ย้ายไปไว้ที่ void loop ได้ ผมแนะน้ำให้ลด task สั่นๆ ลง ให้น้อยสุด ดูครับ กำหนดเป็นฟังก์ชัน ก่อนแล้วค่อยใส่ไว้ใน void loop ก็ได้

ตอนนี้ผมสร้าง void เพิ่มขึ้นมาครับ ไม่ได้เอาไว้ใน void loop เนื่องจากผมไม่แน่ใจว่าต้องใช้คำสั่งไหนครับ while รึป่าวครับ?

ผมกำหนดตรง timer.setInterval ขึ้นมาทำแบบนี้เรียกว่าอะไรครับ แล้วมีผลเสียไหมครับ

ตอนนี้อยากเพิ่มฟังก์ชั่น กดติด ปล่อยดับขึ้นมาแต่ไม่แน่ใจว่าควรไว้ตรงไหนดีครับ

มีข้อสงสัยอีกข้อครับ คือฟังก์ด้านล่างนี้ สั่งให้เมื่อกด Switch V7 ใน blynk ทำให้ relay ทำงานกับ led ใน blynk ติด ผลที่เห็น คือ led ใน blynk ติดประมาณ 1 วิ แล้วดับไป โดยที่ยังไม่ได้ กดปิดที่ Switch มีวิธีแก้ให้ led ติดจนกว่าเราจะกดปิดไหมครับ

ขอโทษนะครับผมถามเยอะเลย

อันนี้โค็ดปัจจุบันครับ


  #define BLYNK_PRINT Serial
  
// *** SYSTEM CONFIGURATION ***

    char auth[] = "d215d6f74aaa4659bc17575931090019";
    char ssid[] = "ABC99_2.4G";
    char pass[] = "99999999";
    
//LINE TOKEN

  #define LINE_TOKEN  "WRvPbVG4sX9y7HIyX0EjBSkSgnJetLh5ZBjY22aaFCt"  
  
// *** LIBRARY INCLUDE ***

  #include <TridentTD_LineNotify.h>
  #include <WiFi.h>
  #include <BlynkSimpleEsp32.h>
  #include <DHT.h>

//ระบุรุ่นเซ็นเซอร์วัดความชื้นสัมพัทธ์และอุณมหภูมิเป็นรุ่น DHT22
  
  #define DHTTYPE DHT22 
  
//ค่าเปอร์เซ็นต์ความชื้นในดินที่ต้องการให้เร่ิมรดน้ำต้นไม้

  #define TempCooling 31
  #define HumFanning 79
  
// *** GPIO PIN SETUP ***

  #define DHTPIN 32
  #define LdrSensorPIN 35
  #define ButtonCoolPIN 25
  #define ButtonFanPIN 33
  #define LEDSensorPIN 26
  #define CoolingPIN 27
  #define FanningPIN 14
  #define LEDWiFiPIN 2
  #define LEDCoolingPIN 4
  #define LEDFanningPIN 15 
  #define RelayCoolPIN 5
  #define RelayFanPIN 18

//การกำหนดขา Vitual Pin ที่สร้างขึ้นให้กับ Widget ต่างๆ ใน Blynk Mobile APP

  #define Widget_Humidity V1
  #define Widget_Temperature V2
  #define Widget_LightRawValue V5
  #define Widget_LightLevel V6
  #define Widget_CoolingButton V7
  #define Widget_FanningButton V14
  #define Widget_SendSensorStatus V8
  #define Widget_CoolingStatus V9
  #define Widget_FanningStatus V13
  #define Widget_WifiSignal V10
  #define Widget_WifiRawValue V11
  #define Widget_Terminal V12
  
    WidgetLED LEDSensor(Widget_SendSensorStatus);
    WidgetLED LEDCooling(Widget_CoolingStatus);
    WidgetLED LEDFanning(Widget_FanningStatus);
    WidgetTerminal terminal(Widget_Terminal);
     
    
//เรียกใช้การตั้งเวลาของ Blynk

    BlynkTimer timer;
    DHT dht(DHTPIN, DHTTYPE);
    
//กำหนดตัวแปรเริ่มต้น

     int WifiSignal;
     bool isFirstConnect = true;
     byte oldtemperature;
     byte oldhumidity;
     int CurrentWiFiSignal;
     int MapReadLightValue;
     int CurrentLightValue;
     int h;
     int t;
    
// *** BLYNK CONNECTED FUNCTION ***

    BLYNK_CONNECTED() {
         digitalWrite(LEDWiFiPIN, HIGH);
      if(isFirstConnect) {
         Blynk.syncAll();
  //       Blynk.syncVirtual(Widget_FanningButton);
  //       Blynk.syncVirtual(Widget_CoolingButton);
      isFirstConnect = false;
   }
} 

// *** BLYNK BUTTON FUNCTION ***
     BLYNK_WRITE(Widget_CoolingButton) {
        if (param.asInt() == 1) {
        if (digitalRead(RelayCoolPIN) != LOW) {
            digitalWrite(RelayCoolPIN, LOW);
            LEDCooling.on();
            LINE.notify("กำลังทำความเย็น");
      } 
  } 
        else if(param.asInt() == 0) {
            digitalWrite(RelayCoolPIN, HIGH);
            LEDCooling.off(); 
            LINE.notify("หยุดทำความเย็น"); 
    }
}

     BLYNK_WRITE(Widget_FanningButton) { 
        if (param.asInt() == 1) {
        if (digitalRead(RelayFanPIN) != LOW) {
            digitalWrite(RelayFanPIN, LOW);
            LEDFanning.on();
            LINE.notify("กำลังระบายความชื้น");
      } 
   } 
        else if(param.asInt() == 0) {
            digitalWrite(RelayFanPIN, HIGH);
            LEDFanning.off();
            LINE.notify("หยุดระบายความชื้น");  
   }
}

// *** FUNCTION SETUP() ***

     void setup() {
         Serial.begin(115200);
         dht.begin();

//กำหนดโหมดใช้งานให้กำขา GPIO

      pinMode(LEDWiFiPIN, OUTPUT);
      pinMode(LEDSensorPIN, OUTPUT);
      pinMode(LEDCoolingPIN, OUTPUT);
      pinMode(LEDFanningPIN, OUTPUT);
      pinMode(CoolingPIN, OUTPUT);
      pinMode(FanningPIN, OUTPUT);
      pinMode(RelayCoolPIN, OUTPUT);
      pinMode(RelayFanPIN, OUTPUT);
      pinMode(ButtonCoolPIN, INPUT_PULLUP);
      pinMode(ButtonFanPIN, INPUT_PULLUP);

//ตั้งสถานะเริ่มต้นให้กับขา GPIO เพื่อป้องกันการทำงานเองตอนที่บอร์ด ESP32 รีบูต

      digitalWrite(LEDWiFiPIN, LOW);
      digitalWrite(LEDSensorPIN, LOW);
      digitalWrite(LEDCoolingPIN, LOW);
      digitalWrite(LEDFanningPIN, LOW);
      digitalWrite(RelayCoolPIN, HIGH);
      digitalWrite(RelayFanPIN, HIGH);
      
      Serial.println("Setting IO Done.");

   timer.setInterval(1000L, GetDHT22);
   timer.setInterval(1000L, sendSensor);
   timer.setInterval(100L, sendGraph);
   timer.setInterval(5000L, Task3);
   timer.setInterval(1000L, Task2);
   timer.setInterval(1000L, Task1);
/*
     xTaskCreate(&Task1, "Task1", 4096, NULL, 1, NULL);

     xTaskCreate(&Task6, "Task6", 4096, NULL, 1, NULL);

     xTaskCreate(&Task2, "Task2", 4096, NULL, 1, NULL);

     xTaskCreate(&Task7, "Task7", 4096, NULL, 1, NULL);
     
     xTaskCreate(&Task3, "Task3", 4096, NULL, 1, NULL);
     
     xTaskCreate(&Task8, "Task8", 4096, NULL, 1, NULL);
     
     xTaskCreate(&Task4, "Task4", 4096, NULL, 1, NULL);
     
     xTaskCreate(&Task5, "Task5", 4096, NULL, 1, NULL);
     
     xTaskCreate(&Task9, "Task9", 4096, NULL, 1, NULL);
     
     xTaskCreate(&Task10, "Task10", 4096, NULL, 1, NULL);
*/
//ทำการเชื่อมต่อ WiFi

         LINE.setToken(LINE_TOKEN);
         Blynk.connectWiFi(ssid, pass);

//แสดงข้อความใน Serial Monitor

           Serial.println();
           Serial.println("Welcom to smartfram IoT");
           Serial.print("WiFi Connected: ");
           Serial.println(WiFi.localIP());
           Serial.print("WiFi signal RSSI: ");
           Serial.print(WiFi.RSSI());
           Serial.println("dBm");


//ทำการเชื่อมต่อ BLYNK SERVER

      Blynk.config(auth,"Blynk.jpnet.co.th",8080);
      Blynk.connect();
 }
 
// *** FUNCTION LOOP() ***

    void loop() {
       timer.run();
       Blynk.run();
 }

// *** FUNCTION SENDSENSOR() ***

    void sendSensor() {
       digitalWrite(LEDWiFiPIN, HIGH);
          LEDSensor.on();
       Serial.println(", Send data to blynk server");
       Serial.print(", Wifi Signal: ");
       Serial.print(WifiPercentSignal());
       Serial.println("%");
          Blynk.virtualWrite(Widget_Humidity, dht.readHumidity());
          Blynk.virtualWrite(Widget_Temperature, dht.readTemperature());
          Blynk.virtualWrite(Widget_LightRawValue, analogRead(LdrSensorPIN));
          Blynk.virtualWrite(Widget_LightLevel, LdrPercentValue());
          Blynk.virtualWrite(Widget_WifiSignal, WifiPercentSignal());
          Blynk.virtualWrite(Widget_WifiRawValue, WiFi.RSSI());
       Serial.println(", Send DHT22 / LDR sensors / WIFIto blynk server.");
          digitalWrite(LEDWiFiPIN, LOW);
          LEDSensor.off();
}

     void sendGraph(){          
          Blynk.virtualWrite(V12, WifiPercentSignal());
          Blynk.virtualWrite(V23, LdrPercentValue());
          Blynk.virtualWrite(V22, dht.readTemperature());
          Blynk.virtualWrite(V21, dht.readHumidity());
     }

// *** FUNCTION GetDHT11 ***

     void GetDHT22() {
       float h = dht.readHumidity();
       float t = dht.readTemperature(); 
       int count = 1;
     while(isnan(h) || isnan(t)&& count <= 4) {
         Serial.println(", DHT22 get failed ");
         Serial.print(count);
           dht.readHumidity();
           dht.readTemperature();
           count++;
         vTaskDelay(1500/ portTICK_PERIOD_MS);
     if(count == 4)  
           LINE.notify("DHT22 get failed 4 times.");
  }
     if(isnan(h)) 
          h = oldhumidity;
     if(isnan(t)) 
          t = oldtemperature;
        Serial.print(", Humidity: ");
        Serial.print(h);
        Serial.print("% | ");
        Serial.print("Temperature: ");
        Serial.print(t);
        Serial.println("C");
        
//เก็บสำรองข้อมูล temperature & humidity

    oldtemperature = t;
    oldhumidity = h;
}

// *** (19) FUNCTION WifiPercentSignal ***

//หาค่าสัญญาณ RSSI ของ WIFI แล้ว MAP ให้อยู่ในรูปของเปอร์เซ็นต์

     int WifiPercentSignal() {
          CurrentWiFiSignal = WiFi.RSSI();
            if(CurrentWiFiSignal > -40) CurrentWiFiSignal = -40;
            if(CurrentWiFiSignal < -90) CurrentWiFiSignal = -90;
         WifiSignal = map(CurrentWiFiSignal, -90, -40, 0, 100);
     return WifiSignal;
}

// *** (21) FUNCTION LdrPercentValue ***

//อ่านค่าจากเซ็นเซอร์อนาล๊อก LDR

     int LdrPercentValue() {
          CurrentLightValue = analogRead(LdrSensorPIN);
            if(CurrentLightValue > 4000) CurrentLightValue = 4000;
            if(CurrentLightValue < 100) CurrentLightValue = 100;
          MapReadLightValue = map(CurrentLightValue, 4000, 100, 0, 100);
            Serial.print(", Light sensor value: ");
            Serial.println(MapReadLightValue);
     return MapReadLightValue;
}

void Task1()  {
         if (dht.readTemperature() >= 32 && dht.readTemperature() != 0) {
              digitalWrite(CoolingPIN, 0); 
                 digitalWrite(LEDCoolingPIN, HIGH);
                 LEDCooling.on();
                 digitalWrite(RelayCoolPIN, LOW);
                 Blynk.virtualWrite(Widget_CoolingButton, 1);
                     terminal.println(", Start");
                     Serial.println(", Air running...");
   //                  LINE.notify("กำลังทำความเย็น");
            } else { digitalWrite(CoolingPIN, 1); 
                 digitalWrite(LEDCoolingPIN, LOW);
                 LEDCooling.off();
                 digitalWrite(RelayCoolPIN, HIGH);
           }
     }

void Task2()  {
         if (dht.readHumidity() >= 79 && dht.readHumidity() != 0) {
              digitalWrite(LEDFanningPIN, HIGH);
                 LEDFanning.on();
                 digitalWrite(RelayFanPIN, LOW);
                 Blynk.virtualWrite(Widget_FanningButton, 1);
                     terminal.println(", Start");
                     Serial.println(", Ventilating...");
    //                 LINE.notify("กำลังระบายความชื้น");
            } else { digitalWrite(FanningPIN, 1); 
                 digitalWrite(LEDFanningPIN, LOW);
                 LEDFanning.off();
                 digitalWrite(RelayFanPIN, HIGH);
           }
}


 void Task3() {  
                 if(WiFi.status() != WL_CONNECTED) {      
                     digitalWrite(LEDWiFiPIN, LOW);
                     Serial.println("WiFi Disconnected.");      
                     WiFi.begin((char*)ssid, (char*)pass);    
        } 
            else {      
                     digitalWrite(LEDWiFiPIN, HIGH);
        }  
  }
  
/*
// TASK1: ลูปเช็คอุณหภูมิ
      void Task1(void *pvParameter){
        for (;;){
            if(dht.readTemperature() <= TempCooling && dht.readTemperature() != 0) {
              digitalWrite(CoolingPIN, 0); 
                 digitalWrite(LEDCoolingPIN, HIGH);
                 LEDCooling.on();
                 digitalWrite(RelayCoolPIN, LOW);
                 Blynk.virtualWrite(Widget_CoolingButton, 1);
                     terminal.println(", Start");
                     Serial.println(", Air running...");
                     LINE.notify("Air running...");
            } else { digitalWrite(CoolingPIN, 1); 
                 digitalWrite(LEDCoolingPIN, LOW);
                 LEDCooling.off();
                 digitalWrite(RelayCoolPIN, HIGH);
                 Blynk.virtualWrite(Widget_CoolingButton, 0);
                     terminal.println(", Stop");
                     Serial.println(", Air Stopping...");
                     LINE.notify("Air Stopping...");
           }
                vTaskDelay(1000 / portTICK_PERIOD_MS);
     }
  }

//TASK6: ลูปเช็คค่าความชื้น
     void Task6(void *pvParameter){
       for (;;) {
           if(dht.readHumidity() >= HumFanning && dht.readHumidity() != 0) {
              digitalWrite(LEDFanningPIN, HIGH);
                 LEDFanning.on();
                 digitalWrite(RelayFanPIN, LOW);
                 Blynk.virtualWrite(Widget_FanningButton, 1);
                     terminal.println(", Start");
                     Serial.println(", Stop Ventilating...");
                     LINE.notify("Stop Ventilating...");
            } else { digitalWrite(FanningPIN, 1); 
                 digitalWrite(LEDFanningPIN, LOW);
                 LEDFanning.off();
                 digitalWrite(RelayFanPIN, HIGH);
                 Blynk.virtualWrite(Widget_FanningButton, 0);
                     terminal.println(", Stop");
                     Serial.println(", Stop Ventilating...");
                     LINE.notify("Stop Ventilating...");
           }
                vTaskDelay(2000 / portTICK_PERIOD_MS);
     }
  }
  
// TASK2: ลูปเช็คสถานะของสวิตซ์ ถ้ามีการกดสวิตซ์จะเป็นการเปิดปั๊มคูลลิ่ง
     void Task2(void *pvParameter){
       for (;;) {
         boolean state = 0;
         boolean data;
         data = digitalRead(ButtonCoolPIN);
           if(data == 0) {
              vTaskDelay(10 / portTICK_PERIOD_MS);
           }
                if(digitalRead(ButtonCoolPIN) == 0) {
                   digitalWrite(RelayCoolPIN, HIGH);
      }
           else 
               if(data == 1 ){
                  vTaskDelay(10 / portTICK_PERIOD_MS);
           }
                   if(digitalRead(ButtonCoolPIN) == 1) {
                      digitalWrite(RelayCoolPIN, LOW);
      } 
           vTaskDelay(100 / portTICK_PERIOD_MS);
    }
   }

//TASK7: ลูปเช็คสถานะของสวิตซ์ ถ้ามีการกดสวิตซ์จะเป็นการเปิดพัดลม
        void Task7(void *pvParameter){
           for (;;) {   
             boolean state = 0;
             boolean data;
                  data = digitalRead(ButtonFanPIN);
                    if(data == 0 ) {
                       vTaskDelay(10 / portTICK_PERIOD_MS);
                    }
                          if(digitalRead(ButtonFanPIN) == 0) {
                              digitalWrite(RelayFanPIN, HIGH);
            }
                 else if 
                    (data == 1 ) {
                         vTaskDelay(10 / portTICK_PERIOD_MS);
                  }
                      if(digitalRead(ButtonFanPIN) == 1) {
                           digitalWrite(RelayFanPIN, LOW);
           }
                   vTaskDelay(100 / portTICK_PERIOD_MS);
        }
      }



//TASK4: ลูปเช็คสัญญาณ wifi ถ้าติดต่อไม่ได้ให้ต่อใหม่
        void Task4(void *p) {  
            for (;;) {
                 if(WiFi.status() != WL_CONNECTED) {      
                     digitalWrite(LEDWiFiPIN, LOW);
                     Serial.println("WiFi Disconnected.");      
                     WiFi.begin((char*)ssid, (char*)pass);    
        } 
            else {      
                     digitalWrite(LEDWiFiPIN, HIGH);
        }  
      vTaskDelay(5000 / portTICK_PERIOD_MS); 
  }
}


void Task10(void *p) {  
  for(;;) {    
    if(!Blynk.connected()){    
      //แสดงข้อความบนคอนโซล
      Serial.println("Not connected to Blynk server.");
      Serial.println("Connecting to Blynk server...");
      Blynk.disconnect();
      //delay(1000);
      vTaskDelay(1000 / portTICK_PERIOD_MS);
      if(WiFi.status() == WL_CONNECTED){
        Blynk.config(auth,"Blynk.jpnet.co.th",8080);
        Blynk.connect();  
      } 
      // try to connect to server  
    }  
    vTaskDelay(10000 / portTICK_PERIOD_MS); 
  } //while
} 
 /*-------------------------------------------------*/