彩虹效果(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)
) 來改變彩虹效果的速度和顏色變化的細膩度。