#include <WiFi.h>
#include <DHT.h>
#include <PubSubClient.h>
const int pinLED = 5; // LED nối vào chân GPIO 5
const int pinDHT = 19; // DHT22 (SDA) nối vào chân GPIO 19
const char id[] = "thinh's ESP32"; // MQTT ID của MCU
const char baseTopic[] = "thinh/"; // Tên topic chung trên MQTT broker
const char tempTopic[] = "thinh/temperature"; // Tên topic nhiệt độ trên MQTT broker
const char ledTopic[] = "thinh/LED"; // Tên topic LED trên MQTT broker
WiFiClient network; // Mạng WiFi
PubSubClient client(network); // Đối tượng MQTT Client
DHT dht(pinDHT, DHT22); // Tạo đối tượng DHT22
float nhietdo;
void wifi_connect() {
WiFi.begin("Wokwi-GUEST", "", 6); // Kết nối WiFi tên "Wokwi-GUEST", không có password, kênh số 6
while(WiFi.status() != WL_CONNECTED) delay(1000); // Chờ đến khi kết nối WiFi xong
}
void xuly(char* topic, byte* payload, unsigned int length) { // topic; payload: data; length: chiều dài của data
if (strcmp(topic, ledTopic) == 0) { // Chỉ xử lý data từ topic LED (khi bật / tắt LED trên app)
if (strncmp((char*) payload, "mo", length) == 0){
digitalWrite(pinLED, HIGH);
} else if (strncmp((char*) payload, "tat", length) == 0){
digitalWrite(pinLED, LOW); // thì tắt LED
}
}
}
void setup() {
pinMode(pinLED, OUTPUT);
dht.begin(); // Khởi động đối tượng DHT
wifi_connect(); // Gọi hàm kết nối WiFi
client.setServer("test.mosquitto.org", 1883); // Chọn server broker: test.mosquitto.org,cổng 1883
client.setCallback(xuly); // Đăng ký hàm xử lý khi nhận được data broker gửi
}
void mqtt_connect() {
if (!client.connected()) { // Kiểm tra có còn kết nối với broker hay không?
while (!client.connect(id)) delay(3000);// Nếu không thì kết nối cho đến khi được
client.publish(baseTopic, id); // Gửi ID của MCU lên topic chung của broker
client.subscribe(ledTopic); // Sau đó đăng ký nhận data từ topic LED của broker
}
}
void loop() {
mqtt_connect(); // Kết nối vào máy chủ broker
nhietdo = dht.readTemperature(); // Đọc giá trị từ cảm biến DHT22 vào biến nhietdo
if (!isnan(nhietdo)) { // Nếu đọc OK (không có lỗi)
client.publish(tempTopic, String(nhietdo, 1).c_str()); // Gửi nhiệt độ (nhớ đổi số thành chuỗi)
}
client.loop(); // Thực hiện xử lý tiếp theo của MQTT client (nhận data)
delay(1000); // Cứ mỗi 1s sẽ cập nhật lại nhiệt độ và đọc topic LED
}