// Định nghĩa các chân LED
const int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; // Các chân LED
const int numLeds = 11; // Số lượng LED
const int buttonPin = 13; // Chân nút nhấn
const int buzzerPin = 14; // Chân của Buzzer
bool isBlinking = false; // Trạng thái nháy LED
bool lastButtonState = HIGH; // Trạng thái trước đó của nút
bool currentButtonState = HIGH; // Trạng thái hiện tại của nút
unsigned long lastDebounceTime = 0; // Thời gian debounce cuối cùng
const unsigned long debounceDelay = 10; // Thời gian khử rung (10ms)
int currentLedIndex = 0; // Vị trí LED hiện tại
bool goingForward = true; // Hướng đi của đèn (đi tới hoặc lùi)
unsigned long lastBlinkTime = 0; // Thời gian lần nháy LED cuối cùng
const unsigned long blinkInterval = 1200; // Thời gian giữa các lần nháy LED
void setup() {
// Khởi tạo các chân LED là OUTPUT và tắt tất cả LED
for (int i = 0; i < numLeds; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW); // Tắt tất cả LED khi khởi động
}
// Khởi tạo chân nút nhấn là INPUT với điện trở kéo ngoài
pinMode(buttonPin, INPUT_PULLUP);
// Khởi tạo chân buzzer là OUTPUT và tắt buzzer
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, LOW);
}
void loop() {
// Đọc trạng thái nút nhấn
int reading = digitalRead(buttonPin);
// Kiểm tra nếu trạng thái nút nhấn thay đổi
if (reading != lastButtonState) {
lastDebounceTime = millis(); // Cập nhật thời gian debounce
}
// Nếu đã qua thời gian khử rung, cập nhật trạng thái nút nhấn
if ((millis() - lastDebounceTime) > debounceDelay) {
// Kiểm tra nếu trạng thái hiện tại khác với trạng thái đã lưu
if (reading != currentButtonState) {
currentButtonState = reading;
// Nếu nút được nhấn (LOW), thay đổi trạng thái nháy LED
if (currentButtonState == LOW) {
isBlinking = !isBlinking; // Đổi trạng thái nháy LED
// Nếu dừng nháy, tắt tất cả LED và buzzer
if (!isBlinking) {
turnOffLedsAndBuzzer();
}
}
}
}
// Cập nhật trạng thái nút trước đó
lastButtonState = reading;
// Nếu đang nháy LED
if (isBlinking) {
// Kiểm tra xem đã đến thời gian để nháy LED tiếp chưa
if (millis() - lastBlinkTime > blinkInterval) {
lastBlinkTime = millis(); // Cập nhật thời gian nháy cuối cùng
blinkLedsAndBuzz(); // Nháy LED và Buzzer
}
}
}
// Hàm nháy LED và buzzer từng bước
void blinkLedsAndBuzz() {
// Bật LED hiện tại và buzzer
digitalWrite(ledPins[currentLedIndex], HIGH);
digitalWrite(buzzerPin, HIGH);
tone(buzzerPin, 262, 100); // Âm thanh buzzer
delay(100); // Thời gian bật ngắn
digitalWrite(ledPins[currentLedIndex], LOW); // Tắt LED hiện tại
digitalWrite(buzzerPin, LOW); // Tắt buzzer
// Cập nhật vị trí LED tiếp theo
if (goingForward) {
currentLedIndex++;
if (currentLedIndex >= numLeds) {
currentLedIndex = numLeds - 1;
goingForward = false; // Đổi hướng ngược lại
}
} else {
currentLedIndex--;
if (currentLedIndex < 0) {
currentLedIndex = 0;
goingForward = true; // Đổi hướng đi tới
}
}
}
// Hàm tắt tất cả LED và buzzer
void turnOffLedsAndBuzzer() {
for (int i = 0; i < numLeds; i++) {
digitalWrite(ledPins[i], LOW);
}
digitalWrite(buzzerPin, LOW); // Tắt buzzer
}