Your post inspired me to look into EEPROM, which I had already forgotten about. I track the offline time now and write it to EEPROM every 12 hours or when my Arduino resets. In addition, the offline time is shown on a LCD in my Blynk app now. I’m also looking for ways on how to optimize my code to save memory (I’m using 75% rn). Thank you for your help!
//#define BLYNK_PRINT Serial
#include <SPI.h>
#include <Ethernet.h>
#include <BlynkSimpleEthernet.h>
#include <RCSwitch.h>
#include <TimeLib.h>
#include <WidgetRTC.h>
#include <EEPROM.h>
char auth[] = "XXXXXXXXXXXXXXXXXX";
BlynkTimer timer;
int blynkRead1; // Computer 1 Bedroom
int blynkRead2; // Computer 1 Bedroom PW
int led_status = LOW;
int connection_loss_count = 0;
boolean disconnect_status = false;
unsigned long disconnect_timer_1 = 0;
unsigned long disconnect_timer_2 = 0;
unsigned long disconnect_time_diff = 0;
long total_downtime = 0;
boolean rcswitchstatus1 = false; // Computer 1 Bedroom
boolean rcswitchstatus2 = false; // Computer 1 Bedroom PW
#define W5100_CS 10
WidgetRTC rtc;
WidgetTerminal terminal(V0);
WidgetLCD lcd(V2);
RCSwitch mySwitch = RCSwitch();
BLYNK_WRITE(V4){
blynkRead1 = param.asInt();
}
BLYNK_WRITE(V5){
blynkRead2 = param.asInt();
}
BLYNK_CONNECTED() {
rtc.begin();
}
void push_to_blynk(){
// STATUS LED
led_status = !led_status;
if (led_status == 1){
Blynk.virtualWrite(V1, 1023);
}
else{
Blynk.virtualWrite(V1, 0);
}
// LCD
lcd.print(0, 0, "Downtime:");
lcd.print(0, 1, total_downtime);
}
void switchit(char tristate[20]){
mySwitch.sendTriState(tristate);
mySwitch.sendTriState(tristate);
mySwitch.sendTriState(tristate);
mySwitch.sendTriState(tristate);
}
void starttime(char event[20]){
terminal.print(year());
terminal.print("/");
if (month() < 10){
terminal.print("0");
}
terminal.print(month());
terminal.print("/");
if (day() < 10){
terminal.print("0");
}
terminal.print(day());
terminal.print(" ");
if (hour() < 10){
terminal.print("0");
}
terminal.print((hour()));
terminal.print(":");
if (minute() < 10){
terminal.print("0");
}
terminal.print(minute());
terminal.print(":");
if (second() < 10){
terminal.print("0");
}
terminal.print(second());
terminal.println(event);
terminal.flush();
}
void start_tracking(){
if(disconnect_status == false){
disconnect_timer_1 = millis();
disconnect_status = true;
}
}
void stop_tracking(){
if(disconnect_status == true){
disconnect_timer_2 = millis();
disconnect_time_diff = disconnect_timer_2 - disconnect_timer_1;
total_downtime = total_downtime + disconnect_time_diff;
disconnect_status = false;
}
}
void connection_check(){
if(Blynk.connected() == true){
stop_tracking();
Serial.println("Blynk Connected!");
connection_loss_count = 0;
}
else if(Blynk.connected() == false){
start_tracking();
connection_loss_count = connection_loss_count + 1;
Serial.print("Blynk Not Connected ");
//Serial.println(connection_loss_count);
Blynk.connect();
}
if(connection_loss_count >= 6 && Blynk.connected() == false){
stop_tracking();
EEPROM.put(0, total_downtime);
Serial.println("Timeout Reset");
delay(4000);
digitalWrite(3, LOW);
Serial.println("Never happens");
}
}
void write_eeprom(){
EEPROM.put(0, total_downtime);
Serial.println("EEPROM Write");
}
void setup()
{
digitalWrite(3, HIGH);
pinMode(3, OUTPUT);
EEPROM.get(0, total_downtime);
start_tracking();
mySwitch.enableTransmit(6);
mySwitch.setPulseLength(309);
Serial.begin(9600);
Ethernet.begin(NULL);
Blynk.config(auth);
Blynk.connect();
timer.setInterval(10000L, connection_check);
timer.setInterval(1000L, push_to_blynk);
timer.setInterval(43200000L, write_eeprom);
}
void loop(){
timer.run();
if(Blynk.connected() == true){
Blynk.run();
}
if (blynkRead1 == 1 && rcswitchstatus1 == false){
starttime(" Computer 1 ON");
switchit("0FF0FF0FFF0F");
rcswitchstatus1 = true;
}
if (blynkRead1 == 0 && rcswitchstatus1 == true){
starttime(" Computer 1 OFF");
switchit("0FF0FF0FFFF0");
rcswitchstatus1 = false;
}
if (blynkRead2 == 1 && rcswitchstatus2 == false){
starttime(" Computer 1 PW ENTERED");
mySwitch.send(XXXXXXXXXX, 24);
mySwitch.send(XXXXXXXXXX, 24);
rcswitchstatus2 = true;
}
if (blynkRead2 == 0 && rcswitchstatus2 == true){
rcswitchstatus2 = false;
}
}