#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.emqx.io";
const char* mqtt_topic = "dengiaothong";
const char* MQTT_ID = "esp32_led_client";
#define GREEN_LED 5
#define YELLOW_LED 4
#define RED_LED 2
WiFiClient espClient;
PubSubClient client(espClient);
int green_time = 0, yellow_time = 0, red_time = 0;
bool newDataReceived = false;
void setup() {
Serial.begin(115200);
// Kết nối WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi đã kết nối thành công!");
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
while (!client.connected()) {
Serial.print("Kết nối đến MQTT broker...");
if (client.connect(MQTT_ID)) {
Serial.println("Đã kết nối thành công!");
client.subscribe(mqtt_topic); // Đăng ký topic
} else {
Serial.print("Lỗi kết nối: ");
Serial.println(client.state());
delay(5000);
}
}
pinMode(GREEN_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
}
void loop() {
client.loop();
if (newDataReceived || green_time > 0 || yellow_time > 0 || red_time > 0) {
// Chu kỳ đèn giao thông
Serial.println("Bắt đầu chu kỳ đèn giao thông...");
digitalWrite(GREEN_LED, HIGH);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
delay(green_time * 1000);
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, HIGH);
digitalWrite(RED_LED, LOW);
delay(yellow_time * 1000);
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, HIGH);
delay(red_time * 1000);
Serial.println("Hoàn tất một chu kỳ đèn giao thông.");
newDataReceived = false;
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Nhận tin nhắn từ topic: ");
Serial.println(topic);
StaticJsonDocument<200> doc;
DeserializationError error = deserializeJson(doc, payload, length);
if (error) {
Serial.print("Lỗi JSON: ");
Serial.println(error.c_str());
return;
}
green_time = doc["green"] | 0;
yellow_time = doc["yellow"] | 0;
red_time = doc["red"] | 0;
Serial.print("Đèn xanh: ");
Serial.println(green_time);
Serial.print("Đèn vàng: ");
Serial.println(yellow_time);
Serial.print("Đèn đỏ: ");
Serial.println(red_time);
newDataReceived = true;
}
// <!DOCTYPE html>
// <html lang="en">
// <head>
// <meta charset="UTF-8">
// <meta name="viewport" content="width=device-width, initial-scale=1.0">
// <title>ESP32 LED Control via MQTT</title>
// <script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js"></script>
// <style>
// body {
// font-family: Arial, sans-serif;
// text-align: center;
// background-color: #f0f0f0;
// padding: 20px;
// }
// h2 {
// color: #333;
// }
// form {
// display: inline-block;
// background: #fff;
// padding: 20px;
// border-radius: 10px;
// box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
// }
// input[type="text"] {
// padding: 10px;
// margin: 10px 0;
// width: 200px;
// }
// input[type="button"] {
// background-color: #4CAF50;
// color: white;
// padding: 10px 20px;
// border: none;
// border-radius: 5px;
// cursor: pointer;
// }
// input[type="button"]:hover {
// background-color: #45a049;
// }
// #notif {
// margin-top: 20px;
// color: green;
// font-weight: bold;
// }
// </style>
// </head>
// <body>
// <h2>ESP32 LED Control via MQTT</h2>
// <form id="ledForm">
// <label for="green">Thời gian đèn xanh bật (giây):</label><br>
// <input type="text" id="green" name="green" value="0"><br>
// <label for="yellow">Thời gian đèn vàng bật (giây):</label><br>
// <input type="text" id="yellow" name="yellow" value="0"><br>
// <label for="red">Thời gian đèn đỏ bật (giây):</label><br>
// <input type="text" id="red" name="red" value="0"><br><br>
// <input type="button" value="Gửi MQTT" onclick="sendToMQTT()">
// </form>
// <h3>Trạng thái:</h3>
// <div id="notif">Đang kết nối...</div>
// <script>
// const client = new Paho.MQTT.Client("broker.emqx.io", 8084, "client-web" + Math.random());
// function onConnect() {
// console.log("Kết nối thành công!");
// document.getElementById('notif').innerText = "Kết nối thành công!";
// client.subscribe("dengiaothong");
// }
// client.onMessageArrived = (message) => {
// console.log("Tin nhắn nhận được: " + message.payloadString);
// document.getElementById('notif').innerText = "Phản hồi từ ESP32 nhận thành công!";
// };
// client.onConnectionLost = (responseObject) => {
// if (responseObject.errorCode !== 0) {
// console.log("Mất kết nối: " + responseObject.errorMessage);
// document.getElementById('notif').innerText = "Mất kết nối! Đang thử lại...";
// setTimeout(() => {
// reconnectMQTT();
// }, 5000);
// }
// };
// function reconnectMQTT() {
// client.connect({
// useSSL: true,
// onSuccess: onConnect,
// onFailure: (err) => {
// console.error("Không thể kết nối lại MQTT broker", err);
// document.getElementById('notif').innerText = "Không thể kết nối lại!";
// },
// });
// }
// client.connect({
// useSSL: true,
// onSuccess: onConnect,
// onFailure: (err) => {
// console.error("Không thể kết nối đến MQTT broker", err);
// document.getElementById('notif').innerText = "Không thể kết nối!";
// },
// });
// function sendToMQTT() {
// const green = parseInt(document.getElementById('green').value);
// const yellow = parseInt(document.getElementById('yellow').value);
// const red = parseInt(document.getElementById('red').value);
// if (isNaN(green) || isNaN(yellow) || isNaN(red) || green < 0 || yellow < 0 || red < 0) {
// alert("Vui lòng nhập giá trị hợp lệ (số >= 0)!");
// return;
// }
// const data = {
// green: green,
// yellow: yellow,
// red: red,
// };
// const message = new Paho.MQTT.Message(JSON.stringify(data));
// message.destinationName = "dengiaothong";
// client.send(message);
// document.getElementById('notif').innerText = "Dữ liệu đã gửi thành công!";
// }
// </script>
// </body>
// </html>