// Khai báo các chân kết nối của ESP32 đến các đèn LED
const int ledPins[] = {15, 2, 0, 4, 16, 17, 26, 25, 33, 19, 18, 5};

void setup() {
  // Khởi tạo các chân kết nối là OUTPUT
  for (int i = 0; i < 12; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
}

// Hàm bật tất cả các đèn LED
void allLightsOn() {
  for (int i = 0; i < 12; i++) {
    digitalWrite(ledPins[i], HIGH);
  }
  delay(1000);  // Để tất cả các đèn sáng trong 1 giây
}

// Hàm chạy đèn LED vòng quanh
void runningLights() {
  for (int i = 0; i < 12; i++) {
    digitalWrite(ledPins[i], HIGH);
    delay(100);
    digitalWrite(ledPins[i], LOW);
  }
}

// Hàm chạy đèn LED ngược lại
void reverseRunningLights() {
  for (int i = 11; i >= 0; i--) {
    digitalWrite(ledPins[i], HIGH);
    delay(100);
    digitalWrite(ledPins[i], LOW);
  }
}

// Hàm nhấp nháy các đèn LED
void blinkingLights() {
  for (int i = 0; i < 12; i++) {
    digitalWrite(ledPins[i], HIGH);
  }
  delay(500);
  for (int i = 0; i < 12; i++) {
    digitalWrite(ledPins[i], LOW);
  }
  delay(500);
}

// Hàm sóng biển
void waveLights() {
  for (int i = 0; i < 6; i++) {
    digitalWrite(ledPins[i], HIGH);
    digitalWrite(ledPins[11 - i], HIGH);
    delay(100);
    digitalWrite(ledPins[i], LOW);
    digitalWrite(ledPins[11 - i], LOW);
  }
}

// Hàm nhấp nháy ngẫu nhiên
void randomBlinking() {
  for (int i = 0; i < 12; i++) {
    if (random(2) == 0) { // Tạo ngẫu nhiên 50% tỷ lệ nhấp nháy
      digitalWrite(ledPins[i], HIGH);
    } else {
      digitalWrite(ledPins[i], LOW);
    }
  }
  delay(500); // Dừng lại sau mỗi lần nhấp nháy ngẫu nhiên
}

// Hàm chiếu sáng một nửa đèn
void halfLights() {
  for (int i = 0; i < 6; i++) {
    digitalWrite(ledPins[i], HIGH); // Nửa đầu sáng
    digitalWrite(ledPins[11 - i], LOW); // Nửa cuối tắt
  }
  delay(500);
  for (int i = 0; i < 6; i++) {
    digitalWrite(ledPins[i], LOW); // Tắt nửa đầu
    digitalWrite(ledPins[11 - i], HIGH); // Nửa cuối sáng
  }
  delay(500);
}

// Hàm pha trộn (fade in/out)
void fadeInOut() {
  // Fade in
  for (int brightness = 0; brightness <= 255; brightness++) {
    for (int i = 0; i < 12; i++) {
      analogWrite(ledPins[i], brightness); // Điều chỉnh độ sáng dần dần
    }
    delay(10);
  }
  
  delay(500);
  
  // Fade out
  for (int brightness = 255; brightness >= 0; brightness--) {
    for (int i = 0; i < 12; i++) {
      analogWrite(ledPins[i], brightness); // Mờ dần các đèn
    }
    delay(10);
  }
}

void loop() {
  allLightsOn();          // Bật tất cả các đèn LED
  delay(500);             // Dừng lại một chút sau khi bật hết đèn
  
  runningLights();        // Chạy đèn vòng quanh
  delay(500);             // Dừng lại một chút sau khi chạy vòng quanh
  
  reverseRunningLights(); // Chạy đèn vòng ngược lại
  delay(500);             // Dừng lại một chút
  
  waveLights();           // Tạo hiệu ứng sóng biển
  delay(500);             // Dừng lại một chút sau khi tạo sóng biển
  
  randomBlinking();       // Tạo hiệu ứng nhấp nháy ngẫu nhiên
  delay(500);             // Dừng lại một chút sau khi nhấp nháy
  
  halfLights();           // Chiếu sáng một nửa đèn
  delay(500);             // Dừng lại một chút
  
  fadeInOut();            // Hiệu ứng fade in/out
  delay(500);             // Dừng lại một chút sau khi fade out
}
$abcdeabcde151015202530354045505560fghijfghij