#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
// Thông tin WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT broker
const char* mqtt_server = "broker.emqx.io";
const char* mqtt_topic = "dengiaothong";
const char* mqtt_response_topic = "dengiaothong/response";
const char* MQTT_ID = "esp32_led_client";
// GPIO các LED
#define GREEN_LED 5
#define YELLOW_LED 4
#define RED_LED 2
WiFiClient espClient;
PubSubClient client(espClient);
// Biến lưu thời gian chu kỳ
int green_time = 0, yellow_time = 0, red_time = 0;
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!");
// Kết nối MQTT
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);
}
}
// Cấu hình LED
pinMode(GREEN_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
// Tắt tất cả đèn ban đầu
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
}
void loop() {
client.loop(); // Xử lý kết nối MQTT
// Điều khiển đèn giao thông (vòng lặp lặp lại)
if (green_time > 0 || yellow_time > 0 || red_time > 0) {
// Đèn xanh bật, các đèn khác tắt
digitalWrite(GREEN_LED, HIGH);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
delay(green_time * 1000);
// Đèn vàng bật, các đèn khác tắt
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, HIGH);
digitalWrite(RED_LED, LOW);
delay(yellow_time * 1000);
// Đèn đỏ bật, các đèn khác tắt
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, HIGH);
delay(red_time * 1000);
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Nhận tin nhắn từ topic: ");
Serial.println(topic);
// Giải mã JSON
StaticJsonDocument<200> doc;
DeserializationError error = deserializeJson(doc, payload, length);
if (error) {
Serial.print("Lỗi JSON: ");
Serial.println(error.c_str());
return;
}
// Lấy dữ liệu từ JSON
green_time = doc["green"] | 0; // Thời gian đèn xanh
yellow_time = doc["yellow"] | 0; // Thời gian đèn vàng
red_time = doc["red"] | 0; // Thời gian đèn đỏ
// In dữ liệu để debug
Serial.print("Đèn xanh: ");
Serial.println(green_time);
Serial.print("Đèn vàng: ");
Serial.println(yellow_time);
Serial.print("Đèn đỏ: ");
Serial.println(red_time);
// Gửi xác nhận lại MQTT
StaticJsonDocument<200> response;
response["status"] = "received";
response["green"] = green_time;
response["yellow"] = yellow_time;
response["red"] = red_time;
char responseBuffer[256];
serializeJson(response, responseBuffer);
client.publish(mqtt_response_topic, responseBuffer);
Serial.println("Đã gửi phản hồi về MQTT.");
}