CCCPaste
#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"); } } } }