// --- Định nghĩa các chân GPIO ---
const int BUTTON_PIN = 13;
const int RELAY_PIN = 16;
// --- Biến để "nhớ" trạng thái hiện tại của đèn ---
bool isLightOn = false;
// --- Biến dùng cho việc chống dội phím (debounce) ---
unsigned long lastDebounceTime = 0;
const long debounceDelay = 250; // 50ms
void setup() {
Serial.begin(115200);
// Nút nhấn là đầu vào
pinMode(BUTTON_PIN, INPUT);
// Relay là đầu ra
pinMode(RELAY_PIN, OUTPUT);
// Ban đầu, tắt Relay (xuất mức HIGH vì Relay là active-low)
digitalWrite(RELAY_PIN, HIGH);
}
void loop() {
// Đọc trạng thái nút nhấn
int buttonState = digitalRead(BUTTON_PIN);
// Chỉ thực hiện hành động khi nút VỪA ĐƯỢC NHẤN (đi từ LOW sang HIGH)
// và đã qua thời gian chống dội phím
if (buttonState == HIGH && (millis() - lastDebounceTime) > debounceDelay) {
// Đảo ngược trạng thái của đèn
isLightOn = !isLightOn;
// Điều khiển Relay dựa trên trạng thái mới
if (isLightOn) {
Serial.println("BẬT ĐÈN");
digitalWrite(RELAY_PIN, LOW); // Kích hoạt Relay để bật đèn
} else {
Serial.println("TẮT ĐÈN");
digitalWrite(RELAY_PIN, HIGH); // Tắt Relay
}
// Reset lại thời gian debounce sau mỗi lần nhấn thành công
lastDebounceTime = millis();
}
}