#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
// ===== WiFi =====
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ===== MQTT =====
const char* mqtt_server = "broker.emqx.io";
const int mqtt_port = 1883;
const char* topicTemp = "openremote/demo/temp";
const char* topicHum = "openremote/demo/hum";
const char* topicLed = "openremote/demo/led";
WiFiClient espClient;
PubSubClient client(espClient);
// ===== LED =====
#define LED_PIN 2
// ===== DHT22 =====
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// ===== Timer =====
unsigned long lastSend = 0;
const long interval = 5000; // 5s
// ===== MQTT Callback =====
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Topic: ");
Serial.print(topic);
Serial.print(" | Message: ");
Serial.println(message);
// ===== LED control =====
if (String(topic) == topicLed) {
if (message == "true") {
digitalWrite(LED_PIN, HIGH);
} else if (message == "false") {
digitalWrite(LED_PIN, LOW);
}
}
}
// ===== MQTT reconnect =====
void reconnect() {
while (!client.connected()) {
Serial.print("Dang ket noi MQTT...");
if (client.connect("ESP32_WOKWI_CLIENT")) {
Serial.println("Thanh cong");
client.subscribe(topicLed);
} else {
Serial.print("That bai, rc=");
Serial.print(client.state());
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
// DHT
dht.begin();
// WiFi
WiFi.begin(ssid, password);
Serial.print("Dang ket noi WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi da ket noi");
// MQTT
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// ===== Read DHT22 & Publish =====
if (millis() - lastSend > interval) {
lastSend = millis();
float hum = dht.readHumidity();
float temp = dht.readTemperature(); // Celsius
if (isnan(temp) || isnan(hum)) {
Serial.println("Doc DHT22 that bai!");
return;
}
char tempStr[10];
char humStr[10];
dtostrf(temp, 4, 2, tempStr);
dtostrf(hum, 4, 2, humStr);
client.publish(topicTemp, tempStr);
client.publish(topicHum, humStr);
Serial.print("Temp: ");
Serial.print(tempStr);
Serial.print(" °C | Hum: ");
Serial.print(humStr);
Serial.println(" %");
}
}