const int RED_PIN = 9; // led đỏ
const int GREEN_PIN = 10; // led xanh lá
const int BLUE_PIN = 11; // led xanh dương
//Hằng số đợi giữa mỗi lần đổi trạng thái
int DELAY_TIME = 1000;
void setup()
{
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
}
void loop()
{
// Gọi hàm displayAllBasicColors để thể hiện toàn bộ các màu cơ bản
displayAllBasicColors();
// Gọi hàm showSpectrum để chạy hiệu ứng cầu vồng.
showSpectrum();
}
// Cài đặt hàm displayAllBasicColors
void displayAllBasicColors()
{
// Tắt toàn bộ các led
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
delay(DELAY_TIME);
// Chỉ bật led đỏ
digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
delay(DELAY_TIME);
// Chỉ bật led xanh lá
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, LOW);
delay(DELAY_TIME);
// Chỉ bật led xanh dương
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);
delay(DELAY_TIME);
// Bật màu vàng bắng cách bật led đỏ và xanh
digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, LOW);
delay(DELAY_TIME);
// Xanh lam (Cyan) bằng cách bật led xanh lá và xanh dương
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);
delay(DELAY_TIME);
// Tím (đỏ xanh dương)
digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);
delay(DELAY_TIME);
// Màu trắng (tất cả các led)
digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);
delay(DELAY_TIME);
}
// Cài đặt hàm showSpectrum
void showSpectrum()
{
for (int i = 0; i < 768; i++)
{
showRGB(i); // Call RGBspectrum() with our new x
delay(10); // Delay 10ms
}
}
// Cài đặt hàm showRGB(int color)
/* Chúng ta sẽ cài đặt hàm showRGB để mỗi khi nhận một giá trị từ 0 - 767
đỏ - xanh lục
xanh lục - xanh lam
xanh lam - đỏ
gồm có 4 mốc
0 = đỏ chét (đỏ 100%)
255 = xanh lục 100%
511 = xanh dương (100%)
767 = lại là đỏ chét
Những con số nằm giữa các màu sẽ được tính toán theo công thức bên dưới (đọc dễ hiểu mà) để ra được các màu cần thiết
*/
void showRGB(int color)
{
int redPWM;
int greenPWM;
int bluePWM;
if (color <= 255) // phân vùng 1
{
redPWM = 255 - color; // red đi từ sáng về tắt
greenPWM = color; // green đi từ tắt thành sáng
bluePWM = 0; // blue luôn tắt
}
else if (color <= 511) // phân vùng 2
{
redPWM = 0; // đỏ luôn tắt
greenPWM = 255 - (color - 256); // green đi từ sáng về tắt
bluePWM = (color - 256); // blue đi từ tắt thành sáng
}
else // color >= 512 // phân vùng 3
{
redPWM = (color - 512); // red tắt rồi lại sáng
greenPWM = 0; // green luôn tắt nhé
bluePWM = 255 - (color - 512); // blue sáng rồi lại tắt
}
// rồi xuất xung ra và chơi thôi :3
analogWrite(RED_PIN, redPWM);
analogWrite(BLUE_PIN, bluePWM);
analogWrite(GREEN_PIN, greenPWM);
}