學習目標 : 利用fastLED函式庫控制faya串列全彩LED模組
學習時間 : 60min
示範模組 : (1) faya brickNano
(2) faya串列全彩LED模組x2
工具 : (1) 樂高底板(相容)
====================背景知識====================
我們在先前的文章 [模組介紹 : faya串列全彩LED模組] 詳細的介紹了faya串列全彩LED模組的原理和操作方式,並且透過adafruit的[NeoPixel]函式庫,經由設定RGB三原色的比例,精準的控制每顆LED的顏色。
這篇教學文章介紹另一個強大且好用的函式庫 [fastLED],也能夠很快速的控制串列全彩系列的LED模組,我們會在這篇文章介紹幾個好用的函式,引導大家使用這個函式庫。
<fastLED> 所使用的指令如下 [下載點]
- #include <fastLED.h>
- CRGB 物件名稱[NUM_LEDS]
- FastLED.addLeds<WS2812B, DATA_PIN, RGB>(faya_colorSticker, NUM_LEDS);
WS2812B : 控制LED模組的晶片型號,其他可支援的型號請參考函式庫說明
DATA_PIN : 控制LED模組的資料腳位
RGB : 控制LED模組RGB三原色的順序,須根據所連接的訊號線路調整
- FastLED.setBrightness(BRIGHTNESS);
- 類別名稱[i] = CRGB(R值, G值, B值);
R值 : 0~255
G值 : 0~255
B值 : 0~255
- 類別名稱[i] = CHSV(H值, S值, V值);
i : 選擇第i顆LED
H值 : 色相 (Hue) 0~255
S值 : 飽和度(Saturation) 0 ~ 255
V值 : 色調 (Value) 0~255
- faya_colorSticker[i] = CHSV(led_cnt*4, 255, 255-+led_cnt); //決定第i顆的顏色
- FastLED.show();
- FastLED.clear();
===================範例實作(3)===================
範例實作(1)(2)請參考 [模組介紹 : faya串列全彩LED模組]
目標:
(1) 利用2組faya串列全彩LED模組依序顯示16種顏色的跑馬燈效果
(2) 此實作結果和範例實作(2)完全相同,但函式庫由neoPiexel改成fastLED
(3) 利用fastLED中的CRGB函式控制LED顏色
接線:
(1) 電源線連接
如下圖所示,我們可以用faya-母對母電源線,外加兩條單心線,從brickNano的電源座提供5V電源給模組,千萬記得紅色的電源線接到VCC,黑色的電源線接到GND。

(2) 訊號線連接
如下圖所示,brickNano的D2腳位接到第一組串列LED模組的Din(D2=>Din),接著把第一組的Dout埠和第二組的Din埠用單心線串起來(圖中為黃色線材)。

範例程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2018/04/15 | |
// Faya-Nugget 範例程式 (Color_Sticker_3.ino) | |
// 單元: 模組介紹:faya串列全彩LED模組 (使用fastLED函式庫) | |
// 網址: https://fayalab.blogspot.com/2018/04/colorstickerfastLED.html | |
// 目標: (1) 使用fastLED的CRGB函式,讓跑馬燈依序顯示16種顏色 | |
// 接線: Arduino ==> faya模組 | |
// D2 ==> 串列全彩LED_Din | |
#include "FastLED.h" //引入FastLED標頭黨 | |
#define NUM_LEDS 16 //定義全彩LED數量 | |
#define DATA_PIN 2 //定義全彩LED訊號腳位 | |
#define BRIGHTNESS 32 //定義亮度 | |
CRGB faya_colorSticker[NUM_LEDS]; //定義FastLED類別 | |
int rainbow16[16][3]={{255, 0, 0}, //紅 | |
{255, 85, 0}, //橙 | |
{255, 170, 0}, // | |
{255, 255, 0}, //黃 | |
{127, 255, 0}, // | |
{ 0, 255, 0}, //綠 | |
{ 0, 255, 85}, // | |
{ 0, 255, 170}, // | |
{ 0, 255, 255}, //青 | |
{ 0, 127, 255}, // | |
{ 0, 0, 255}, //藍 | |
{ 85, 0, 255}, //紫 | |
{170, 0, 255}, // | |
{255, 0, 255}, //洋紅 | |
{255, 0, 127}, // | |
{255, 255, 255}}; //白 | |
void setup() { | |
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(faya_colorSticker, NUM_LEDS); //設定串列全彩LED參數 | |
FastLED.setBrightness(BRIGHTNESS); | |
} | |
void loop() | |
{ | |
showRainbow(); | |
delay(500); | |
} | |
void showRainbow() | |
{ | |
for(int i=0;i<NUM_LEDS;i++) //輪流讀表設定LED顏色 | |
{ | |
faya_colorSticker[i] = CRGB(rainbow16[i][0],rainbow16[i][1],rainbow16[i][2]); | |
FastLED.show(); | |
delay(200); | |
} | |
FastLED.clear(); | |
} |
範例結果:
備註:
- 這個程式碼的架構和範例實作(2)完全相同,利用建表的方式,先把顏色數據建好,再透過迴圈依序讀取表格中顏色的數據,減少冗長的程式碼。
- L34 : setBrightness裡的參數可以從0~255,大家可以依據應用填入不同的強度值,近看時30就很亮了,強度較高時請勿用眼睛直視。
- L15 : 程式利用Arduino Loop的功能,周而復始的輪流顯示16種顏色,顏色的RGB成分配置參考如陣列中所式,大家可以根據自己的喜好修改。
-RGB的顏色模型將每個像素分解成R、G、B三原色,因此當我們指定每個原色的成分(0~255)後,最後會得到下圖中正方體中的其中一點的顏色。
===================範例實作(4)===================
目標:
(1) 利用2組faya串列全彩LED模組依序顯示16種顏色的跑馬燈效果
(2) 利用fastLED中的CHSV函式控制LED顏色
接線:
和範例實作(3)相同
範例程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2018/04/15 | |
// Faya-Nugget 範例程式 (Color_Sticker_4.ino) | |
// 單元: 模組介紹:faya串列全彩LED模組 (使用fastLED函式庫) | |
// 網址: https://fayalab.blogspot.com/2018/04/colorstickerfastLED.html | |
// 目標: (1) 使用fastLED的CHSV函式,讓跑馬燈依序顯示16種顏色 | |
// 接線: Arduino ==> faya模組 | |
// D2 ==> 串列全彩LED_Din | |
#include "FastLED.h" //引入FastLED標頭檔 | |
#define NUM_LEDS 16 //定義全彩LED數量 | |
#define DATA_PIN 2 //定義全彩LED訊號腳位 | |
#define BRIGHTNESS 32 //定義亮度 | |
CRGB faya_colorSticker[NUM_LEDS]; //定義FastLED類別 | |
void setup() { | |
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(faya_colorSticker, NUM_LEDS); //設定串列全彩LED參數 | |
FastLED.setBrightness(BRIGHTNESS); | |
} | |
void loop() | |
{ | |
showRainbow(); | |
delay(500); | |
} | |
void showRainbow() | |
{ | |
for(int i=0;i<NUM_LEDS;i++) //輪流讀表設定LED顏色 | |
{ | |
faya_colorSticker[i] = CHSV(15+16*i,255,255); // 更改 Hue 色相值 | |
//faya_colorSticker[i] = CHSV(0,15+16*i,255); // 更改 Sauration 飽和值 | |
//faya_colorSticker[i] = CHSV(0,255,15+16*i); // 更改 Value 明度值 | |
FastLED.show(); | |
delay(200); | |
} | |
FastLED.clear(); | |
} |
範例結果:
備註:
- HSV模型同樣可以用來定義一個點的顏色,和RGB不同的是,HSV模型用H (Hue) 色相/ S (Saturation) 飽和度 / V (Value)色調來定義一的點的顏色,把HSV的成分攤開時會得到類似如本篇文章第一張圖的圓柱體,但是由於色調(V)為0時,最底面為全黑,可用一黑點表示,因此看起來像一個如下圖的圓錐體。同樣的,HSV的成份可設定0~255的強度。
- L31 : H值從0秀到255時,顏色會從紅橙黃綠....藍靛紫如讓圖所示
- L32 : S值從0秀到255時,顏色會愈來愈飽和
- L33 : V值從0秀到255時,顏色會愈來愈亮
討論:
- 大家有沒有發現用fastLED的CHSV函式,設定顏色變得很簡單呢? 當我們利用CRGB函示時,需另外建立顏色陣列去讀取,使用CHSV函式值不但把這個步驟省略了,也剩下了程式記憶體的空間。
- 底下順便提供RGB和HSV的轉換表格給大家參考
- fastLED函式庫裡還有很多有功能強大的函式,例如 [fill_rainbow] 、[fadeToBlackBy],有興趣的人可以在fastLED的examples裡,依樣畫葫蘆地學習其它函式的使用方式。
歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================
沒有留言:
張貼留言