ตั้งเวลา เปิด-ปิด ไฟด้วย Time Input


#1

ขอสอบถามหน่อยคะ แอพblynk ตั้งเวลาเปิดไฟเวลา18.00-06.00 แต่พอถึงเวลา00.00 ไฟดับแล้วไม่ติดอีกเลยต้องแก้ยังไงคะ


(Permpol Thanapunnamas) #2

ใช้ widget ตัวไหนครับ

timer

หรือ time input


#3

Time input ค่ะ


(Permpol Thanapunnamas) #4

ต้องดูจากโค้ตที่ใช้ครับ ถึงจะบอกได้


#5
#define BLYNK_PRINT Serial   
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <TimeLib.h>
#include <WidgetRTC.h>
//-------------------------------------------------------------------
char Date[16];
char Time[16];
long startsecondswd;            // weekday start time in seconds
long stopsecondswd;             // weekday stop  time in seconds
long nowseconds;                // time now in seconds
#define LED 16

char auth[] = "--------------------------";

boolean oldState;

char ssid[] = "AndroidAP"; 
char pass[] = "0875464362";

BlynkTimer timer;
//---------------------------------------------
//--------------------------------------------------------------------------

BLYNK_CONNECTED()
{
    Blynk.syncAll();
}
WidgetTerminal terminal(V3);
WidgetLED Led(V4);
WidgetRTC rtc;



//--------------------------------------------
void activetoday(){        // check if schedule should run today
  if(year() != 1970){  
    Blynk.syncVirtual(V1);   
  }
}

BLYNK_WRITE(V1) {  
  sprintf(Date, "%02d/%02d/%04d",  day(), month(), year());
  sprintf(Time, "%02d:%02d:%02d", hour(), minute(), second());
  //Blynk.virtualWrite(V13, Time);
  TimeInputParam t(param);
  
  terminal.print("Checked schedule at: ");
  terminal.println(Time);
  int dayadjustment = -1;  
  if(weekday() == 1){
    dayadjustment =  6; // needed for Sunday, Time library is day 1 and Blynk is day 7
  }
  if(t.isWeekdaySelected((weekday() + dayadjustment))){ //Time library starts week on Sunday, Blynk on Monday
    terminal.println("Schedule ACTIVE today");
     
    if (t.hasStartTime()) // Process start time
    {
      terminal.println(String("Start: ") + t.getStartHour() + ":" + t.getStartMinute());
    }
    if (t.hasStopTime()) // Process stop time
    {
      terminal.println(String("Stop : ") + t.getStopHour() + ":" + t.getStopMinute());
    }
    
    terminal.println(String("Time zone: ") + t.getTZ()); // Timezone is already added to start/stop time 

    for (int i = 1; i <= 7; i++) {  // Process weekdays (1. Mon, 2. Tue, 3. Wed, ...)
      if (t.isWeekdaySelected(i)) {
        terminal.println(String("Day ") + i + " is selected");
      }
    } 
    nowseconds = ((hour() * 3600) + (minute() * 60) + second());
    
    startsecondswd = (t.getStartHour() * 3600) + (t.getStartMinute() * 60);
 
    if(nowseconds >= startsecondswd){   
      terminal.print("LED STARTED");
      terminal.println(String(" ") + t.getStartHour() + ":" + t.getStartMinute());
       if(nowseconds <= startsecondswd + 30){    // 90s on 60s timer ensures 1 trigger command is sent
  
         digitalWrite(LED, LOW);;// code here to switch the relay ON
         Led.on();
         }      
    }
    else{
      digitalWrite(LED, HIGH); // code here to switch the relay OFF
      Led.off();  
      terminal.println("LED NOT STARTED today");          
    }
    stopsecondswd = (t.getStopHour() * 3600) + (t.getStopMinute() * 60);
    if(nowseconds >= stopsecondswd){
      terminal.print("LED STOPPED at");
      terminal.println(String(" ") + t.getStopHour() + ":" + t.getStopMinute());
      if(nowseconds <= stopsecondswd + 30){   // 90s on 60s timer ensures 1 trigger command is sent
        digitalWrite(LED, HIGH); // code here to switch the relay OFF
        Led.off();
        }              
    }
    else{
      if(nowseconds >= startsecondswd){  // only show if motor has already started today
        digitalWrite(LED, LOW); // code here to switch the relay OFF
        Led.on();
         terminal.println("LED is still RUNNING");
      }          
    }
  }
  else{
    terminal.println("Schedule INACTIVE today");  
  }
  terminal.println();
}



void reconnectBlynk() {
  if (!Blynk.connected()) {
    if(Blynk.connect()) {
      BLYNK_LOG("Reconnected");
    } else {
      BLYNK_LOG("Not reconnected");
    }
  }
}

void setup() {
 Serial.begin(115200); // See the connection status in Serial Monitor
  Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080);
  rtc.begin();
    
  pinMode(LED,OUTPUT); //26
  digitalWrite(LED,HIGH);
  Led.off();
  
   int mytimeout = millis() / 1000;
  while (Blynk.connect() == false) { // try to connect to server for 10 seconds
    if((millis() / 1000) > mytimeout + 8){ // try local server if not connected within 9 seconds
       break;
    }
  }

  timer.setInterval(10000L, reconnectBlynk);  // check every 30s if still connected to server 
  timer.setInterval(20000L, activetoday);  // check every minute if schedule should run today 
  }
  
void loop()
{
  if (Blynk.connected()) {
    Blynk.run();
  }
  timer.run(); 
}

  
  //active low นะคะ

(Permpol Thanapunnamas) #6

แคปหน้า serial มาให้ดูด้วยครับ ถ้ามีน่าจะไปเข้าลูปนี้เลยดับ


(Permpol Thanapunnamas) #7

ลองแทนค่าเวลาลงไปในตัวแปรเหล่านี้ แล้วน้องจะเข้าใจครับว่าทำไมมันถึงดับก่อน แล้วจะแก้ไขมันได้อย่างไร
ตัวแปรที่ต้องแทนค่า

nowseconds คือ เวลาปัจจุบัน
startsecondswd คือ เวลาที่เริ่ม(ที่เราตั้งให้เปิด)
stopsecondswd คือ เวลาจบ(ที่เราตั้งให้ปิด)

//// loop Start time
    nowseconds = ((hour() * 3600) + (minute() * 60) + second()); 
    startsecondswd = (t.getStartHour() * 3600) + (t.getStartMinute() * 60);

    if(nowseconds >= startsecondswd){   

       if(nowseconds <= startsecondswd + 30){    // 90s on 60s timer ensures 1 trigger command is sent
  
         digitalWrite(LED, LOW);;// code here to switch the relay ON
         Led.on();
         }      
    }
    else{
      digitalWrite(LED, HIGH); // code here to switch the relay OFF
      Led.off();        
    }
    //// loop End time
    stopsecondswd = (t.getStopHour() * 3600) + (t.getStopMinute() * 60);
    if(nowseconds >= stopsecondswd){

      if(nowseconds <= stopsecondswd + 30){   // 90s on 60s timer ensures 1 trigger command is sent
        digitalWrite(LED, HIGH); // code here to switch the relay OFF
        Led.off();
        }              
    }
    else{
      if(nowseconds >= startsecondswd){  // only show if motor has already started today
        digitalWrite(LED, LOW); // code here to switch the relay OFF
        Led.on();
         terminal.println("LED is still RUNNING");
      }          
    }

  else{
    terminal.println("Schedule INACTIVE today");  
  }

#8

ลองแทนแล้วแต่ก็ยัง งงๆอยู่ค่ะ รบกวนแก้ให้เลยได้มั้ยคะ


(Permpol Thanapunnamas) #9

ถ้าต้องการใช้งาน time input น้องต้องเข้าใจ เคสนี้ให้ได้ครับ ไม่งั้นย้ายไปใช้ timer ดีกว่าไม่ต้องใช้โค้ตอะไร จริงๆ ก็อยากแทนให้เลยครับ แต่น้องจะไม่ได้อะไรเลยถ้าให้ผมคิดให้ ผมใบ้ให้สุดๆ แล้ว

ลองแทนดูหัดอ่าน แทนค่าแล้วไม่เข้าใจก็ถามได้เลยผมยินดีตอบตลอดครับ


(Permpol Thanapunnamas) #10

สมมติ เวลา 00:00 = 0x60 = 0
และ 24:00 = 24x60 = 3600

เอาเวลาที่น้องตั้งมาคิด แล้วแทนค่า ดู อ่านตามตัวดำเนินการ ถ้าเป็นจริง มันเข้าไปทำงานคำสั่งไหน


(Permpol Thanapunnamas) #11

แค่โฟกัสที่บรรทัดนี้น้องก็ได้คำตอบแล้วครับ