#include <Arduino.h>
#include <WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <FirebaseESP32.h>
#include "addons/TokenHelper.h"
#include "addons/RTDBHelper.h"
// Wi-Fi credentials
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
// Firebase credentials (from first code)
#define FIREBASE_HOST "https://homeautomation-bb464-default-rtdb.asia-southeast1.firebasedatabase.app/"
#define FIREBASE_API_KEY "AIzaSyD_nEsGB4hDK4H1sQto-cCzPMcEVatBR4M"
// Firebase objects
FirebaseData firebaseData;
FirebaseAuth firebaseAuth;
FirebaseConfig firebaseConfig;
bool signupOK = false;
// GPIO pins for 5 LEDs
const int ledPins[5] = {15, 2, 4, 5, 18};
// NTP Client
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 19800); // UTC+5:30 IST
void setup() {
Serial.begin(115200);
// Setup LED pins
for (int i = 0; i < 5; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW);
}
// Connect to Wi-Fi
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(300);
}
Serial.println("\nConnected to Wi-Fi");
// Start NTP
timeClient.begin();
// Firebase setup
firebaseConfig.api_key = FIREBASE_API_KEY;
firebaseConfig.database_url = FIREBASE_HOST;
firebaseConfig.token_status_callback = tokenStatusCallback;
// Anonymous sign-in
if (Firebase.signUp(&firebaseConfig, &firebaseAuth, "", "")) {
Serial.println("Firebase sign-up OK");
signupOK = true;
} else {
Serial.printf("Sign-up error: %s\n", firebaseConfig.signer.signupError.message.c_str());
}
Firebase.begin(&firebaseConfig, &firebaseAuth);
Firebase.reconnectWiFi(true);
// Create default LED states in Firebase
if (signupOK && Firebase.ready()) {
for (int i = 0; i < 5; i++) {
String path = "/led" + String(i + 1);
Firebase.setBool(firebaseData, path, false);
}
Serial.println("Initial LED states set.");
}
}
void loop() {
timeClient.update();
String currentTime = timeClient.getFormattedTime(); // HH:MM:SS
// Format date as dd-MM-yyyy
time_t rawTime = timeClient.getEpochTime();
struct tm *tmTime = localtime(&rawTime);
char dateBuffer[11];
sprintf(dateBuffer, "%02d-%02d-%04d", tmTime->tm_mday, tmTime->tm_mon + 1, tmTime->tm_year + 1900);
String currentDate = String(dateBuffer);
if (Firebase.ready() && signupOK) {
for (int i = 0; i < 5; i++) {
String basePath = "/device" + String(i + 1);
String ledPath = "/led" + String(i + 1);
// Get schedule values
if (Firebase.getString(firebaseData, basePath + "/date")) {
String date = firebaseData.stringData();
Firebase.getString(firebaseData, basePath + "/on_time");
String onTime = firebaseData.stringData();
Firebase.getString(firebaseData, basePath + "/off_time");
String offTime = firebaseData.stringData();
// Compare with current date/time
if (date == currentDate && currentTime >= onTime && currentTime < offTime) {
digitalWrite(ledPins[i], HIGH);
Firebase.setBool(firebaseData, ledPath, true);
Serial.printf("LED%d ON [%s - %s] | NOW: %s\n", i + 1, onTime.c_str(), offTime.c_str(), currentTime.c_str());
} else {
digitalWrite(ledPins[i], LOW);
Firebase.setBool(firebaseData, ledPath, false);
Serial.printf("LED%d OFF | NOW: %s\n", i + 1, currentTime.c_str());
}
}
}
}
delay(1000);
}