// Định nghĩa các chân GPIO kết nối với các LED
const int ledPins[] = { 0, 16, 2, 4, 15, 17, 5, 18, 19, 33, 25, 26, 33 };  // Chân GPIO kết nối với các LED
const int numLEDs = 12;  // Tổng số lượng LED

void setup() {
  // Thiết lập tất cả các chân LED là OUTPUT
  for (int i = 0; i < numLEDs; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
}

void loop() {
  // Hiệu ứng 1: Nhấp nháy liên tiếp
  blinkSequence();
  
  // Hiệu ứng 2: LED chạy đuổi
  chasingEffect();
  
  // Hiệu ứng 3: Sóng
  waveEffect();
  
  // Hiệu ứng 4: Nhấp nháy ngẫu nhiên
  randomBlink();
  
  // Hiệu ứng 5: Fade (Chạy qua LED theo dải sáng mờ dần)
  fadeEffect();
  
  // Hiệu ứng 6: Ripple (Sóng lướt từ trung tâm ra ngoài)
  rippleEffect();
}

// Hiệu ứng Nhấp nháy liên tiếp (Chạy vòng quanh)
void blinkSequence() {
  for (int i = 0; i < numLEDs; i++) {
    digitalWrite(ledPins[i], HIGH);  // Bật LED
    delay(100);                       // Đợi 100 ms
    digitalWrite(ledPins[i], LOW);   // Tắt LED
  }
}

// Hiệu ứng Chạy đuổi (LED chạy theo chiều từ trái qua phải)
void chasingEffect() {
  for (int i = 0; i < numLEDs; i++) {
    digitalWrite(ledPins[i], HIGH);  // Bật LED
    delay(100);                       // Đợi 100 ms
    digitalWrite(ledPins[i], LOW);   // Tắt LED
  }
  
  // LED chạy từ phải sang trái
  for (int i = numLEDs - 1; i >= 0; i--) {
    digitalWrite(ledPins[i], HIGH);  // Bật LED
    delay(100);                       // Đợi 100 ms
    digitalWrite(ledPins[i], LOW);   // Tắt LED
  }
}

// Hiệu ứng Sóng (Chạy theo sóng, LED sáng liên tiếp theo nhóm)
void waveEffect() {
  int waveLength = 4; // Số lượng LED sáng trong một lần sóng

  for (int start = 0; start < numLEDs; start++) {
    // Bật sáng các LED theo nhóm
    for (int i = start; i < start + waveLength && i < numLEDs; i++) {
      digitalWrite(ledPins[i], HIGH);  // Bật LED
    }
    delay(200); // Đợi 200 ms

    // Tắt tất cả các LED
    for (int i = start; i < start + waveLength && i < numLEDs; i++) {
      digitalWrite(ledPins[i], LOW);   // Tắt LED
    }
  }
}

// Hiệu ứng Nhấp nháy ngẫu nhiên
void randomBlink() {
  // Nhấp nháy ngẫu nhiên 10 lần
  for (int i = 0; i < 10; i++) {
    int randomLED = random(0, numLEDs);  // Chọn một LED ngẫu nhiên
    digitalWrite(ledPins[randomLED], HIGH);  // Bật LED
    delay(200);                             // Đợi 200 ms
    digitalWrite(ledPins[randomLED], LOW);   // Tắt LED
    delay(200);                             // Đợi 200 ms
  }
}

// Hiệu ứng Fade (Chạy qua LED theo dải sáng mờ dần)
void fadeEffect() {
  for (int i = 0; i < numLEDs; i++) {
    // Fade in: LED sáng từ từ
    for (int brightness = 0; brightness <= 255; brightness++) {
      analogWrite(ledPins[i], brightness);  // Điều chỉnh độ sáng LED từ 0 đến 255
      delay(10);                            // Đợi 10 ms
    }
    // Fade out: LED mờ dần
    for (int brightness = 255; brightness >= 0; brightness--) {
      analogWrite(ledPins[i], brightness);  // Giảm độ sáng LED từ 255 xuống 0
      delay(10);                            // Đợi 10 ms
    }
  }
}

// Hiệu ứng Ripple (Sóng lướt từ trung tâm ra ngoài)
void rippleEffect() {
  for (int i = 0; i < numLEDs; i++) {
    // Sáng dần từ giữa ra ngoài
    if (i <= numLEDs / 2) {
      digitalWrite(ledPins[numLEDs / 2 - i], HIGH);
      digitalWrite(ledPins[numLEDs / 2 + i], HIGH);
    } else {
      digitalWrite(ledPins[i], LOW);
    }
    delay(100);
  }
}
$abcdeabcde151015202530354045505560fghijfghij