【互動這回事】讓我們一起去看流星雨

2023/12/19閱讀時間約 7 分鐘

又到了夜晚最閃亮的冬天,聖誕佳節每個廣場都會佈上不同顏色的 LED 燈,有些還會有不同的特效,像是流星燈、閃爍、跑馬等。那如果說我們要讓這些燈條可以被我們客製化的控制時該怎麼做呢?


LED 的選擇

LED 有很多學問,從燈的編號、電阻、電壓到晶片等都有不同的類型,這也讓燈條有很多應用與變化,專業知識內容也遠遠超過我目前所學的東西,以下拿出幾個目前我在購買時會挑選的項目,而其他 LED 相關的知識目前也有中英文書籍專門在做介紹。


可控類型

有些我們是無法透過 Arduino 來進行客製化的,大部分的人會選擇 WS2812 系列或是 WS2811, 如果不確定要買的類型可不可控制也可以直接問電子商場的店員。


電壓輸入選擇

電壓輸入有分成 AC ( 交流電 )DC ( 直流電 ),根據案子需求可能會需要不同電壓的燈條。

  • DC 5V:比較常以 USB 接頭做供電或是接 5V 的變壓器,通常會當作簡單的室內背景光源。
  • DC 12/24V:會另外接一個 12V24V 的變壓器,常用在室內外的線性照明或是輔助照明。
  • DC 36/48V:較特殊的電壓,目前我遇到的需求中還沒使用到這款。
  • DC 10-30V:這是 1030V 都可以輸入的燈條,通常可以在電壓無法穩定輸出的情況下可以使用。
  • AC 110-240V:適合運用在是外場景,如我們現在看到樹上及街道上的燈條。

LED 編號

LED 的光源有分好幾種尺寸。而此尺寸就會以數字當成編號,通常有 3528、5050、2835、3014、2216、5630、5730、2110、4040 等,我比較常用到的是 50502835,那這些數字要怎麼看呢?其實就是長寬以 mm 方式去顯示,也就是說 5050 的為長寬各 5.0mm2835 為長寬 2.8mm3.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();
}
}

...
2會員
5內容數
不知道大家常不常去看展覽,現在很多展覽都是主打沉浸式或是內含有趣的互動體驗,在看得當下對於這些互動內容會好奇是用哪些方式做出來的嗎?【互動這回事】這個主題主要是要跟大家分享,如何製作簡單的互動行為或分享我所體驗到的互動內容。
留言0
查看全部
發表第一個留言支持創作者!