if defined(ESP8266)
#include <ESP8266WiFi.h>
#elif defined(ESP32)
#include <WiFi.h>
#endif
#include <ESP8266WebServer.h>
// WiFi Credentials (Change these)
const char* ssid = "RXIIS-Home";
const char* password = "Justxemerall7748771031";
// Define traffic light and warning light pins
#define RED 32
#define YELLOW 26
#define GREEN 13
#define RED2 D2
#define YELLOW2 D4
#define GREEN2 D1
#define WL1 21
#define WL2 17
// Timing settings
int reddur = 66;
int yellowdur = 3;
int greendur = 36;
unsigned long previousMillis = 0;
const long interval = 500;
long intervalTL = 0;
unsigned long trafficPreviousMillis = 0;
int redCounter = 0;
int greenCounter = 0;
int yellowCounter = 0;
int state = 0;
boolean isFlash = false;
// Web server on port 80
ESP8266WebServer server(80);
// HTML Page with AJAX
const char htmlPage[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<title>SWARCO WLC-160</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
background-color: #f4f4f4;
}
.container {
display: flex;
justify-content: center;
gap: 50px;
}
.light-box {
width: 120px;
padding: 15px;
border-radius: 10px;
background-color: black;
display: flex;
flex-direction: column;
align-items: center;
gap: 15px;
}
.counter-box {
width: 80px;
height: 50px;
background-color: black;
color: white;
font-size: 24px;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
margin-top: 10px;
border-radius: 5px;
}
.light {
width: 80px;
height: 80px;
border-radius: 50%;
background-color: gray;
}
.on { background-color: red; }
.yellow { background-color: yellow; }
.green { background-color: green; }
.wl { background-color: orange; }
.status {
text-align: center;
font-size: 18px;
font-weight: bold;
}
.ssid {
font-size: 14px;
}
</style>
<script>
function updateLights() {
fetch("/status").then(response => response.json()).then(data => {
document.getElementById("red").className = "light " + (data.red ? "on" : "");
document.getElementById("yellow").className = "light " + (data.yellow ? "yellow" : "");
document.getElementById("green").className = "light " + (data.green ? "green" : "");
document.getElementById("wl1").className = "light " + (data.wl1 ? "wl" : "");
document.getElementById("wl2").className = "light " + (data.wl2 ? "wl" : "");
document.getElementById("ssid").textContent = data.ssid;
document.getElementById("signal").textContent = "(" + data.signal + "%)";
// Update countdown timer
if (data.red) {
document.getElementById("countdown").textContent = data.redTime;
} else if (data.green) {
document.getElementById("countdown").textContent = data.greenTime;
} else {
document.getElementById("countdown").textContent = "-";
}
});
}
setInterval(updateLights, 500);
</script>
</head>
<body>
<div class="status">
<span id="ssid" class="ssid">SSID-NAME</span>
<span id="signal">(100%)</span>
</div>
<h1>SWARCO WLC-160</h1>
<div class="container">
<div>
<div class="light-box">
<div id="red" class="light"></div>
<div id="yellow" class="light"></div>
<div id="green" class="light"></div>
<div class="counter-box" id="countdown">-</div>
</div>
</div>
<div>
<div class="light-box" style="height: 180px;">
<div id="wl1" class="light"></div>
<div id="wl2" class="light"></div>
</div>
</div>
</div>
<!-- Flash Checkbox -->
<label>
<input type="checkbox" id="flashCheckbox" onchange="toggleFlash()"> Flash Mode
</label>
<script>
function updateLights() {
fetch("/status").then(response => response.json()).then(data => {
document.getElementById("red").className = "light " + (data.red ? "on" : "");
document.getElementById("yellow").className = "light " + (data.yellow ? "yellow" : "");
document.getElementById("green").className = "light " + (data.green ? "green" : "");
document.getElementById("wl1").className = "light " + (data.wl1 ? "wl" : "");
document.getElementById("wl2").className = "light " + (data.wl2 ? "wl" : "");
document.getElementById("ssid").textContent = data.ssid;
document.getElementById("signal").textContent = "(" + data.signal + "%)";
// Update countdown timer
if (data.red) {
document.getElementById("countdown").textContent = data.redTime;
} else if (data.green) {
document.getElementById("countdown").textContent = data.greenTime;
} else {
document.getElementById("countdown").textContent = "-";
}
// Update checkbox state
document.getElementById("flashCheckbox").checked = data.isFlash;
});
}
function toggleFlash() {
let checked = document.getElementById("flashCheckbox").checked ? 1 : 0;
fetch("/setflash?value=" + checked);
}
setInterval(updateLights, 500);
</script>
</body>
</html>
)rawliteral";
// Setup function
void setup() {
Serial.begin(115200);
Serial.println("\nš ESP8266 Starting...");
pinMode(RED, OUTPUT);
pinMode(YELLOW, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(WL1, OUTPUT);
pinMode(WL2, OUTPUT);
// Connect to WiFi
WiFi.begin(ssid, password);
Serial.print("š Connecting to WiFi...");
int connectAttempts = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
connectAttempts++;
if (connectAttempts > 40) { // Timeout after 20 seconds
Serial.println("\nā Failed to connect to WiFi! Restarting...");
ESP.restart();
}
}
Serial.println("\nā
Connected to WiFi!");
Serial.print("š IP Address: ");
Serial.println(WiFi.localIP());
// Handle requests
server.on("/", HTTP_GET, []() {
Serial.println("š¢ Webpage requested");
server.send(200, "text/html", htmlPage);
});
server.on("/status", HTTP_GET, []() {
int rssi = WiFi.RSSI();
int signalStrength = map(rssi, -90, -30, 0, 100);
String json = "{";
json += "\"ssid\": \"" + String(WiFi.SSID()) + "\",";
json += "\"signal\": " + String(signalStrength) + ",";
json += "\"red\": " + String(digitalRead(RED) == LOW ? 1 : 0) + ",";
json += "\"yellow\": " + String(digitalRead(YELLOW) == LOW ? 1 : 0) + ",";
json += "\"green\": " + String(digitalRead(GREEN) == LOW ? 1 : 0) + ",";
json += "\"wl1\": " + String(digitalRead(WL1) == HIGH ? 1 : 0) + ",";
json += "\"wl2\": " + String(digitalRead(WL2) == HIGH ? 1 : 0) + ",";
json += "\"redTime\": " + String(reddur - redCounter) + ",";
json += "\"greenTime\": " + String(greendur - greenCounter) + ",";
json += "\"isFlash\": " + String(isFlash ? 1 : 0);
json += "}";
server.send(200, "application/json", json);
});
server.on("/setflash", HTTP_GET, []() {
if (server.hasArg("value")) {
isFlash = server.arg("value") == "1";
Serial.println(isFlash ? "Flash Mode ON" : "Flash Mode OFF");
}
server.send(200, "text/plain", "OK");
});
server.begin();
Serial.println("ā
Web Server Started!");
}
// Main loop
void loop() {
server.handleClient();
unsigned long currentMillis = millis();
// Warning lights blinking logic
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (state == 0) { digitalWrite(WL1, HIGH); Serial.println("ā ļø WL1 ON"); state = 1; }
else if (state == 1) { digitalWrite(WL1, LOW); Serial.println("ā ļø WL1 OFF"); state = 2; }
else if (state == 2) { digitalWrite(WL2, HIGH); Serial.println("ā ļø WL2 ON"); state = 3; }
else { digitalWrite(WL2, LOW); Serial.println("ā ļø WL2 OFF"); state = 0; }
}
if (isFlash == false){intervalTL = 1000;}else{intervalTL = 500;}
// Traffic light logic
if (currentMillis - trafficPreviousMillis >= intervalTL) {
trafficPreviousMillis = currentMillis;
if (isFlash == false){
if (redCounter < reddur) {
digitalWrite(RED, LOW);
digitalWrite(YELLOW, HIGH);
digitalWrite(GREEN, HIGH);
if (redCounter >= (reddur - 2)) { digitalWrite(YELLOW, LOW); }
redCounter++;
Serial.println("š¦ RED Light ON");
}
else if (redCounter >= reddur && greenCounter < greendur) {
digitalWrite(RED, HIGH);
digitalWrite(YELLOW, HIGH);
digitalWrite(GREEN, LOW);
greenCounter++;
Serial.println("š¦ GREEN Light ON");
}
else if (greenCounter >= greendur && yellowCounter < yellowdur) {
digitalWrite(RED, HIGH);
digitalWrite(YELLOW, LOW);
digitalWrite(GREEN, HIGH);
yellowCounter++;
Serial.println("š¦ YELLOW Light ON");
}
else {
Serial.println("ā»ļø Restarting traffic light cycle...");
redCounter = 0;
greenCounter = 0;
yellowCounter = 0;
}
} else {
digitalWrite(RED, HIGH);
digitalWrite(GREEN, HIGH);
static bool state = true;
digitalWrite(YELLOW, state ? HIGH : LOW);
state = !state;
}
}
}