#include <WiFi.h>
#include <WebServer.h>
// ---- WiFi ----
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ---- Сенсори ----
#define LDR_PIN 35
#define PIR_PIN 19
#define RED_PIN 16
#define GREEN_PIN 17
#define BLUE_PIN 18
// ---- Змінні стану ----
int ldrValue = 0;
int pirState = 0;
bool aiMode = true;
int brightness = 0;
// ---- WebServer ----
WebServer server(80);
// ---- Функція для встановлення яскравості ----
void setBrightness(int level) {
level = constrain(level, 0, 255);
analogWrite(RED_PIN, level);
analogWrite(GREEN_PIN, level);
analogWrite(BLUE_PIN, level);
}
// ---- AI логіка ----
int computeAIbrightness(int light, int motion) {
if (light > 2500) return 0;
if (motion == 1 && light < 800) return 255;
if (motion == 1 && light < 1500) return 180;
if (motion == 0 && light < 1000) return 80;
return 20;
}
// ---- НОВИЙ Веб інтерфейс ----
void handleRoot() {
String html = R"html(
<html>
<head>
<meta charset='utf-8'/>
<title>Smart Light Dashboard</title>
<style>
body {
background: #0a0f24;
color: #fff;
font-family: Arial;
text-align: center;
padding: 20px;
}
.card {
background: #111a39;
padding: 15px;
border-radius: 14px;
margin: 12px auto;
width: 80%;
max-width: 350px;
box-shadow: 0 0 15px rgba(0,0,0,0.4);
}
h2 { color: #4aa8ff; }
a.button {
display: inline-block;
padding: 10px 18px;
margin: 6px;
border-radius: 8px;
background: #4aa8ff;
color: #000;
text-decoration: none;
font-weight: bold;
}
a.button:hover { background: #75c7ff; }
</style>
</head>
<body>
<h2>🌙 Smart NightLight Panel</h2>
<div class='card'>
<p><b>Освітленість (LDR):</b> ##LDR##</p>
<p><b>Рух (PIR):</b> ##PIR##</p>
<p><b>Яскравість:</b> ##BR##</p>
<p><b>Режим:</b> ##MODE##</p>
</div>
<a href='/toggle' class='button'>🔄 Перемкнути режим</a><br><br>
<a href='/bright_up' class='button'>🔆 Додати яскравість</a>
<a href='/bright_down' class='button'>🔅 Зменшити яскравість</a><br><br>
<a href='/policy' class='button'>📘 AI Policy</a>
</body>
</html>
)html";
html.replace("##LDR##", String(ldrValue));
html.replace("##PIR##", pirState ? "Виявлено рух" : "Немає руху");
html.replace("##BR##", String(brightness));
html.replace("##MODE##", aiMode ? "AI" : "Manual");
server.send(200, "text/html", html);
}
// ---- Перемикання режиму ----
void handleToggle() {
aiMode = !aiMode;
server.sendHeader("Location", "/");
server.send(303);
}
// ---- Ручне керування ----
void handleBrightUp() {
brightness = min(255, brightness + 25);
setBrightness(brightness);
server.sendHeader("Location", "/");
server.send(303);
}
void handleBrightDown() {
brightness = max(0, brightness - 25);
setBrightness(brightness);
server.sendHeader("Location", "/");
server.send(303);
}
// ---- LLM Policy ----
void handlePolicy() {
String policy = "LLM Policy Suggestion:<br>";
policy += "- Зменшити базову яскравість після 23:00.<br>";
policy += "- Підвищити чутливість до руху при частих спрацюваннях.<br>";
policy += "- Збільшити час вимкнення до 60 сек.<br>";
server.send(200, "text/html", policy);
}
// ---- SETUP ----
void setup() {
Serial.begin(115200);
pinMode(LDR_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
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());
server.on("/", handleRoot);
server.on("/toggle", handleToggle);
server.on("/bright_up", handleBrightUp);
server.on("/bright_down", handleBrightDown);
server.on("/policy", handlePolicy);
server.begin();
}
// ---- LOOP ----
void loop() {
server.handleClient();
ldrValue = analogRead(LDR_PIN);
pirState = digitalRead(PIR_PIN);
if (aiMode) {
brightness = computeAIbrightness(ldrValue, pirState);
setBrightness(brightness);
}
delay(200);
}