呼吸效果(Breathing Effect)
這段代碼用來實現 LED 燈從暗到亮再從亮到暗的呼吸效果。下面我會詳細解釋這段代碼的工作原理以及如何在你的程式中使用它。
函數介紹
void Breathing_effect() { for(int i = 0; i < strip.numPixels(); i++) { // 遍歷每個像素 strip.setPixelColor(i, strip.Color(r, g, b)); // 設置紅色 strip.show(); //strip.setPixelColor(i, strip.Color(0, 0, 0)); // 關閉像素 } if(Breathing_effect_flag == 0) { if(brightness > 0){ brightness--; } else { Breathing_effect_flag = 1; } } else { if(brightness < 30){ brightness++; } else { Breathing_effect_flag = 0; } } strip.setBrightness(brightness); delay(5); }
這個函數通過調整 LED 的亮度實現呼吸效果,具體來說就是從亮到暗再從暗到亮。亮度的變化是通過 brightness
變量的增減來控制的。
程式細節解釋
設置顏色和顯示
for(int i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, strip.Color(r, g, b)); // 設置顏色 strip.show(); }
這個迴圈遍歷燈條上的每個 LED,並設置它們的顏色。strip.Color(r, g, b)
創建一個基於變量 r
、g
和 b
(紅色、綠色和藍色)的顏色,然後將這個顏色設置給當前 LED。
呼吸效果的亮度調整邏輯
if(Breathing_effect_flag == 0) { if(brightness > 0){ brightness--; } else { Breathing_effect_flag = 1; } } else { if(brightness < 30){ brightness++; } else { Breathing_effect_flag = 0; } }
Breathing_effect_flag
:這個標誌變量用來控制亮度是增加還是減少。- 當
Breathing_effect_flag
為 0 時,亮度逐漸減小(LED 變暗)。當亮度減小到 0 時,Breathing_effect_flag
變為 1。 - 當
Breathing_effect_flag
為 1 時,亮度逐漸增加(LED 變亮)。當亮度增加到 30 時,Breathing_effect_flag
又變為 0。
這樣就實現了從暗到亮再從亮到暗的循環效果。
設置亮度和延遲
strip.setBrightness(brightness); delay(5);
strip.setBrightness(brightness);
:將目前的brightness
值設置為燈條的亮度,這會控制所有 LED 的亮度。delay(5);
:每次更新亮度後,程式會延遲 5 毫秒。這個延遲時間決定了呼吸效果的速度。可以根據需要調整這個值來加快或減慢呼吸效果。
在程式中使用這個函數
要使用這個呼吸效果函數,你需要將它放在 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 Breathing_effect_flag = 0; Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); void setup() { strip.begin(); strip.show(); } void loop() { Breathing_effect(); } void Breathing_effect() { for(int i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, strip.Color(r, g, b)); strip.show(); } if(Breathing_effect_flag == 0) { if(brightness > 0){ brightness--; } else { Breathing_effect_flag = 1; } } else { if(brightness < 30){ brightness++; } else { Breathing_effect_flag = 0; } } strip.setBrightness(brightness); delay(5); }