#include <Wire.h>
#include <IRremote.h>
#include <LiquidCrystal_I2C.h>
// Định nghĩa chân
#define PIR_PIN 2 // Cảm biến PIR
#define LED_HALL_PIN 3 // LED hành lang
#define BTN_PIN 4 // Nút bấm
#define TRIG_PIN 5 // Chân TRIG của cảm biến siêu âm
#define ECHO_PIN 6 // Chân ECHO của cảm biến siêu âm
#define RELAY_PIN 7 // Chân Relay điều khiển máy bơm
#define IR_RECEIVER_PIN 8 // Chân nhận tín hiệu IR
// Khởi tạo màn hình LCD
LiquidCrystal_I2C lcd(0x27, 20, 4); // Địa chỉ LCD: 0x27
// Khởi tạo remote IR
IRrecv irrecv(IR_RECEIVER_PIN);
decode_results results;
// Khai báo biến cho debounce
unsigned long lastButtonPress = 0;
unsigned long debounceDelay = 200; // Thời gian debounce cho nút bấm
void setup() {
// Thiết lập chân
pinMode(PIR_PIN, INPUT);
pinMode(LED_HALL_PIN, OUTPUT);
pinMode(BTN_PIN, INPUT_PULLUP);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // Máy bơm ban đầu tắt
// Khởi động LCD
lcd.begin(20, 4);
lcd.print("System Initializing");
delay(2000);
lcd.clear();
lcd.print("Ready!");
// Khởi động IR receiver
irrecv.enableIRIn();
}
float getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2; // Khoảng cách tính bằng cm
}
void handlePIRSensor() {
if (digitalRead(PIR_PIN) == HIGH) { // Phát hiện chuyển động
digitalWrite(LED_HALL_PIN, HIGH); // Bật đèn hành lang
lcd.setCursor(0, 1);
lcd.print("Hall Light: ON ");
} else {
digitalWrite(LED_HALL_PIN, LOW); // Tắt đèn hành lang
lcd.setCursor(0, 1);
lcd.print("Hall Light: OFF");
}
}
void handleButtonPress() {
static bool userCheckedIn = false;
// Kiểm tra nếu nút được nhấn và tránh debounce
if (digitalRead(BTN_PIN) == LOW && (millis() - lastButtonPress) > debounceDelay) {
lastButtonPress = millis(); // Cập nhật thời gian nhấn nút
if (!userCheckedIn) {
userCheckedIn = true;
lcd.setCursor(0, 0);
lcd.print("User Checked In! ");
delay(2000); // Hiển thị 2 giây
lcd.setCursor(0, 0);
lcd.print("Waiting for user...");
}
}
}
void handleWaterPump() {
float distance = getDistance(); // Đo khoảng cách từ cảm biến siêu âm
if (distance < 10) { // Nếu nước đầy (khoảng cách nhỏ hơn 10 cm)
digitalWrite(RELAY_PIN, LOW); // Tắt máy bơm
lcd.setCursor(0, 2);
lcd.print("Pump: OFF ");
} else if (distance > 30) { // Nếu nước hết (khoảng cách lớn hơn 30 cm)
digitalWrite(RELAY_PIN, HIGH); // Bật máy bơm
lcd.setCursor(0, 2);
lcd.print("Pump: ON ");
}
}
void handleIRRemote() {
if (irrecv.decode(&results)) {
switch (results.value) {
case 0xFFA25D: // Nút POWER trên remote
digitalWrite(LED_HALL_PIN, !digitalRead(LED_HALL_PIN)); // Bật/tắt đèn hành lang
lcd.setCursor(0, 1);
lcd.print(digitalRead(LED_HALL_PIN) ? "Hall Light: ON " : "Hall Light: OFF");
break;
case 0xFFE21D: // Nút UP trên remote
digitalWrite(RELAY_PIN, HIGH); // Bật máy bơm
lcd.setCursor(0, 2);
lcd.print("Pump: ON ");
break;
case 0xFFA857: // Nút DOWN trên remote
digitalWrite(RELAY_PIN, LOW); // Tắt máy bơm
lcd.setCursor(0, 2);
lcd.print("Pump: OFF ");
break;
}
irrecv.resume(); // Tiếp tục nhận tín hiệu
}
}
void loop() {
handlePIRSensor(); // Xử lý cảm biến PIR
handleButtonPress(); // Xử lý nút bấm
handleWaterPump(); // Xử lý cảm biến siêu âm và máy bơm
handleIRRemote(); // Xử lý điều khiển IR
delay(100); // Giảm tải cho vòng lặp
}