#include #include #include #include // WiFi credentials const char* ssid = "TestESP"; const char* password = "12345678"; // Relay pins #define LIGHT1 D1 #define LIGHT2 D2 // Default ON/OFF times (HH:MM:SS) int ON_HOUR = 18, ON_MIN = 0, ON_SEC = 0; int OFF_HOUR = 6, OFF_MIN = 0, OFF_SEC = 0; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org", 19800); // +5:30 for IST ESP8266WebServer server(80); // Logs #define MAX_LOGS 20 String logs[MAX_LOGS]; int logIndex = 0; bool lightsOn = false; bool manualMode = false; unsigned long lastCheck = 0; const unsigned long checkInterval = 1000; // 1 sec // ===== Utility ===== void addLog(String msg) { String logLine = "[" + timeClient.getFormattedTime() + "] " + msg; Serial.println(logLine); logs[logIndex] = logLine; logIndex = (logIndex + 1) % MAX_LOGS; } bool isBetweenTimes(int h, int m, int s) { int nowSec = h * 3600 + m * 60 + s; int onSec = ON_HOUR * 3600 + ON_MIN * 60 + ON_SEC; int offSec = OFF_HOUR * 3600 + OFF_MIN * 60 + OFF_SEC; if (onSec < offSec) return (nowSec >= onSec && nowSec < offSec); else return (nowSec >= onSec || nowSec < offSec); // Handles overnight } // ===== HTML Page ===== String getHTML() { String page = ""; page += ""; page += "

ESP8266 Smart Light Controller

"; page += "

IP: " + WiFi.localIP().toString() + "

"; page += "

Current Time: " + timeClient.getFormattedTime() + "

"; page += "

Mode: " + String(manualMode ? "Manual" : "Auto") + "

"; page += "

Light: " + String(lightsOn ? "ON" : "OFF") + "

"; // Manual controls page += "
"; page += "
"; page += "
"; // Time settings page += "

Change Timer (HH:MM:SS)

"; page += "
"; page += "ON :"; page += " :"; page += "

"; page += "OFF :"; page += " :"; page += "

"; page += "

"; // Logs page += "

Logs

"; for (int i = 0; i < MAX_LOGS; i++) { int idx = (logIndex + i) % MAX_LOGS; if (logs[idx].length() > 0) page += logs[idx] + "
"; } page += "
"; return page; } // ===== Routes ===== void handleRoot() { server.send(200, "text/html", getHTML()); } void handleOn() { digitalWrite(LIGHT1, LOW); digitalWrite(LIGHT2, LOW); lightsOn = true; manualMode = true; addLog("Manual: Lights ON"); handleRoot(); } void handleOff() { digitalWrite(LIGHT1, HIGH); digitalWrite(LIGHT2, HIGH); lightsOn = false; manualMode = true; addLog("Manual: Lights OFF"); handleRoot(); } void handleAuto() { manualMode = false; addLog("Switched to AUTO mode"); handleRoot(); } void handleSetTime() { if (server.hasArg("onH")) ON_HOUR = server.arg("onH").toInt(); if (server.hasArg("onM")) ON_MIN = server.arg("onM").toInt(); if (server.hasArg("onS")) ON_SEC = server.arg("onS").toInt(); if (server.hasArg("offH")) OFF_HOUR = server.arg("offH").toInt(); if (server.hasArg("offM")) OFF_MIN = server.arg("offM").toInt(); if (server.hasArg("offS")) OFF_SEC = server.arg("offS").toInt(); addLog("Timer set → ON " + String(ON_HOUR) + ":" + String(ON_MIN) + ":" + String(ON_SEC) + " / OFF " + String(OFF_HOUR) + ":" + String(OFF_MIN) + ":" + String(OFF_SEC)); handleRoot(); } // ===== Setup ===== void setup() { Serial.begin(115200); pinMode(LIGHT1, OUTPUT); pinMode(LIGHT2, OUTPUT); digitalWrite(LIGHT1, HIGH); digitalWrite(LIGHT2, HIGH); WiFi.begin(ssid, password); Serial.print("Connecting to WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nConnected! IP: " + WiFi.localIP().toString()); timeClient.begin(); timeClient.update(); addLog("System started and time synced."); server.on("/", handleRoot); server.on("/on", handleOn); server.on("/off", handleOff); server.on("/auto", handleAuto); server.on("/settime", handleSetTime); server.begin(); addLog("Web server started."); } // ===== Loop ===== void loop() { server.handleClient(); unsigned long now = millis(); if (now - lastCheck >= checkInterval) { lastCheck = now; timeClient.update(); if (!manualMode) { int h = timeClient.getHours(); int m = timeClient.getMinutes(); int s = timeClient.getSeconds(); bool shouldBeOn = isBetweenTimes(h, m, s); if (shouldBeOn && !lightsOn) { digitalWrite(LIGHT1, LOW); digitalWrite(LIGHT2, LOW); lightsOn = true; addLog("Auto: Lights ON"); } else if (!shouldBeOn && lightsOn) { digitalWrite(LIGHT1, HIGH); digitalWrite(LIGHT2, HIGH); lightsOn = false; addLog("Auto: Lights OFF"); } } } }