const int RED_PIN = 2;  // LED đỏ
const int GREEN_PIN = 3; // LED xanh lá
const int BLUE_PIN = 4; // LED xanh dương 
int DELAY_TIME = 500;
void setup() 
{
  pinMode(RED_PIN, OUTPUT); // khởi tạo chân Output 
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
}
void loop()
{
  displayAllBasicColors(); // gọi hàm displayAllBasicColors thể hiện toàn bộ màu cơ bản 
  showSpectrum();  // gọi hàm showSpectrum để chạy hiệu ứng cầu vồng.
}
void displayAllBasicColors()
{
digitalWrite(RED_PIN, LOW); // tắt toàn bộ đèn 
  digitalWrite(GREEN_PIN, LOW);
  digitalWrite(BLUE_PIN, LOW);
 
  delay(500);
  digitalWrite(RED_PIN, HIGH); // chỉ bật đèn màu đỏ 
  digitalWrite(GREEN_PIN, LOW);
  digitalWrite(BLUE_PIN, LOW);
 
  delay(400);
  digitalWrite(RED_PIN, LOW);
  digitalWrite(GREEN_PIN, HIGH); // chỉ bật đèn màu xanh lá cây 
  digitalWrite(BLUE_PIN, LOW);
  delay(400);
  digitalWrite(RED_PIN, LOW);
  digitalWrite(GREEN_PIN, LOW);
  digitalWrite(BLUE_PIN, HIGH); // chỉ bật đèn màu xanh dương 
  delay(300);
  // bật đèn vàng
  digitalWrite(RED_PIN, HIGH);
  digitalWrite(GREEN_PIN, HIGH);
  digitalWrite(BLUE_PIN, LOW);
  delay(300);
}
  void showSpectrum() // cài đặt hàm showSpectrum
  {
    for (int i = 0; i < 768; i++)
    {
      showRGB(i);
      delay(10);
    }
  }
  void showRGB(int color) // cài đặt hàm showRGB(int color)
 // cài đặt hàm showRGB để mỗi khi nhận một giá trị từ 0 - 767 


  {
    int redPWM;
    int greenPWM;
    int bluePWM;
   
      if (color <= 255) // xanh lục 100% 
      {
        redPWM = 255 - color; // màu đỏ dần dần tắt 
        greenPWM = color; // màu xanh lá dần sáng 
        bluePWM = 0;// màu xanh dương luôn tắt 
      }
      else if (color <= 511) // xanh dương 100% 
      {
        redPWM = 0;  // màu đỏ luôn tắt 
        greenPWM = 255 - color; // màu xanh lá dần dần tắt 
        bluePWM = (color - 256); // màu xanh dương từ tắt thành sáng 
      }  
      else // color >= 512 //màu đỏ sáng 100% 
      {
        redPWM = (color - 512);  // màu đỏ dần dần sáng 
        greenPWM = 0;  // màu xanh lá cây luôn tắt 
        bluePWM = 255 - color; // màu xanh sáng rồi lại tắt 
      }
      analogWrite(RED_PIN, redPWM);
  analogWrite(BLUE_PIN, bluePWM);
  analogWrite(GREEN_PIN, greenPWM);
  }