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

ตอนนี้ผมสร้าง 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
} 
 /*-------------------------------------------------*/

ตอนนี้ เชื่อมได้หรือยังครับสรุปหน่อย มีข้อสงสัยก็ถามได้เลยครับ อาจจะตอบช้า บ้างเร็วบ้าง เพราะผมก็ทำงานประจำเหมือนกัน 5555

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

ต้องดูว่าปุ่ม v7 กำหนดเป็นอะไรครับ

ถ้าอยากให้ติดค้าง เลือกไปที่ sw ถ้าเป็น push ก็เหมือนกดติดปล่อยดับครับ ทำงานครั้งเดียว

เชื่อมต่อ และทำงานได้ปกติแล้วครับ
แต่เป็นห่วงเรื่องประสิทธิภาพการทำงานครับ อย่างที่พี่บอก ฟังก์ชั่นที่ผมเพิ่มเข้ามาอีก มันทำงานอยู่บน core เดียวกัน ถ้าเป็นอย่างนั้นมันจะทำให้ตัวบอร์ดทำงานหนักไปไหมครับ

ส่วนปัญหา sw V7 คือผมทำเป็น แบบ sw แล้วครับแต่มันกลับไม่ยอมติดค้างครับ ควรแก้ไขอย่างไรครับ


อยากรู้ว่าตอน LED มัน off มันส่งข้อความนี้เข้า line รึป่าวครับ

image

ถ้าไม่แน่ใจใส่คำสั่ง print ออกมาดูหน่อย

เท่าที่ดูแล้วน่าจะไม่เข้า แต่มันไปเข้าสอง task นี้แทน led มันเลย off

ส่วนเรื่องความเสถียรนั้นวัดกันที่ การทำงานจริงครับ ถ้าเอามันลองรันได้ยาวๆ ไม่รีเซตบ่อยๆ ทำงานได้ปกติ ก็โอเคแล้วครับ

อ้อเข้าใจแล้วครับ ขอบคุณครับ
ใช่ครับไม่มีการสั่งหยุดทำงานครับ ถ้าไม่ได้กดปิดครับ มันไปเข้าคำสั่งใน void task1 จริงๆครับ

ตอนนี้อยากเพิ่ม sw ภายนอกแบบกดเปิด กดปิด ควรเพิ่งฟังก์ชั่นไว้ส่วนไหนดีครับ

ก็ใส่ไว้ใน void loop เลยครับ

ถ้าเราจะเอาค่าในฟังก์ชั่น :point_down:t2:

image

ไปดักใน else if (…) ของฟังก์ชั่น :point_down:t2:

ต้องใช้ค่าตัวไหนไปดักไม่ให้มันสั่งดับครับ

เอาไปดักได้ครับ แต่มันจะเข้าไปกวนการทำงานของ task ให้ทำงานผิดจากเดิม เพราะมันเกิดจากฟังก์ชันอื่น

แนะนำให้เอาอัลกอลิทึมนี้ไปประยุกค์ใช้ครับ

เอาเฉพาะชุดนี้มาใส่ใน task

จากนั้นใน else { }

ให้เพิ่ม

 if (lock == true) {
LED.off();
lock = false;
}

เข้าไป ความหมายคือ ให้มันทำงานใน if บนก่อน เมื่อทำแล้ว ค่อยมาทำข้างล่าง มันจะล๊อกเฉพาะคำสั่งที่เราต้องการ เพราะจริงๆ ถ้ามันยังไม่ on มันก็ไม่จำเป็นต้องสั่งให้มัน off

นำมาใส่ใน task นี่คือ หมายถึง void task1 ที่ผมสร้างขึ้นมาใช่ไหมครับ

https://scontent.fbkk13-1.fna.fbcdn.net/v/t1.15752-9/74582178_3047327432160079_7307332541369810944_n.jpg?_nc_cat=108&_nc_oc=AQkywhbp-LwsfGMJZLnsORZkXtgL9lnhf-PmY7UBjinedTb9ZVRNxnfu2ds9w8URVfk&_nc_ht=scontent.fbkk13-1.fna&oh=93f56d582d593b03fbb9cbf9f0386345&oe=5E50F0EF

ทั้งสอง task เลยครับ น่าจะ หลุดทั้งสอง task เลย วิธีใส่ก็ นับจาก if else วงนอกสุดเป็นหลัก ดู ตย ที่ผมลงให้

แบบนีหรอครับ ขอโทษนะครับ ผมงง
ปล. ในความคิดผมที่ไม่อยากให้ V9 กับ V13 ( LED ใน Blynk ) ดับหลังกดสวิชเปิด เพราะว่ากลัว relay ที่สั่งให้ทำงานพร้อมกันหลังกดให้มีค่าเป็น 1 จะดับไปด้วยนะครับ พี่เข้าใจผมนะครับ

https://scontent.fbkk12-4.fna.fbcdn.net/v/t1.15752-9/73425126_461271977825897_9109349300915142656_n.jpg?_nc_cat=103&_nc_oc=AQm5hM2fsGYG3xnofryBSdAfh305GP4rNbrZ_qh1hjx_t-MhYpHppf7_h917XxW56vQ&_nc_ht=scontent.fbkk12-4.fna&oh=b0fdf4fc14d394442a91f8ea40236935&oe=5E5DE6AB
https://scontent.fbkk12-1.fna.fbcdn.net/v/t1.15752-9/74958171_682209445635216_4520405160089878528_n.jpg?_nc_cat=101&_nc_oc=AQnL7qp0OeElRNAij1tmC7NhE0AYkCd37WZTmcmHfr-bMy2m0cnFK4-oUPjWbK8vbS0&_nc_ht=scontent.fbkk12-1.fna&oh=f38b3c3cba1cdb3922b26cbb5c68a455&oe=5E646AF0

ที่กำลังทำกันอยู่นี้ก็เป็นการไม่ให้ led ดับตอนกดเปิดไงครับ เพราะ ใน task ทั้งสองมีสถานะเป็น false อยู่มันเลยวิ่งเข้าไปที่ else{ } ซึ่ง else มีคำสั่ง ให้ led off อยู่ แล้วมันก็วิ่งผ่านคำสั่ง led off อยู่ตลอดเวลา

วิธีที่การที่จะให้ทำคือ การ lock ไม้ให้ คำสั่ง led off ทำงานตลอด ให้ครอบ if เฉพาะ คำสั่ง led off เท่านั้นครับ คำสั่งอื่นเราไม่ได้สนใจ ลองไล่ ลอจิกดูเอาให้เข้าใจก่อนว่าใส่ไปทำไม

แต่ว่ามีปัญหาใหม่ครับพี่ ขอรบกวนอีกหน่อยนะครับ

คือเมื่อ ความชื้น หรือ อุณหภูมิ สูงเกินตามที่กำหนด relay จะทำงาน และเมื่อความชื้น หรือ อุณหภูมิ ลดลงถึงตามที่กำหนด LED ยังติดต่อไปไม่ยอมหยุดครับ ต้องกด sw ปิดเอง ถึงจะดับครับ

ได้แล้วครับ ขอบคุณครับ

แก้ไขด้วยวิธีไหนแชร์ไอเดียร์ หน่อยนะครับ จะได้เคลียร์ ปัญหาขั้นสุด และปิดประเด็นกระทู้นี้ ครับ

แก้ไขตามที่พี่บอกเลยครับ เอา lock ไปใส่ครับ ได้ผลตามที่บอกเลยครับ led ไม่ดับถ้าเราไม่กดครับ
ส่วนเรื่องที่ผมบอกว่า

"แต่ว่ามีปัญหาใหม่ครับพี่ ขอรบกวนอีกหน่อยนะครับ คือเมื่อ ความชื้น หรือ อุณหภูมิ สูงเกินตามที่กำหนด relay จะทำงาน และเมื่อความชื้น หรือ อุณหภูมิ ลดลงถึงตามที่กำหนด LED ยังติดต่อไปไม่ยอมหยุดครับ ต้องกด sw ปิดเอง ถึงจะดับครับ"

เนื่องจากตอนแรกผมเอา bool lock = false; ไปไว้ในฟังก์ชั่นของ viod task1() ครับ ระบบจึงน่าจะเข้าใจผิด ผมเลยย้ายไปไว้ใน void setup() ครับ ตอนนี้ระบบทำงานได้ปกติเลยครับ ถึง ความชื้น หรือ อุณหภูมิ ตามที่กำหนด relay ก็หยุดการทำงานครับ ขอบคุณมากครับ

1 Likes

เยี่ยมครับ ไหวพริบดีมาก พื้นฐานดีก็คุยกันง่ายหน่อย มีความรู้หรือเทคนิกดีๆ ก็เอามาแชร์กันนะครับ

1 Likes