Hey i have a project to make a smart power outlet with countdown timer and alarm features. The alarm features is okay, buat the countdown timer sometimes got an error, i don’t know why. Maybe anyone can help me show which part is wrong, and tell me the better way to do it. Thanks!
My Blynk interface:
Error:
My arduino code:
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <TimeLib.h>
#include <WidgetRTC.h>
#include <SimpleTimer.h>
char auth[] = "";
char ssid[] = "";
char pass[] = "";
WidgetRTC rtc;
WidgetTerminal terminal(V0);
SimpleTimer timer;
#define TestLED D4
#define relay D3
char Date[16];
char Time[16];
long alarm_now;
long alarm_start;
long alarm_stop;
String terminal_label;
int wifisignal;
int alarm_mode;
int timer_mode;
int timer_time;
int timer_countdown;
String currentTime;
String currentDate;
int timer_label;
int timer_check_mode;
int timer_cost_monitor;
//***********************************SETUP*********************************************//
void setup()
{
Serial.begin(9600);
pinMode(TestLED,OUTPUT);
pinMode(relay,OUTPUT);
digitalWrite(TestLED,HIGH); // -> pakai led di nodemcu, HIGH=mati ; LOW=hidup
digitalWrite(relay,HIGH);
Blynk.begin(auth, ssid, pass);
rtc.begin();
//timer.setInterval(2000L, power_monitor);
timer_check_mode = timer.setInterval(1000L, check_mode); // check mode
timer_label = timer.setInterval(2000L, clockvalue); // check value for time
terminal.println(" ****************************************");
terminal.println(" ");
terminal.println(" SMART POWER OUTLET ");
terminal.println(" ");
terminal.println(" ");
terminal.println(" NADUA JOELMETTU ");
terminal.println(" 23413029 ");
terminal.println(" ");
terminal.println(" ****************************************");
terminal.flush();
}
//*************************************************************************************//
//**********************************FUNGSI2********************************************//
void clockvalue() // Print date, time, wifi signal
{
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;
}
currentTime = String(hour()) + ":" + minute();
currentDate = String(day()) + "/" + month() + "/" + year();
terminal_label = "Date: " + currentDate + " Time: " + displayhour + ":" + displayminute + " Signal: " + wifisignal +" %";
Blynk.setProperty(V0, "label", terminal_label);
wifisignal = map(WiFi.RSSI(), -105, -40, 0, 100);
}
void check_mode()
{
if (timer_mode==1)
{
Blynk.syncVirtual(V3); // sync timeinput widget
}
if (alarm_mode==1)
{
Blynk.syncVirtual(V5); // sync timeinput widget
}
}
void reset_auto() // Reset to auto mode
{
terminal.println(" ****************************************");
terminal.println(" ");
terminal.println(" AUTO MODE ");
terminal.println(" ");
terminal.println(" TIMER : OFF ALARM : OFF ");
terminal.println(" ");
terminal.println(" Please select a mode ");
terminal.println(" ");
terminal.println(" ****************************************");
terminal.flush();
alarm_mode=0;
timer_mode=0;
timer_countdown=0;
timer_time=0;
digitalWrite(TestLED,HIGH);
digitalWrite(relay,HIGH);
Blynk.virtualWrite(V1, 1);
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V4, 0);
Blynk.virtualWrite(V6, 0);
}
void reset_manual() // Reset to manual mode
{
currentTime = String(hour()) + ":" + minute();
terminal.println(" ****************************************");
terminal.println(" ");
terminal.println(" MANUAL MODE ");
terminal.println(" ");
terminal.println(" Device OFF (" + currentTime + ") ");
terminal.println(" ");
terminal.println(" You can control manually ");
terminal.println(" ");
terminal.println(" ****************************************");
terminal.flush();
alarm_mode=0;
timer_mode=0;
digitalWrite(TestLED,HIGH);
digitalWrite(relay,HIGH);
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V4, 0);
Blynk.virtualWrite(V6, 0);
}
BLYNK_WRITE(V1) // BTN_MODE
{
if (param.asInt()==1)
{
reset_auto();
}
else
{
reset_manual();
}
}
BLYNK_WRITE(V2) // BTN_MANUAL
{
if (param.asInt()==1) // btn_manual dipencet
{
currentTime = String(hour()) + ":" + minute();
terminal.println(" ****************************************");
terminal.println(" ");
terminal.println(" MANUAL MODE ");
terminal.println(" ");
terminal.println(" Device ON (" + currentTime + ") ");
terminal.println(" ");
terminal.println(" You can control manually ");
terminal.println(" ");
terminal.println(" ****************************************");
terminal.flush();
alarm_mode=0;
timer_mode=0;
digitalWrite(TestLED,LOW);
digitalWrite(relay,LOW);
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, 1);
Blynk.virtualWrite(V4, 0);
Blynk.virtualWrite(V6, 0);
}
else //btn_manual gak dipencet
{
reset_manual();
}
}
BLYNK_WRITE(V3) // Timer
{
if (timer_mode==1)
{
TimeInputParam t(param);
if(timer_time == 0)
{
timer_time = (t.getStartHour() * 3600 *1000) + (t.getStartMinute() * 60 * 1000);
timer_countdown = (t.getStartHour() * 3600)+(t.getStartMinute() * 60);
}
else if(timer_time != 0)
{
terminal.println(" ****************************************");
terminal.println(" ");
terminal.println(" AUTO MODE - TIMER ON (" + currentTime + ") ");
terminal.println(" ");
terminal.println(String(" Timer set for : ") + t.getStartHour() + " hour " + t.getStartMinute() + " minute ");
terminal.println(" ");
terminal.println(String(" Countdown : ") + timer_countdown + " seconds ");
terminal.println(" ");
terminal.println(" ****************************************");
terminal.flush();
timer_countdown--;
//Serial.println(timer_countdown);
timer.setTimeout(timer_time,reset_auto);
Blynk.virtualWrite(V2, 1);
digitalWrite(TestLED,LOW);
digitalWrite(relay,LOW);
}
}
else
{
reset_auto();
}
}
BLYNK_WRITE(V4) // BTN_TIMER
{
if (param.asInt()==1)
{
timer_mode=1;
alarm_mode=0;
Blynk.virtualWrite(V1, 1);
}
else
{
reset_auto();
}
}
BLYNK_WRITE(V5) // Alarm
{
if (alarm_mode==1)
{
TimeInputParam t(param);
terminal.println(" ****************************************");
terminal.println(" ");
terminal.println(" AUTO MODE - ALARM ON (" + currentTime + ") ");
terminal.println(" ");
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(" Alarm Status : Active Today ");
terminal.println(" ");
alarm_now = ((hour() * 3600) + (minute() * 60) + second());
alarm_start = (t.getStartHour() * 3600) + (t.getStartMinute() * 60);
alarm_stop = (t.getStopHour() * 3600) + (t.getStopMinute() * 60);
if(alarm_now >= alarm_start)
{
if(alarm_now <= alarm_start + 90)
{
digitalWrite(TestLED, LOW); // set LED ON
digitalWrite(relay,LOW);
Blynk.virtualWrite(V2, 1);
}
}
else
{
if(alarm_now <= alarm_start)
{
digitalWrite(TestLED, HIGH); // set LED ON
digitalWrite(relay,HIGH);
Blynk.virtualWrite(V2, 0);
terminal.println(" Alarm Stopped Device OFF ");
terminal.println(" ");
terminal.println(" ****************************************");
terminal.flush();
}
}
if(alarm_now >= alarm_stop)
{
digitalWrite(TestLED, HIGH); // set LED OFF
digitalWrite(relay,HIGH);
Blynk.virtualWrite(V2, 0);
terminal.println(" Alarm Stopped Device OFF ");
terminal.println(" ");
terminal.println(" ****************************************");
terminal.flush();
if(alarm_now >=alarm_stop + 90)
{
digitalWrite(TestLED, HIGH); // set LED OFF
digitalWrite(relay,HIGH);
Blynk.virtualWrite(V2, 0);
}
}
else
{
if(alarm_now >= alarm_start)
{
digitalWrite(TestLED, LOW); // set LED ON
digitalWrite(relay,LOW);
Blynk.virtualWrite(V2, 1);
terminal.println(" Alarm Started Device ON ");
terminal.println(" ");
terminal.println(" ****************************************");
terminal.flush();
}
}
}
else
{
digitalWrite(TestLED, HIGH); // set LED OFF
digitalWrite(relay,HIGH);
Blynk.virtualWrite(V2, 0);
terminal.println(" Alarm Status : Inactive Today ");
terminal.println(" ");
terminal.println(" Alarm Stopped Device OFF ");
terminal.println(" ");
terminal.println(" ****************************************");
terminal.flush();
}
}
}
BLYNK_WRITE(V6) // BTN_ALARM
{
if (param.asInt()==1)
{
timer_mode=0;
alarm_mode=1;
Blynk.virtualWrite(V1, 1);
}
else
{
reset_auto();
}
}
//************************************************************************************//
//************************************LOOP********************************************//
void loop()
{
if (Blynk.connected())
{
Blynk.run();
}
timer.run();
}
//************************************************************************************//