彩虹效果(Rainbow Effect)
實現 LED 燈條上逐漸變換顏色的彩虹效果。具體來說,LED 的顏色會在紅、綠、藍三個基色之間緩慢變化,從而在燈條上形成一個流動的彩虹效果。下面是對這段代碼的詳細說明。
函數介紹
void Rainbow_effect()
{
int color_changespeed = 20;
brightness = default_brightness;
strip.setBrightness(brightness);
for(int i = 0; i < strip.numPixels(); i++) { // 遍歷每個像素
strip.setPixelColor(i, strip.Color(r, g, b)); // 設置紅色
strip.show();
}
if(Rainbow_effect_rflag == 0)
{
r = r - random(color_changespeed);
if(r < 30){
Rainbow_effect_rflag = 1;
r = 30;
}
}
else
{
r = r + random(color_changespeed);
if(r > 255 - color_changespeed){
Rainbow_effect_rflag = 0;
r = 255;
}
}
if(Rainbow_effect_gflag == 0)
{
g = g - random(color_changespeed);
if(g < 30){
Rainbow_effect_gflag = 1;
g = 30;
}
}
else
{
g = g + random(color_changespeed);
if(g > 255 - color_changespeed){
Rainbow_effect_gflag = 0;
g = 255;
}
}
if(Rainbow_effect_bflag == 0)
{
b = b - random(color_changespeed);
if(b < 30){
Rainbow_effect_bflag = 1;
b = 30;
}
}
else
{
b = b + random(color_changespeed);
if(b > 255 - color_changespeed){
Rainbow_effect_bflag = 0;
b = 255;
}
}
delay(50);
}
int color_changespeed = 20;:這個變量定義了顏色變化的速度。值越大,顏色變化的幅度越大,彩虹效果的變換速度就越快。brightness = default_brightness;:這行代碼將亮度設置為預設亮度。strip.setBrightness(brightness);:將亮度應用到燈條上。for(int i = 0; i < strip.numPixels(); i++):這個迴圈遍歷燈條上的每個 LED。strip.setPixelColor(i, strip.Color(r, g, b));:這行代碼設置當前 LED 的顏色,使用r、g和b三個變量來表示紅色、綠色和藍色的值。strip.show();:這行代碼更新燈條的顯示,將剛剛設定的顏色應用到 LED 上。
顏色變化邏輯
接下來的部分代碼負責控制紅色 (r)、綠色 (g) 和藍色 (b) 的值,使它們隨時間逐漸變化,從而形成流動的彩虹效果。
紅色變化
if(Rainbow_effect_rflag == 0)
{
r = r - random(color_changespeed);
if(r < 30){
Rainbow_effect_rflag = 1;
r = 30;
}
}
else
{
r = r + random(color_changespeed);
if(r > 255 - color_changespeed){
Rainbow_effect_rflag = 0;
r = 255;
}
}
Rainbow_effect_rflag:這個標誌變量用來控制紅色的值是增加還是減少。- 當
Rainbow_effect_rflag為 0 時,紅色 (r) 的值隨機減少,顏色逐漸從紅色減弱。 - 當紅色的值減少到 30 以下時,
Rainbow_effect_rflag變為 1,開始增加紅色的值。 - 當
Rainbow_effect_rflag為 1 時,紅色 (r) 的值隨機增加,顏色逐漸回到紅色。 - 當紅色的值超過 255 時,
Rainbow_effect_rflag重新設為 0。
綠色變化
if(Rainbow_effect_gflag == 0)
{
g = g - random(color_changespeed);
if(g < 30){
Rainbow_effect_gflag = 1;
g = 30;
}
}
else
{
g = g + random(color_changespeed);
if(g > 255 - color_changespeed){
Rainbow_effect_gflag = 0;
g = 255;
}
}
綠色 (g) 的變化邏輯與紅色相同,只是作用於綠色通道。
藍色變化
if(Rainbow_effect_bflag == 0)
{
b = b - random(color_changespeed);
if(b < 30){
Rainbow_effect_bflag = 1;
b = 30;
}
}
else
{
b = b + random(color_changespeed);
if(b > 255 - color_changespeed){
Rainbow_effect_bflag = 0;
b = 255;
}
}
藍色 (b) 的變化邏輯也與紅色和綠色相同,作用於藍色通道。
延遲
delay(50);
delay(50);:每次顏色變化後,程式會延遲 50 毫秒。這個延遲確保了顏色變化速度適中,使彩虹效果流暢而不會過於迅速。你可以根據需要調整這個值來改變效果的速度。
在程式中使用這個函數
要在你的程式中使用 Rainbow_effect() 函數,只需將它放在 loop() 函數中,這樣它就會不斷運行,創造持續的彩虹效果。
#include <Adafruit_NeoPixel.h>
#define LED_PIN 6 // LED燈條連接的Arduino腳位
#define LED_COUNT 45 // LED燈的數量
#define default_brightness 30 // LED 預設亮度
uint8_t r = 255, g = 0, b = 0; // 初始顏色設為紅色
uint8_t brightness = default_brightness;
bool Rainbow_effect_rflag = 0;
bool Rainbow_effect_gflag = 0;
bool Rainbow_effect_bflag = 0;
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin(); // 初始化LED燈條
strip.show(); // 初始化所有LED為'關閉'狀態
strip.setBrightness(brightness); // 設置初始亮度
}
void loop() {
Rainbow_effect(); // 讓LED燈條顯示彩虹效果
}
void Rainbow_effect()
{
int color_changespeed = 20;
brightness = default_brightness;
strip.setBrightness(brightness);
for(int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(r, g, b)); // 設置顏色
strip.show();
}
if(Rainbow_effect_rflag == 0)
{
r = r - random(color_changespeed);
if(r < 30){
Rainbow_effect_rflag = 1;
r = 30;
}
}
else
{
r = r + random(color_changespeed);
if(r > 255 - color_changespeed){
Rainbow_effect_rflag = 0;
r = 255;
}
}
if(Rainbow_effect_gflag == 0)
{
g = g - random(color_changespeed);
if(g < 30){
Rainbow_effect_gflag = 1;
g = 30;
}
}
else
{
g = g + random(color_changespeed);
if(g > 255 - color_changespeed){
Rainbow_effect_gflag = 0;
g = 255;
}
}
if(Rainbow_effect_bflag == 0)
{
b = b - random(color_changespeed);
if(b < 30){
Rainbow_effect_bflag = 1;
b = 30;
}
}
else
{
b = b + random(color_changespeed);
if(b > 255 - color_changespeed){
Rainbow_effect_bflag = 0;
b = 255;
}
}
delay(50);
}
Rainbow_effect()函數實現了彩虹效果。程式不斷地在紅、綠、藍三個通道上進行顏色變化,從而在燈條上創造出動態的彩虹效果。- 在
loop()函數中,我們調用Rainbow_effect()函數,這樣效果會不斷持續。 - 你可以根據需要調整顏色變化速度 (
color_changespeed) 和延遲 (delay(50)) 來改變彩虹效果的速度和顏色變化的細膩度。
