#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 15 // Chân GPIO 15 nối với DATA của DHT22
#define DHTTYPE DHT22 // Hoặc DHT11 nếu bạn sử dụng DHT11
#define RELAYPIN 2 // Chân GPIO 2 nối với Relay
#define BUTTONPIN 33 // Chân GPIO 33 nối với Button
#define PIRPIN 34 // Chân GPIO 34 nối với PIR
#define BUZZERPIN 25 // Chân GPIO 25 nối với Buzzer
#define LEDPIN 32 // Chân GPIO 32 nối với LED
// Khởi tạo các đối tượng
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Địa chỉ I2C của LCD là 0x27, màn hình 16x2
void setup() {
Serial.begin(115200);
// Khởi tạo cảm biến DHT
dht.begin();
// Khởi tạo LCD (sửa lại ở đây để chỉ định số cột và hàng)
lcd.begin(16, 2); // Khởi tạo LCD với 16 cột và 2 hàng
lcd.backlight();
// Khởi tạo các chân GPIO
pinMode(RELAYPIN, OUTPUT);
pinMode(BUTTONPIN, INPUT_PULLUP); // Nút bấm cần được nối với GND
pinMode(PIRPIN, INPUT);
pinMode(BUZZERPIN, OUTPUT);
pinMode(LEDPIN, OUTPUT);
// Hiển thị thông tin ban đầu trên LCD
lcd.setCursor(0, 0);
lcd.print("System Start");
}
void loop() {
// Đọc cảm biến DHT22 (nhiệt độ và độ ẩm)
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Kiểm tra xem dữ liệu có hợp lệ không
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Hiển thị nhiệt độ và độ ẩm lên LCD
lcd.setCursor(0, 1);
lcd.print("T: " + String(temperature) + "C H: " + String(humidity) + "%");
// Kiểm tra trạng thái nút bấm
if (digitalRead(BUTTONPIN) == LOW) { // Nếu nút bấm được nhấn
digitalWrite(RELAYPIN, HIGH); // Bật Relay
digitalWrite(LEDPIN, HIGH); // Bật LED
digitalWrite(BUZZERPIN, HIGH); // Bật Buzzer
delay(1000); // Đợi 1 giây
digitalWrite(RELAYPIN, LOW); // Tắt Relay
digitalWrite(LEDPIN, LOW); // Tắt LED
digitalWrite(BUZZERPIN, LOW); // Tắt Buzzer
}
// Kiểm tra cảm biến PIR (chuyển động)
if (digitalRead(PIRPIN) == HIGH) { // Nếu có chuyển động
digitalWrite(BUZZERPIN, HIGH); // Bật Buzzer
digitalWrite(LEDPIN, HIGH); // Bật LED
lcd.setCursor(0, 0);
lcd.print("Motion Detected!");
} else {
digitalWrite(BUZZERPIN, LOW); // Tắt Buzzer nếu không có chuyển động
digitalWrite(LEDPIN, LOW); // Tắt LED nếu không có chuyển động
lcd.setCursor(0, 0);
lcd.print("No Motion");
}
delay(2000); // Chờ 2 giây trước khi đọc lại cảm biến
}