又到了夜晚最閃亮的冬天,聖誕佳節每個廣場都會佈上不同顏色的 LED 燈,有些還會有不同的特效,像是流星燈、閃爍、跑馬等。那如果說我們要讓這些燈條可以被我們客製化的控制時該怎麼做呢?
LED 有很多學問,從燈的編號、電阻、電壓到晶片等都有不同的類型,這也讓燈條有很多應用與變化,專業知識內容也遠遠超過我目前所學的東西,以下拿出幾個目前我在購買時會挑選的項目,而其他 LED 相關的知識目前也有中英文書籍專門在做介紹。
有些我們是無法透過 Arduino 來進行客製化的,大部分的人會選擇 WS2812 系列或是 WS2811, 如果不確定要買的類型可不可控制也可以直接問電子商場的店員。
電壓輸入有分成 AC ( 交流電 ) 與 DC ( 直流電 ),根據案子需求可能會需要不同電壓的燈條。
LED 的光源有分好幾種尺寸。而此尺寸就會以數字當成編號,通常有 3528、5050、2835、3014、2216、5630、5730、2110、4040 等,我比較常用到的是 5050 及 2835,那這些數字要怎麼看呢?其實就是長寬以 mm 方式去顯示,也就是說 5050 的為長寬各 5.0mm,2835 為長寬 2.8mm 及 3.5mm,那要怎麼看方向呢?以下圖為範例:
紅色的線的方向為開頭的兩個數字,藍色線的方向為後面兩個數字。
我們要利用 Arduino 來控制燈的狀態,這邊我們會用到 FastLED.h 這個 library,首先要先來定義我們 LED 的參數,再來根據需求去變化 LED。
#include "FastLED.h"
#define NUM_LEDS 60 // 輸入燈條要亮的數量
#define LED_PIN 6 // LEDs 的 Pin 腳
#define BRIGHTNESS 255 // 最亮的亮度
#define MIN_BRIGHTNESS 5 // 最小亮度
CRGB leds[NUM_LEDS]; // 初始燈條
unsigned long previousMillis = 0; // Stores last time LEDs were updatedint
count = 0; // Stores count for incrementing up to the NUM_LEDs
void setup() {
FastLED.addLeds<WS2811, LED_PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setMaxPowerInVoltsAndMilliamps(5, 1000); // Set power limit of LED strip to 5V, 1500mA
FastLED.clear(); // Initialize all LEDs to "OFF"
FastLED.setBrightness(BRIGHTNESS);
}
...
void loop() {
shootingStarAnimation(255, 255, 255, 70, 50, 1500);
}
void shootingStarAnimation(int red, int green, int blue, int tail_length, int delay_duration, int interval) {
unsigned long currentMillis = millis(); // Get the time
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // Save the last time the LEDs were updated
count = 0; // Reset the count to 0 after each interval
}
if (count < NUM_LEDS) {
leds[count % (NUM_LEDS+1)].setRGB(red, green, blue); // Set LEDs with the color value
count++;
}
fadeToBlackBy(leds, NUM_LEDS, tail_length); // Fade the tail LEDs to black
FastLED.show();
delay(delay_duration); // Delay to set the speed of the animation
}
這時候我們可以搭配上一篇提到的小偷燈,再有人經過的時候觸發流星燈,沒人的時候就不會亮燈,小偷燈的基本設定這邊就先省略,有興趣的人可以看上一篇的介紹,或者是將小禮物放在聖誕樹下整個就可以點亮聖誕樹等等的互動方式。
...
void loop() {
sensorValue = digitalRead(sensorPin); // 讀取感應器輸出的數位值
if (sensorValue == HIGH) {
Serial.println("Got it!"); // 如果感應器輸出為高電平,則顯示檢測到移動的訊息
shootingStarAnimation(255, 255, 255, 70, 50, 1500);
} else {
Serial.println("No body");
FastLED.clear();
}
}
...