#include <DHT.h>
#include <WiFi.h>
#include "PubSubClient.h"
// Cấu hình DHT
#define DHT_PIN 13
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
// Cấu hình MQTT
const char* MQTT_BROKER = "broker.emqx.io";
const int MQTT_PORT = 1883;
const char* MQTT_CLIENT_ID = "";
// MQTT Topics
const char* MQTT_TOPIC_TEMP = "nhietdo";
const char* MQTT_TOPIC_HUM = "doam";
const char* MQTT_TOPIC_LED = "control_led";
const char* MQTT_TOPIC_LED_STATUS = "led_status";
// Cấu hình WiFi
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
// Cấu hình LED
const int LED_PIN = 23;
bool led_state = false;
WiFiClient espClient;
PubSubClient client(espClient);
void setupWiFi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
Serial.println("IP address: " + WiFi.localIP().toString());
}
void reconnectMQTT() {
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
if (client.connect(MQTT_CLIENT_ID)) {
Serial.println("MQTT Connected");
client.subscribe(MQTT_TOPIC_LED);
Serial.println("Subscribed to LED control topic");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println("Message arrived [" + String(topic) + "]: " + message);
if (String(topic) == MQTT_TOPIC_LED) {
if (message == "ON") {
digitalWrite(LED_PIN, HIGH);
led_state = true;
Serial.println("LED turned ON");
client.publish(MQTT_TOPIC_LED_STATUS, "ON");
}
else if (message == "OFF") {
digitalWrite(LED_PIN, LOW);
led_state = false;
Serial.println("LED turned OFF");
client.publish(MQTT_TOPIC_LED_STATUS, "OFF");
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
dht.begin();
setupWiFi();
client.setServer(MQTT_BROKER, MQTT_PORT);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnectMQTT();
}
client.loop();
static unsigned long lastMsg = 0;
if (millis() - lastMsg > 2000) {
lastMsg = millis();
float temp = dht.readTemperature();
float hum = dht.readHumidity();
if (!isnan(temp) && !isnan(hum)) {
String temp_str = String(temp, 1);
String hum_str = String(hum, 1);
client.publish(MQTT_TOPIC_TEMP, temp_str.c_str());
client.publish(MQTT_TOPIC_HUM, hum_str.c_str());
Serial.println("Temperature: " + temp_str + "°C");
Serial.println("Humidity: " + hum_str + "%");
client.publish(MQTT_TOPIC_LED_STATUS, led_state ? "ON" : "OFF");
}
}
}