#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 += "
";
// 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");
}
}
}
}