#include #include #include #include #define RELAY_PIN D1 #define LDR_PIN A0 // ===== Wi-Fi Credentials ===== const char* ssid = "TestESP"; const char* password = "12345678"; // ===== Settings ===== int threshold = 600; // Default LDR threshold int startHour = 18, startMinute = 0, startSecond = 0; int endHour = 6, endMinute = 0, endSecond = 0; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org", 19800, 60000); // +5:30 offset (India) ESP8266WebServer server(80); bool manualOverride = false; bool manualState = false; void handleRoot() { int ldrValue = analogRead(LDR_PIN); timeClient.update(); int hourNow = timeClient.getHours(); bool dark = (ldrValue < threshold); bool night = (hourNow >= startHour || hourNow < endHour); bool autoState = (dark || night); bool lightOn = manualOverride ? manualState : autoState; String html = R"rawliteral( Smart Auto Light

🌙 Smart Auto Light

LDR Value: )rawliteral" + String(ldrValue) + R"rawliteral(
Time: )rawliteral" + String(hourNow) + R"rawliteral(:00
Mode: )rawliteral" + String(manualOverride ? "Manual" : "Auto") + R"rawliteral(
Light: )rawliteral" + String(lightOn ? "ON" : "OFF") + R"rawliteral(

Manual Control

Settings

Threshold:
Start Time (HH:MM:SS):
End Time (HH:MM:SS):
)rawliteral"; server.send(200, "text/html", html); } void handleCommand() { String cmd = server.uri(); if (cmd == "/on") { manualOverride = true; manualState = true; } else if (cmd == "/off") { manualOverride = true; manualState = false; } else if (cmd == "/mode") { manualOverride = !manualOverride; } server.sendHeader("Location", "/"); server.send(303); } void handleSet() { if (server.hasArg("th")) threshold = server.arg("th").toInt(); if (server.hasArg("st")) { sscanf(server.arg("st").c_str(), "%d:%d:%d", &startHour, &startMinute, &startSecond); } if (server.hasArg("et")) { sscanf(server.arg("et").c_str(), "%d:%d:%d", &endHour, &endMinute, &endSecond); } server.sendHeader("Location", "/"); server.send(303); } void setup() { Serial.begin(115200); pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, LOW); Serial.println("\nConnecting to Wi-Fi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWi-Fi connected: " + WiFi.localIP().toString()); timeClient.begin(); timeClient.update(); server.on("/", handleRoot); server.on("/on", handleCommand); server.on("/off", handleCommand); server.on("/mode", handleCommand); server.on("/set", handleSet); server.begin(); Serial.println("Web server started!"); } void loop() { server.handleClient(); timeClient.update(); int ldrValue = analogRead(LDR_PIN); int hourNow = timeClient.getHours(); bool dark = (ldrValue < threshold); bool night = (hourNow >= startHour || hourNow < endHour); bool autoState = (dark || night); bool lightOn = manualOverride ? manualState : autoState; digitalWrite(RELAY_PIN, lightOn ? LOW : HIGH); delay(1000); }