// Khai báo các chân cho 8 LED và nút bấm
const int ledPinsArray[] = {16, 17, 5, 18, 19, 21, 22, 23}; // Các chân GPIO của ESP32 cho LED
const int inputButtonPin = 4; // Chân GPIO cho nút bấm
const int numOfLeds = 8; // Tổng số LED
int activeMode = 1; // Chế độ khởi đầu
void setup() {
// Cài đặt chế độ cho các chân LED và nút bấm
for (int index = 0; index < numOfLeds; index++) {
pinMode(ledPinsArray[index], OUTPUT);
digitalWrite(ledPinsArray[index], LOW); // Đảm bảo LED tắt khi bắt đầu
}
pinMode(inputButtonPin, INPUT_PULLUP); // Nút bấm với điện trở kéo lên nội bộ
controlLeds(0); // Tắt tất cả LED ngay lập tức sau khi khởi động
}
void controlLeds(uint32_t pattern) {
// Cập nhật trạng thái LED dựa trên giá trị nhị phân của pattern
for (int i = 0; i < numOfLeds; i++) {
digitalWrite(ledPinsArray[i], (pattern & (1 << i)) ? HIGH : LOW);
}
}
void patternMode1() {
for (uint32_t bitPattern = 0x01; bitPattern <= 0xFF; bitPattern = (bitPattern << 1) | 0x01) {
controlLeds(bitPattern);
delay(300);
}
controlLeds(0); // Tắt tất cả LED
}
void patternMode2() {
uint32_t bitPattern = 0xFF; // Khởi động với tất cả LED sáng
controlLeds(bitPattern);
delay(300);
for (uint32_t shift = 0; shift < numOfLeds; shift++) {
bitPattern >>= 1; // Dịch phải một bit
controlLeds(bitPattern);
delay(300);
}
controlLeds(0xFF); // Bật lại tất cả LED
}
void patternMode3() {
// LED sáng từ ngoài vào trong
for (int step = 0; step < numOfLeds / 2; step++) {
controlLeds((1 << step) | (1 << (numOfLeds - 1 - step))); // Bật LED từ ngoài vào trong
delay(300);
}
controlLeds(0); // Tắt tất cả LED
delay(300);
}
void patternMode4() {
// LED sáng từ trong ra ngoài
for (int step = 0; step < numOfLeds / 2; step++) {
controlLeds((1 << (numOfLeds / 2 - 1 - step)) | (1 << (numOfLeds / 2 + step))); // Bật LED từ trong ra ngoài
delay(300);
}
controlLeds(0); // Tắt tất cả LED
delay(300);
}
void loop() {
static unsigned long previousButtonPressTime = 0; // Lưu thời gian lần nhấn nút trước
unsigned long currentTime = millis(); // Lấy thời gian hiện tại
if (digitalRead(inputButtonPin) == LOW) { // Kiểm tra nếu nút được nhấn
if (currentTime - previousButtonPressTime > 200) { // Kiểm tra khoảng thời gian giữa các lần nhấn
previousButtonPressTime = currentTime; // Cập nhật thời gian nhấn
activeMode = (activeMode == 4) ? 1 : activeMode + 1; // Chuyển sang chế độ tiếp theo
}
}
// Thực thi chế độ hiện tại
if (activeMode == 1) {
patternMode1();
} else if (activeMode == 2) {
patternMode2();
} else if (activeMode == 3) {
patternMode3();
} else {
patternMode4();
}
}