#include <WiFi.h>
#include "PubSubClient.h"
#include <DHT.h> // Thêm thư viện DHT
#include <ArduinoJson.h>
#define DHTPIN 15 // Chân kết nối của cảm biến DHT22 (đổi theo thực tế của bạn)
#define DHTTYPE DHT22 // Loại cảm biến DHT
const char * MQTTServer = "broker.emqx.io"; // Địa chỉ broker MQTT
const char * MQTT_Topic = "vlute-iot1"; // Topic chủ để đăng ký
const char* topicPublish = "temperature-humidity"; // Topic để gửi dữ liệu
// Tạo ID ngẫu nhiên tại: https://www.guidgen.com/
const char * MQTT_ID = "a55405b4-b2c0-4560-9d22-0592208bae89"; // ID MQTT duy nhất
int Port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE); // Khởi tạo cảm biến DHT
void WIFIConnect() {
Serial.println("Connecting to SSID: Wokwi-GUEST");
WiFi.begin("Wokwi-GUEST", ""); // Kết nối với Wi-Fi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print("."); // Hiển thị dấu chấm để thông báo đang kết nối
}
Serial.println("");
Serial.print("WiFi connected with IP: ");
Serial.println(WiFi.localIP()); // In địa chỉ IP khi kết nối thành công
}
void MQTT_Reconnect() {
while (!client.connected()) {
if (client.connect(MQTT_ID)) {
Serial.print("MQTT connected to Topic: ");
Serial.println(MQTT_Topic);
client.subscribe(MQTT_Topic); // Đăng ký topic để nhận dữ liệu
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000); // Nếu không kết nối được, thử lại sau 5 giây
}
}
}
void callback(char* topic, byte* message, unsigned int length) {
// Hàm này được gọi khi nhận được tin nhắn từ broker MQTT
Serial.print("Message arrived on topic: ");
Serial.println(topic);
String stMessage;
for (int i = 0; i < length; i++) {
stMessage += (char)message[i]; // Chuyển byte thành chuỗi
}
Serial.print("Message: ");
Serial.println(stMessage);
}
void sendSensorData() {
// Đọc dữ liệu nhiệt độ và độ ẩm từ cảm biến DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature(); // Đọc nhiệt độ theo độ Celsius
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!"); // Kiểm tra nếu dữ liệu bị lỗi
return;
}
// Hiển thị thông tin trên Serial Monitor
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print("% Temperature: ");
Serial.print(temperature);
Serial.println("°C");
// Tạo đối tượng JSON
StaticJsonDocument<200> doc; // Tạo đối tượng JSON, dung lượng bộ nhớ đủ lớn cho dữ liệu
doc["temperature"] = temperature;
doc["humidity"] = humidity;
// Serialize (chuyển đối tượng JSON thành chuỗi) và gửi qua MQTT
char jsonBuffer[512]; // Bộ đệm để lưu JSON dưới dạng chuỗi
serializeJson(doc, jsonBuffer);
// Gửi dữ liệu JSON qua MQTT
client.publish(topicPublish, jsonBuffer);
}
void setup() {
Serial.begin(115200); // Khởi tạo Serial Monitor với tốc độ 115200 bps
WIFIConnect(); // Kết nối Wi-Fi
client.setServer(MQTTServer, Port); // Cấu hình server MQTT
client.setCallback(callback); // Đăng ký callback khi nhận tin nhắn
dht.begin(); // Khởi tạo cảm biến DHT
}
void loop() {
// Nếu client MQTT chưa kết nối, thử kết nối lại
if (!client.connected()) {
MQTT_Reconnect();
}
// Xử lý các yêu cầu MQTT
client.loop();
// Gửi dữ liệu cảm biến mỗi 10 giây
static unsigned long lastSendTime = 0;
if (millis() - lastSendTime > 3000) { // Mỗi 10 giây
sendSensorData();
lastSendTime = millis(); // Cập nhật thời gian gửi dữ liệu
}
}