const int ledPins[] = {2, 0, 4, 16, 17, 5, 18, 19}; // GPIO của ESP32
const int buttonPin = 15; // GPIO nút nhấn
const int ledCount = 8; // Số lượng LED
int currentMode = 1; // Chế độ bắt đầu
bool lastButtonState = HIGH; // Trạng thái nút nhấn trước đó
unsigned long lastButtonPress = 0; // Thời gian nhấn nút cuối cùng
void setup() {
for (int i = 0; i < ledCount; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW); // Tắt LED ban đầu
}
pinMode(buttonPin, INPUT_PULLUP); // Kích hoạt điện trở kéo lên nội bộ
Serial.begin(115200); // Serial monitor
set_led(0); // Tắt tất cả LED
}
void set_led(uint32_t state) {
for (int i = 0; i < ledCount; i++) {
digitalWrite(ledPins[i], (state & (1 << i)) ? HIGH : LOW);
}
}
void turnoff(){
for(int i=0;i<8;i++){
digitalWrite(ledPins[i], LOW);
}
}
void turnon(){
for(int i=0;i<8;i++){
digitalWrite(ledPins[i], HIGH);
}
}
// sang dan trai sang phai
void mode_1() {
turnoff();
for (int i=0;i<8;i++) {
digitalWrite(ledPins[i], HIGH);
delay(500);
}
}
// tat dan phai sang trai
void mode_2() {
turnon();
for(int i=7;i>=0;i--){
digitalWrite(ledPins[i], LOW);
delay(500);
}
}
void mode_3() {
turnoff();
for (int i = 0; i < ledCount / 2; i++) {
{ digitalWrite(ledPins[i], HIGH);
digitalWrite(ledPins[ledCount-i-1], HIGH);
}// Bật LED từ ngoài vào trong
delay(500);
}
}
void mode_4() {
turnoff();
for (int i = 4; i>=0; i--) {
{digitalWrite(ledPins[i], HIGH);
digitalWrite(ledPins[ledCount-i-1], HIGH);} // Bật LED từ trong ra ngoài
delay(500);
}
}
void loop() {
unsigned long currentMillis = millis();
bool buttonState = digitalRead(buttonPin);
// Kiểm tra nút nhấn
if (buttonState == LOW && lastButtonState == HIGH && (currentMillis - lastButtonPress > 200)) {
lastButtonPress = currentMillis; // Cập nhật thời gian nhấn
currentMode = (currentMode == 4) ? 1 : currentMode + 1; // Chuyển chế độ
Serial.println("Chế độ hiện tại: " + String(currentMode));
}
lastButtonState = buttonState;
// Thực hiện chế độ
switch (currentMode) {
case 1:
mode_1();
break;
case 2:
mode_2();
break;
case 3:
mode_3();
break;
case 4:
mode_4();
break;
}
}