Smart power outlet - countdown timer error (ESP Exception)

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();
}

//************************************************************************************//




If youre using the Arduino IDE then you can install the ESP Exception Decoder tool:

You’ll then get an extra item in your Tools menu that allows you to paste your stack dump data in and it will give you some clues as to where the problem lies.

Pete.

2 Likes