// ================= CẤU HÌNH CHÂN (PINS) =================
const int SENSOR_PIN = 34;
const int RELAY_PINS[3] = {21, 22, 23};
const int BTN_PINS[3] = {13, 16, 17};
// ================= BIẾN TRẠNG THÁI =================
bool isAutoMode = true;
bool relayStates[3] = {LOW, LOW, LOW};
bool lastButtonState[3] = {HIGH, HIGH, HIGH};
bool buttonState[3] = {HIGH, HIGH, HIGH};
unsigned long lastDebounceTime[3] = {0, 0, 0};
unsigned long buttonPressTime[3] = {0, 0, 0};
const unsigned long debounceDelay = 50;
const unsigned long longPressTime = 2000;
void setup() {
Serial.begin(115200);
pinMode(SENSOR_PIN, INPUT);
for (int i = 0; i < 3; i++) {
pinMode(RELAY_PINS[i], OUTPUT);
// SỬA LỖI 1: Relay kích mức thấp, nên mặc định phải xuất HIGH để đèn TẮT
digitalWrite(RELAY_PINS[i], HIGH);
pinMode(BTN_PINS[i], INPUT);
}
Serial.println("Hệ thống khởi động. Đang ở chế độ: TỰ ĐỘNG");
}
void loop() {
// --------------------------------------------------------
// 1. XỬ LÝ NÚT NHẤN VÀ CHẾ ĐỘ THỦ CÔNG
// --------------------------------------------------------
for (int i = 0; i < 3; i++) {
int reading = digitalRead(BTN_PINS[i]);
if (reading != lastButtonState[i]) {
lastDebounceTime[i] = millis();
}
if ((millis() - lastDebounceTime[i]) > debounceDelay) {
if (reading != buttonState[i]) {
buttonState[i] = reading;
if (buttonState[i] == LOW) {
buttonPressTime[i] = millis();
}
else {
unsigned long pressDuration = millis() - buttonPressTime[i];
if (i == 0 && pressDuration >= longPressTime) {
isAutoMode = true;
Serial.println(">>> Đã chuyển sang chế độ: TỰ ĐỘNG <<<");
}
else if (pressDuration > 10) {
if (isAutoMode) {
isAutoMode = false;
Serial.println(">>> Đã ngắt tự động, chuyển sang THỦ CÔNG <<<");
}
relayStates[i] = !relayStates[i];
digitalWrite(RELAY_PINS[i], relayStates[i] ? HIGH : LOW);
Serial.print("Đã "); Serial.print(relayStates[i] ? "BẬT" : "TẮT");
Serial.print(" đèn số "); Serial.println(i + 1);
}
}
}
}
lastButtonState[i] = reading;
}
// --------------------------------------------------------
// 2. XỬ LÝ CẢM BIẾN VÀ CHẾ ĐỘ TỰ ĐỘNG
// --------------------------------------------------------
if (isAutoMode) {
int sensorValue = digitalRead(SENSOR_PIN);
bool shouldBeOn = (sensorValue == HIGH);
// SỬA LỖI 2: Quét qua cả 3 đèn xem có đèn nào đang sai trạng thái không
bool needUpdate = false;
for (int i = 0; i < 3; i++) {
if (relayStates[i] != shouldBeOn) {
needUpdate = true;
break;
}
}
// Nếu có sự chênh lệch (do cảm biến đổi trạng thái, hoặc do vừa từ Thủ công nhảy sang)
if (needUpdate) {
Serial.println("------------------------------------");
if (shouldBeOn) Serial.println("[TỰ ĐỘNG] Cảm biến báo TỐI -> BẬT tất cả đèn");
else Serial.println("[TỰ ĐỘNG] Cảm biến báo SÁNG -> TẮT tất cả đèn");
Serial.println("------------------------------------");
// Cập nhật lại đồng loạt cả 3 đèn
for (int i = 0; i < 3; i++) {
relayStates[i] = shouldBeOn;
// SỬA LỖI 3: Đồng bộ dùng LOW : HIGH giống hệt phần thủ công
digitalWrite(RELAY_PINS[i], relayStates[i] ? HIGH : LOW);
}
}
}
delay(20);
}