#include <WiFi.h> // Thư viện kết nối WiFi
#include <PubSubClient.h> // Thư viện MQTT
#include <DHT.h> // Thư viện DHT
const char *SSID = "Wokwi-GUEST"; // Tên WiFi
const char *PASSWORD = ""; // Mật khẩu WiFi
const char *MQTT_SERVER = "broker.emqx.io"; // MQTT Broker
const int MQTT_PORT = 1883; // Cổng MQTT
const char *MQTT_TOPIC = "dobui"; // Chủ đề MQTT cho dữ liệu
const char *MQTT_TOPIC_RAIN = "nhietdo/doam"; // Chủ đề MQTT cho nhiệt độ và độ ẩm
const char *MQTT_ID = "66dee282-b6db-452f-ae2d-b61700910fe3"; // ID MQTT
#define DHT_PIN 15 // Chân kết nối DHT22
#define DHT_TYPE DHT22 // Loại cảm biến DHT22
#define LDR_PIN 36 // Chân kết nối LDR
#define BUZZER_PIN 2 // Chân kết nối Buzzer
#define BUTTON_PIN 14 // Chân kết nối nút nhấn
DHT dht(DHT_PIN, DHT_TYPE); // Đối tượng cảm biến DHT
WiFiClient espClient; // Kết nối WiFi
PubSubClient client(espClient);
bool buttonPressed = false; // Trạng thái nút nhấn
void WIFIConnect() {
Serial.print("Connecting to WiFi: ");
Serial.println(SSID);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void MQTT_Reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect(MQTT_ID)) {
Serial.println("connected.");
client.subscribe(MQTT_TOPIC); // Nếu có chủ đề cần nhận thông tin, sử dụng subscribe ở đây.
} else {
Serial.print("failed, rc=");
Serial.println(client.state());
Serial.println("Retrying in 5 seconds...");
delay(5000);
}
}
}
void sendData() {
// Đọc dữ liệu từ DHT22
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Không thể đọc từ cảm biến DHT22!");
} else {
char tempStr[8], humidityStr[8];
dtostrf(temperature, 1, 2, tempStr); // Chuyển số thành chuỗi
dtostrf(humidity, 1, 2, humidityStr); // Chuyển số thành chuỗi
// Gửi dữ liệu nhiệt độ và độ ẩm qua MQTT
client.publish(MQTT_TOPIC_RAIN, tempStr); // Gửi nhiệt độ
client.publish(MQTT_TOPIC_RAIN, humidityStr); // Gửi độ ẩm
Serial.printf("Nhiệt độ: %.2f °C, Độ ẩm: %.2f %%\n", temperature, humidity);
}
// Đọc giá trị từ LDR
int ldrValue = analogRead(LDR_PIN);
char ldrStr[8];
itoa(ldrValue, ldrStr, 10); // Chuyển giá trị LDR thành chuỗi
// Gửi giá trị LDR qua MQTT
client.publish(MQTT_TOPIC, ldrStr); // Gửi giá trị LDR
Serial.printf("Giá trị bụi: %d\n", ldrValue);
// Kiểm tra mức ánh sáng vượt ngưỡng
if (ldrValue >= 2000) { // Ngưỡng ánh sáng là 2000
Serial.println("Cảnh báo: Độ bụi cao");
if (buttonPressed) { // Chỉ bật Buzzer nếu nút nhấn chưa được xử lý
noTone(BUZZER_PIN);
}
else{
tone(BUZZER_PIN,262);
delay(100);
}
} else { // Nếu không vượt ngưỡng
buttonPressed = false;
noTone(BUZZER_PIN);
}
}
void setup() {
Serial.begin(115200);
pinMode(LDR_PIN, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Sử dụng Pull-Up cho nút nhấn
dht.begin(); // Khởi động cảm biến DHT22
Serial.println("Hệ thống bắt đầu...");
WIFIConnect();
client.setServer(MQTT_SERVER, MQTT_PORT);
}
void loop() {
if (!client.connected()) {
MQTT_Reconnect(); // Kiểm tra và kết nối lại nếu MQTT bị ngắt kết nối
}
client.loop(); // Đảm bảo rằng MQTT tiếp tục chạy
sendData(); // Gửi dữ liệu
delay(1000); // Delay 1 giây giữa các lần gửi dữ liệu
}