รบกวนขอคำชี้แนะเรื่อง Blynk Time Input

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

//  LIBRARY
//====================================================
#define BLYNK_PRINT Serial
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>
#define EspSerial Serial3
#define ESP8266_BAUD 115200
ESP8266 wifi(&EspSerial);
#include <TimeLib.h>
#include <WidgetRTC.h>
#include <EEPROM.h>

//====================================================

//  DEKLARASI AWAL
//====================================================
char auth[] = "xxxxxxxxxxxxxxx";
char server[] = "oasiskit.com";
char ssid[] = "xxxxxxxxxxxxx";
char pass[] = "xxxxxxxxxxxxx";
int port = 8080;


//====Values WidgetLED=============================
  WidgetLED StatusLED1(V60);
  WidgetLED StatusLED2(V61);
//====END WidgetLED=============================


//====WidgetTimeInput========================================================
//SimpleTimer timer;
char Time[16];
BlynkTimer timer;
WidgetRTC rtc;
WidgetTerminal terminal(V13);
//bool isFirstConnect = true;
long currentTime; 
long TimeStart;
long TimeStop; 

//void requestTime() {
//  Blynk.sendInternal("rtc", "sync");
//}
//====End TimeInput========================================================


//====LED1================================================

BLYNK_WRITE(V2) {
  //Debug
  Serial.print("Got a valueLED1: ");
  Serial.println(param.asInt());
  
  if (param.asInt()) {
    digitalWrite(30, HIGH);
    StatusLED1.on();
    terminal.println("Turn on LED1");
    terminal.flush();
  }
  else {
    digitalWrite(30, LOW);
    StatusLED1.off();
    terminal.println("Turn off LED1");
    terminal.flush();
  }
}
//====END LED1===============================================

//====LED 2================================================

BLYNK_WRITE(V3) {
  //Debug
  Serial.print("Got a valueLED2: ");
  Serial.println(param.asInt());
  
  if (param.asInt()) {
    digitalWrite(32, HIGH);
    StatusLED2.on();
    terminal.println("Turn on LED2");
    terminal.flush();
  }
  else {
    digitalWrite(32, LOW);
    StatusLED2.off();
    terminal.println("Turn off LED2");
    terminal.flush();
  }
}
//====END LED2================================================


void setup()
{
  pinMode(30, OUTPUT);
  pinMode(32, OUTPUT);

  digitalWrite(30, LOW);
  digitalWrite(32, LOW);
  
  Serial.begin(115200);
  Serial3.begin(115200);

  delay(10);
  EspSerial.begin(ESP8266_BAUD);
  delay(10);

  //WiFi.begin(ssid, pass); //เชื่อมต่อ WiFi
  Blynk.begin(auth, wifi, ssid, pass, server, port);     //Reguler server
  //Blynk.begin(auth, wifi, ssid, pass, "192.168.43.120", 8080);    //Local server

  rtc.begin();
  timer.setInterval(10000L, activetoday);
  timer.setInterval(30000L, reconnectBlynk);
}

void activetoday() {       // check if schedule should run today
  if (year() != 1970) {    
      Blynk.syncVirtual(V20); // sync timeinput widget
      Blynk.sendInternal("rtc", "sync");
  }
}


BLYNK_WRITE(V20){
  sprintf(Time, "%02d:%02d:%02d", hour(), minute(), second());
  Serial.print("Time : ");
  Serial.println(Time);
  TimeInputParam t(param);
  
  currentTime = ((hour() * 3600) + (minute() * 60));
  Serial.print("Time Now : ");
  Serial.println(currentTime);
  
  TimeStart = (t.getStartHour() * 3600) + (t.getStartMinute() * 60);
  Serial.print("Time Start : ");
  Serial.println(TimeStart);

  TimeStop = (t.getStopHour() * 3600) + (t.getStopMinute() * 60);

  //loop Start time
  if (currentTime >= TimeStart){
      terminal.print("Now Time > Start Time");
      terminal.flush();
      if(currentTime <= TimeStart + 30){
        digitalWrite(30, HIGH); //LED On 
        //StatusLED1.on();
        terminal.println("LED ON");
        terminal.flush();
      }
        
  }else{
     /* terminal.print("Now Time < Start Time");
      terminal.flush();*/
      digitalWrite(30, LOW); //LED Off
      terminal.println("LED OFF");
      //StatusLED1.off();
  }
  //// loop End time
    if(currentTime >= TimeStop){
       digitalWrite(30, LOW); // set LED OFF
       terminal.println("LED OFF");
       if(currentTime <= TimeStop){
        digitalWrite(30, LOW); //set LED OFF
        terminal.println("LED OFF");
       }
    }
    else{
       if(currentTime >= TimeStart){
          digitalWrite(30, HIGH); // set LED ON
          terminal.println("LED ON");
       }
    }
 
  // Process timezone
  // Timezone is already added to start/stop time

  //Serial.println(String("Time zone: ") + t.getTZ());

//  for (int i = 1; i <= 7; i++) {
//    if (t.isWeekdaySelected(i)) {
//      Serial.println(String("Day ") + i + " is selected");
//    }else{
//      Serial.println(String("Day ") + i + " is not select");
//    }
//  }

}

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

void loop()
{
  Blynk.run();
  if ( Serial3.available() )   {
    Serial.write( Serial3.read() );
  }
  if ( Serial.available() )       {
    Serial3.write( Serial.read() );
  }

}

คือเวลาในบอร์ดมันดึงมาแสดงถูงต้องรึป่าวครับ

ตรงงนี้มันต้องตรงกันข้ามรึป่าว ขอคำอธิบายปัญหาเพิ่มเติมด้วยครับ

คือผมตั้งเวลาแล้ว แต่โปรแกรมไม่ทำงานให้ครับเมื่อถึงเวลาที่ตั้งไว้
เวลาในบอร์ดน่าจะถึงมาถูกนะครับถ้าดูจากในรูปตรง
Time คือเวลา ณ ปัจจุบัน (20:22:50)
Time Now คือเวลาที่แปลงรูปแบบมาแล้ว (7784)
Time Start คือเวลาที่ตั้งไว้ว่าจะให้เริ่ม (7844)

อธิบายตรงนี้ให้ผมฟังหน่อยครับ มันทำอะไรบ้าง

ภาพ

ตรวจว่าเวลาปัจจุบัน >= เวลาที่ที่ตั้งให้เริ่ม ถ้าจริง พิมพ์ว่า Now Time > Start Time จากนั้นมาตรวจสอบอีกเงื่อนไขว่า เวลาปัจจุบัน <= เวลาที่ตั้งให้เริ่ม + 30 ถ้าจริงให้สั่ง digital ขาที่ 30 เป็น HIGH เปิดไฟ และพิมพ์ LED ON ครับ

ผมลองเขียนดูแบบโค๊ดด้านล่างไม่ออกหนะครับ เลยหาดูโพสของคนอื่น เห็นแอดมินแนะนำเลยเอาโค๊ดที่แอดมินถามมาใช้ดูครับ

if(currentTime >= TimeStart && currentTime < TimeStop){
    terminal.print("LED ON");
    terminal.flush();
  }else{
    terminal.print("LED OFF");
    terminal.flush();
  }

แก้ไขโค๊ดเพิ่มเติม สามารถใช้งานได้แล้วครับ

//  LIBRARY
//====================================================
#define BLYNK_PRINT Serial
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>
#define EspSerial Serial3
#define ESP8266_BAUD 115200
ESP8266 wifi(&EspSerial);
#include <TimeLib.h>
#include <WidgetRTC.h>
#include <EEPROM.h>

//====================================================

//  DEKLARASI AWAL
//====================================================
char auth[] = "CY5tqu1d8NmgXUcTC9HFpqCkJMe2Yq8R";
char server[] = "oasiskit.com";
char ssid[] = "Office2.4G";
char pass[] = "glnvdgdj'";
int port = 8080;


//====Values WidgetLED=============================
  WidgetLED StatusLED1(V60);
  WidgetLED StatusLED2(V61);
//====END WidgetLED=============================

//=============================
char Time[16];
BlynkTimer timer;
WidgetRTC rtc;
WidgetTerminal terminal(V13);
bool isFirstConnect = true;
long currentTime; 
long TimeStart;
long TimeStop; 
String displaycurrenttimepluswifi;
//=============================

void setup()
{
  pinMode(30, OUTPUT);
  pinMode(32, OUTPUT);

  digitalWrite(30, LOW);
  digitalWrite(32, LOW);
  
  Serial.begin(115200);
  Serial3.begin(115200);

  delay(10);
  EspSerial.begin(ESP8266_BAUD);
  delay(10);

  //WiFi.begin(ssid, pass); //เชื่อมต่อ WiFi
  Blynk.begin(auth, wifi, ssid, pass, server, port);     //Reguler server
  //Blynk.begin(auth, wifi, ssid, pass, "192.168.43.120", 8080);    //Local server
  terminal.clear();
  
  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;
    }
  }
  
  rtc.begin();
  timer.setInterval(10000L, activetoday);
  timer.setInterval(30000L, reconnectBlynk);
  timer.setInterval(5000L, clockvalue);  // check value for time
}

//====WidgetTimeInput========================================================
BLYNK_CONNECTED() {
  if (isFirstConnect) {
    Blynk.syncAll();
    Blynk.notify("TIMER STARTING!!!!");
    isFirstConnect = false;
  }
}


void clockvalue() // Show time on Terminal
{
  int gmthour = hour();
  if (gmthour == 24) {
    gmthour = 0;
  }
  String displayhour =   String(gmthour, DEC);
  int hourdigits = displayhour.length();
  if (hourdigits == 1) {
    displayhour = "0" + displayhour;
  }
  String displayminute = String(minute(), DEC);
  int minutedigits = displayminute.length();
  if (minutedigits == 1) {
    displayminute = "0" + displayminute;
  }

  displaycurrenttimepluswifi = "Clock:  " + displayhour + ":" + displayminute + " ";
  Blynk.setProperty(V13, "label", displaycurrenttimepluswifi);

}



//====End TimeInput========================================================


//====LED1================================================

BLYNK_WRITE(V2) {
  //Debug
  Serial.print("Got a valueLED1: ");
  Serial.println(param.asInt());
  
  if (param.asInt()) {
    digitalWrite(30, HIGH);
    StatusLED1.on();
    terminal.println("Turn on LED1");
    terminal.flush();
  }
  else {
    digitalWrite(30, LOW);
    StatusLED1.off();
    terminal.println("Turn off LED1");
    terminal.flush();
  }
}
//====END LED1===============================================

//====LED 2================================================

BLYNK_WRITE(V3) {
  //Debug
  Serial.print("Got a valueLED2: ");
  Serial.println(param.asInt());
  
  if (param.asInt()) {
    digitalWrite(32, HIGH);
    StatusLED2.on();
    terminal.println("Turn on LED2");
    terminal.flush();
  }
  else {
    digitalWrite(32, LOW);
    StatusLED2.off();
    terminal.println("Turn off LED2");
    terminal.flush();
  }
}
//====END LED2================================================


void activetoday() {       // check if schedule should run today
  if (year() != 1970) {    
      Blynk.syncVirtual(V20); // sync timeinput widget
      Blynk.sendInternal("rtc", "sync");
  }
}


BLYNK_WRITE(V20){
  sprintf(Time, "%02d:%02d:%02d", hour(), minute(), second());
  Serial.print("Time : ");
  Serial.println(Time);
  TimeInputParam t(param);
  
  currentTime = ((hour() * 3600) + (minute() * 60));
  Serial.print("Time Now : ");
  Serial.println(currentTime);
  
  TimeStart = (t.getStartHour() * 3600) + (t.getStartMinute() * 60);
  Serial.print("Time Start : ");
  Serial.println(TimeStart);

  TimeStop = (t.getStopHour() * 3600) + (t.getStopMinute() * 60);

  //ตรวจสอบการเลือกวัน
    int dayadjustment = -1;
    if (weekday() == 1) {
      dayadjustment =  6; 
    }
    if (t.isWeekdaySelected(weekday() + dayadjustment)) { 

      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");
          terminal.flush();
          
          if(currentTime >= TimeStart && currentTime < TimeStop){
            terminal.print("LED ON");
            terminal.flush();
            digitalWrite(30,HIGH);
            digitalWrite(32,HIGH);
            StatusLED1.on();
            StatusLED2.on();
          }else{
            terminal.print("LED OFF");
            terminal.flush();
            digitalWrite(30,LOW);
            digitalWrite(32,LOW);
            StatusLED1.off();
            StatusLED2.off();
          }
          
        }
      }
    }
    else {
      ///Not Day Select
    }

}

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

void loop()
{
  Blynk.run();
  if ( Serial3.available() )   {
    Serial.write( Serial3.read() );
  }
  if ( Serial.available() )       {
    Serial3.write( Serial.read() );
  }
  timer.run();
}

วิดีโอเพิ่มเติมครับ

ไหวพริบดีมากครับ เพราะความจริงมีเพียงหนึ่งเดียว 555

นี้คือโค้ตที่เขียนใหม่สินะครับ

อันนี้ของเดิม


ขอบคุณมากครับที่คอยตอบให้ตลอดเลยครับ ไล่หาอยู่นานเหมือนกันครับว่าขาดคำสั่งอะไรไป

1 Like

ยินดีครับ มีข้อมูลดีๆ มาแชร์กันครับ