สอบถามความรู้ด้าน Delay เครื่องใช้ไฟฟ้า การเปิด / ปิด Automatic

อยากทราบแนวทาง การใช้ Delay ยกตัวอย่างเช่น

อยากเราเซตอุณหภูมิไว้ที่ 25 องศาเซลเซียส (ณ เวลานี้ อุณหภูมิ 30 องศาเซลเซียส)

Relay1 ติด เพื่อที่ให้อุณหภูมิลดลง = 25 องศาเซลเซียส

ปัญหาคือ พออุณหภูมิอยู่ระหว่างช่วง 25-26 องศาเซลเซียส จะเกิดอาการ ติด / ดับ ทำให้เครื่องใช้ไฟฟ้าเราเกิดการชำรุญ

อยากทราบแนวทาง การเขียนโค้ดครับ ขอบคุณครับ

หมายถึง Relay รึป่าวครับ

ใช่ครับโดย คำสั่งที่ช่วงเวลา การติดดับของเครื่องใช้ไฟฟ้านั้นๆ อะครับ

ถ้าเราใช้

if ( Temp >= 25) {
Relay1 ON
}else{
Relay1 Off
}

Temp = 26 Relay1 On
Temp = 25 Relay1 On
Temp = 24 Relay1 Off

if ( Temp == 25) {
Relay1 ON
}else{
Relay1 Off
}

Temp = 26 Relay1 Off
Temp = 25 Relay1 On
Temp = 24 Relay1 Off

ต้องเอาโค้ตมาดูครับว่าเขียนแบบไหนจึงเจอปัญหานี้

int setTempMin;
int setTempMax;
int setHumid;


BLYNK_WRITE(V21) //temperature slider in app on pin V21
{
setTempMin = param.asInt();
}

BLYNK_WRITE(V22) //temperature slider in app on pin V22
{
setTempMax = param.asInt();
}
BLYNK_WRITE(V23) //temperature slider in app on pin V23
{
setHumid = param.asInt();
}

void setup() {
  Serial.begin(115200); 
  pinMode (Relay1,OUTPUT);
  pinMode (Relay2,OUTPUT);
  pinMode (Relay3,OUTPUT);
  pinMode (Relay4,OUTPUT);
  pinMode (Ledin,OUTPUT);
  digitalWrite ( Ledin,LOW);
  digitalWrite (Relay1,HIGH);
  digitalWrite (Relay2,HIGH);
  digitalWrite (Relay3,HIGH);
  digitalWrite (Relay4,HIGH);

  WiFiManager wifiManager;
  
  wifiManager.resetSettings();

  wifiManager.autoConnect("AutoConnectAP");

  Serial.println("connected...yeey :)");

  Blynk.config(auth,"oasiskit.com", 8080);
  dht1.begin();
  dht2.begin(); // this seems to fail in combination with blynk, works just fine "offline" doesnt seam to read sensor 2 with blynk part of the code.. 

  timer.setInterval(2000L, sendsensor1);
  timer.setInterval(2000L, sendsensor2); // probobly not needed twice, timers are wierd things... wiki.. 
}


void loop() {
   //delay(2000);
  float h1 = dht1.readHumidity();
  float t1 = dht1.readTemperature();
  float f1 = dht1.readTemperature(true);
  if (isnan(h1) || isnan(t1) || isnan(f1)) {
  Serial.println(F("Failed to read from DHT sensor!"));
  return;
  }
  
  //auto
  if ( _button_ma == true){
    if ((t1 >= setTempMax)||(t1 <= setTempMin )||(h1 <= setHumid))
    {
    digitalWrite (Relay2,LOW);
    led2.on();
    }
    
    else
    { 
    digitalWrite (Relay2,HIGH);
    led2.off();
    }
    
    if (t1 >= setTempMax)
    {
    digitalWrite (Relay1,LOW);
    led1.on();
    }
    
    else if (t1 < setTempMax)
    {
    digitalWrite (Relay1,HIGH);
    led1.off();
    }
    
    if (t1 <= setTempMin )
    {
    digitalWrite (Relay4,LOW);
    digitalWrite (Ledin,HIGH);
    led4.on();
    }
    
    else if (t1 > setTempMin)
    {
    digitalWrite (Relay4,HIGH);
    digitalWrite (Ledin,LOW);
    led4.off();
    }
    
   if (h1 <= setHumid)
  {
    digitalWrite (Relay3,LOW);  
    led3.on();
  }
  
  else if (h1 > setHumid)
  {

    digitalWrite (Relay3,HIGH);
    led3.off();
  }
  
  }else{   //manual
            if (_button1 == true){
            digitalWrite(Relay1, LOW);
            led1.on();
        }else{
            digitalWrite(Relay1, HIGH);
            led1.off();
        }
                if (_button2 == true){
            digitalWrite(Relay2, LOW);
            led2.on();
        }else{
            digitalWrite(Relay2, HIGH);
            led2.off();
        }
                if (_button3 == true){
            digitalWrite(Relay3, LOW);
            led3.on();
        }else{
            digitalWrite(Relay3, HIGH);
            led3.off();
        }
                if (_button4 == true){
            digitalWrite(Relay4, LOW);
            digitalWrite (Ledin,HIGH);
            led4.on();
        }else{
            digitalWrite(Relay4, HIGH);
            digitalWrite (Ledin,LOW);
            led4.off();
        }
  }


นี้เป็นโค้ดแค่บางส่วนนะครับ ผมใช้ slider ของ blynk เป็นตัว setTem ครับ

1 Like

ส่วนไหนที่มีปัญหาครับ

เป็นแค่ Relay1 เท่านั้นใช่ไหม

void loop ครับ Relay1 แค่ยกตัวอย่างเฉยๆครับ Run โค้ดได้ปกตินะครับ เพียงอยากทราบสมการ delay time on/off อะครับ

setTempMax
setTempMin
setHumid

Relay… (LOW/HIGH)

คือปัญหามัน อยู่ช่วง ณ ค่านั้นๆ ก็จะ ติดดับๆ

อยากให้ที่ช่วงเวลาการติดดับ ของ Relay แต่ละตัวครับ

จะหน่วงเวลา เปิดปิดหรอครับ

อย่างเช่นระบบ แอร์แบบเก่า อะครับ

เขาจะมีช่วงเวลา ติดดับ อะครับ

หมายถึงจะใส่ช่วงเวลา เปิด / ปิด ให้ Relay ทำงานใช่ไหม

ใช่ครับผม …

(แนวคิด)
ปัญหานี้ เราคงต้องทำช่วงเวลาเอาไว้ 2 ช่วง นะครับ คือเราควรต้องมี Slide bar ใน Blynk 2 ตัวโดย

  1. ตัวที่ 1 คือค่า temp Min. (>=)
  2. ตัวที่ 2 คือค่า temp Max. (<=)
if (tempmin >= 25 and tempmax >= 30 ){

เงื่อนไข....

}

หมายถึง ถ้า Temp มีค่าอยู่ในช่วง 25 - 30 องศาเซลเซียส ก็ให้เงื่อนไขใน If ทำงาน

แต่ จะมีอยู่ 2 ช่วงครับที่เลี่ยงได้ไม่ง่ายนักคือ

  1. ช่วง temp min แกว่ง ไปมาระหว่าง 25.01 แล้วกลับมา 24.9
  2. ช่วง temp max แกว่ง ไปมาระหว่าง 30.1 แล้วกลับมา 30.0

วิธีแก้คือ ช่วงที่มันแกว่ง เราก็ใช้การหน่วงเวลา ก่อน สมมุติหน่วงไว้ 5 วินาที ก็หมายถึง ช่วงที่มันแกว่งก็อย่าให้มันทำงาน ก่อน รอ 5 วินาที กลับไปกลับมา เรื่อยๆ จนค่า เริ่มนิ่ง แล้วจึงทำเงื่อนไขใน If ต่อไป ok มันอาจจะใช้เวลาในการเชคค่า นิดหน่อย ช่วงแกว่ง แต่ก็สามารถลดปัญหาอุปกรณ์ทำงาน ตัดต่อถี่เกินไปได้ครับ

1 Like

ขอบคุณมากครับ ผมจะลองแก้โค้ดใหม่ครับ