#include <WiFi.h>
#include <Firebase_ESP_Client.h>
#include <addons/TokenHelper.h>
#include <addons/RTDBHelper.h>
#include <time.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define API_KEY "AIzaSyCw5FKMz6ga3mqF2y-qhD_NOedfPeF27SI"
#define DATABASE_URL "https://remote-light-control-default-rtdb.firebaseio.com"
#define RELAY_1 5
#define RELAY_2 18
#define RELAY_3 19
#define NTP_SERVER "pool.ntp.org"
#define GMT_OFFSET_SEC 3600 * 7
#define DAYLIGHT_OFFSET_SEC 0
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
unsigned long sendDataPrevMillis = 0;
bool signupOK = false;
void setup() {
Serial.begin(115200);
pinMode(RELAY_1, OUTPUT);
pinMode(RELAY_2, OUTPUT);
pinMode(RELAY_3, OUTPUT);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
configTime(GMT_OFFSET_SEC, DAYLIGHT_OFFSET_SEC, NTP_SERVER);
config.api_key = API_KEY;
config.database_url = DATABASE_URL;
if (Firebase.signUp(&config, &auth, "", "")) {
Serial.println("ok");
signupOK = true;
} else {
Serial.printf("%s\n", config.signer.signupError.message.c_str());
}
config.token_status_callback = tokenStatusCallback;
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
}
void checkAndUpdateLight(const char* room, int relayPin) {
if (Firebase.RTDB.getBool(&fbdo, String(room) + "/On") &&
Firebase.RTDB.getInt(&fbdo, String(room) + "/Timer") &&
Firebase.RTDB.getInt(&fbdo, String(room) + "/Timerstatus")) {
bool onState = fbdo.boolData();
long timer = fbdo.intData();
int timerStatus = fbdo.intData();
time_t now;
time(&now);
if (timer > 0 && now >= timer) {
// Timer expired, update state
bool newState = (timerStatus == 1);
digitalWrite(relayPin, newState ? HIGH : LOW);
Firebase.RTDB.setBool(&fbdo, String(room) + "/On", newState);
Firebase.RTDB.setInt(&fbdo, String(room) + "/Timer", 0);
Firebase.RTDB.setInt(&fbdo, String(room) + "/Timerstatus", -1);
Serial.println(String(room) + " timer expired. New state: " + String(newState));
} else {
digitalWrite(relayPin, onState ? HIGH : LOW);
}
Serial.println(String(room) + " state: " + String(onState));
} else {
Serial.println("Failed to read data for " + String(room));
}
}
void loop() {
if (Firebase.ready() && signupOK && (millis() - sendDataPrevMillis > 1000 || sendDataPrevMillis == 0)) {
sendDataPrevMillis = millis();
checkAndUpdateLight("Lroom", RELAY_1);
checkAndUpdateLight("Broom", RELAY_2);
checkAndUpdateLight("Kitchen", RELAY_3);
}
}