#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"
#include <LiquidCrystal_I2C.h>
// Cấu hình chân cảm biến
#define DHT_PIN 15 // Chân GPIO cho DHT22
#define PIR_PIN 12 // Chân GPIO cho PIR Motion Sensor
#define LED_PIN 32 // Chân GPIO cho LED
// Cấu hình đối tượng DHT22 và LCD
DHTesp dhtSensor;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Địa chỉ LCD: 0x27, LCD 16x2
// Cấu hình WiFi
const char* ssid = "Wokwi-GUEST"; // Tên WiFi
const char* password = ""; // Mật khẩu WiFi
// Cấu hình MQTT
const char* mqtt_server = "broker.hivemq.com"; // MQTT Broker
const int mqtt_port = 1883; // Cổng MQTT
const char* mqtt_client_name = "kkk"; // MQTT Client Name
const char* temp_topic = "test/mqttbox01/temperature"; // Topic gửi nhiệt độ
const char* hum_topic = "test/mqttbox01/humidity"; // Topic gửi độ ẩm
const char* pir_topic = "test/mqttbox01/motion"; // Topic gửi trạng thái chuyển động
const char* led_control_topic = "test/mqttbox01/led_control"; // Topic nhận tín hiệu điều khiển LED
// Đối tượng WiFi và MQTT client
WiFiClient espClient;
PubSubClient client(espClient);
// Biến thời gian gửi dữ liệu
unsigned long lastMsg = 0;
void setup_wifi() {
Serial.println("Connecting to WiFi...");
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());
}
// Callback xử lý tín hiệu nhận từ MQTT
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("]: ");
String message;
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
message += (char)payload[i];
}
Serial.println();
// Kiểm tra topic và xử lý tín hiệu
if (String(topic) == led_control_topic) {
if (message == "ON") {
digitalWrite(LED_PIN, HIGH); // Bật LED
Serial.println("LED turned ON via MQTT");
} else if (message == "OFF") {
digitalWrite(LED_PIN, LOW); // Tắt LED
Serial.println("LED turned OFF via MQTT");
} else {
Serial.println("Unknown LED command");
}
}
}
void reconnect() {
// Kết nối lại MQTT nếu bị ngắt
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect(mqtt_client_name)) {
Serial.println("Connected to MQTT broker!");
client.subscribe(led_control_topic); // Đăng ký nhận tín hiệu điều khiển LED
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds...");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
// Khởi tạo cảm biến DHT22
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// Khởi tạo chân PIR và LED
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
// Khởi tạo LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
delay(2000);
// Kết nối WiFi và MQTT
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect(); // Kết nối lại nếu MQTT bị ngắt
}
client.loop();
unsigned long now = millis();
if (now - lastMsg > 2000) { // Gửi dữ liệu mỗi 2 giây
lastMsg = now;
// Đọc dữ liệu từ cảm biến DHT22
TempAndHumidity data = dhtSensor.getTempAndHumidity();
String temp = String(data.temperature, 1);
String hum = String(data.humidity, 1);
// Đọc trạng thái từ PIR Sensor
int motionDetected = digitalRead(PIR_PIN);
String motionStatus = motionDetected ? "Motion Detected" : "No Motion";
// Hiển thị dữ liệu lên LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temp);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(hum);
lcd.print("%");
// Log dữ liệu lên Serial
Serial.print("Temperature: ");
Serial.println(temp);
Serial.print("Humidity: ");
Serial.println(hum);
Serial.print("PIR Motion: ");
Serial.println(motionStatus);
// Gửi dữ liệu lên MQTT Broker
client.publish(temp_topic, temp.c_str());
client.publish(hum_topic, hum.c_str());
client.publish(pir_topic, motionStatus.c_str());
}
}