#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.emqx.io"; // Broker MQTT
const char* mqtt_discovery_topic = "homeassistant/sensor/esp32_temperature/config"; // Topic MQTT Discovery
const char* sensor_topic = "iot/sensor/temperature"; // Topic nhiệt độ
WiFiClient espClient;
PubSubClient client(espClient);
float temperature = 25.0; // Giá trị nhiệt độ giả lập
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
client.setServer(mqtt_server, 1883);
client.setCallback(mqttCallback);
// Gửi thông tin Discovery cho sensor nhiệt độ
sendDiscoveryMessage();
}
void sendDiscoveryMessage() {
// Tạo payload JSON cho MQTT Discovery
String payload = "{\"name\": \"test mqtt discovery\","
"\"state_topic\": \"iot/sensor/temperature\","
"\"unit_of_measurement\": \"°C\","
"\"device_class\": \"temperature\","
"\"unique_id\": \"esp32_temperature_01\","
"\"platform\": \"mqtt\"}";
// Gửi thông điệp discovery
client.publish(mqtt_discovery_topic, payload.c_str(), true);
Serial.println("Discovery message sent");
}
void mqttCallback(char* topic, byte* payload, unsigned int length) {
// Nhận dữ liệu từ broker nếu cần
}
void reconnect() {
while (!client.connected()) {
if (client.connect("ESP32Client")) {
client.subscribe("iot/sensor/temperature");
} else {
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Giả lập việc cập nhật giá trị nhiệt độ
temperature = 25.0 + random(0, 10); // Tạo giá trị nhiệt độ ngẫu nhiên
client.publish(sensor_topic, String(temperature).c_str(), true);
delay(5000); // Cập nhật mỗi 5 giây
}