Ứng dụng: Quảng cáo, Trang trí
#WS2812B #ledday #fastled
Đây là loại dải LED tuyệt vời nhất. Bạn có thể kiểm soát độ sáng và màu sắc của từng đèn LED riêng biệt, cho phép bạn sản xuất hiệu ứng tuyệt vời và phức tạp với một cách đơn giản.
Dải đèn LED này được chế tạo bởi đèn LED WS2812B nối dây nối tiếp. Các đèn LED này có IC được chế tạo
ngay vào đèn LED. Điều này cho phép giao tiếp thông qua giao diện một dây (OneWire). Điều này có nghĩa là
rằng bạn có thể điều khiển nhiều đèn LED chỉ bằng một chân kỹ thuật số của Arduino.
Trong hình dưới đây, bạn có thể thấy chip bên trong đèn LED.
Loại dải Led này rất linh hoạt và có thể được cắt theo bất kỳ độ dài nào bạn muốn. Như bạn có thể thấy, dải có thể được chia thành các đoạn và mỗi đoạn chứa một đèn LED RGB.
Bạn có thể điều chỉnh kích thước của nó bằng cách cắt dải bằng kéo ở đúng vị trí (cắt dải ở nơi được đánh dấu).
Những dải này đi kèm với kết nối ở mỗi đầu. bạn có thể nối jump vào để kết nối với arduino.
Cấp nguồn cho dải đèn LED WS2812B
Dải LED phải được cấp nguồn bằng nguồn điện 5V. Ở mức 5V, mỗi đèn LED tiêu thụ khoảng 50mA, khi độ sáng lớn nhất. Điều này có nghĩa là cứ 30 đèn LED thì dải có thể tiêu thụ tới 1,5 A. Hãy chắc chắn rằng bạn chọn một nguồn phù hợp với số LED của dải, Nếu bạn sử dụng nguồn cung cấp bên ngoài, thì đừng quên kết nối GND của nguồn ngoài với GND của Arduino.
Trong ví dụ này, dải đèn LED WS2812B sẽ được cấp nguồn bằng chân Arduino 5V. Điều khiển 14 đèn LED. Hãy nhớ rằng nếu bạn muốn điều khiển nhiều đèn LED, bạn cần phải sử dụng nguồn điện bên ngoài.
Sơ đồ mạch
Lời khuyên hữu ích:
- Nối một tụ điện 100uF và 1000uF song song nguồn 5V để lọc nguồn do led sáng tắt sẽ gây nhiễu nguồn.
- Thêm một điện trở 220 hoặc 470 Ohm giữa pin đầu ra kỹ thuật số Arduino và chân đầu vào dải dữ liệu để giảm nhiễu trên dòng đó.
- Làm cho dây của bạn giữa Arduino, cung cấp năng lượng và dải là ngắn càng tốt để giảm thiểu tổn thất điện áp.
- Nếu dải của bạn bị hỏng và không hoạt động, hãy kiểm tra xem đèn LED đầu tiên có bị hỏng không. Nếu có, hãy cắt nó, hàn lại các chân để nó sẽ hoạt động trở lại.
Chương trình
Đầu tiên bạn cần thư viện FastLed: https://github.com/FastLED/FastLED/archive/master.zip
Vào File->Examples ->FastLED ->ColorPalette trên Arduino IDE
Lưu ý: bạn phải thay đổi #define NUM_LEDS thành số đèn LED mà dải của bạn hiện có.
#include <FastLED.h>
#define LED_PIN 5
#define NUM_LEDS 14
#define BRIGHTNESS 64
#define LED_TYPE WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
#define UPDATES_PER_SECOND 100
// Ví dụ này cho thấy cách để thiết lập và sử dụng 'bảng màu'
// với FastLED.
//
// Những bảng màu nhỏ gọn này cung cấp một cách dễ dàng để tô màu lại
// hoạt hình như bay, nhanh chóng, dễ dàng và với chi phí thấp.
//
// Sử dụng bảng màu đơn giản hơn nhiều trong thực tế so với lý thuyết, vì vậy trước tiên chỉ là
// chạy chương trình này và xem hiệu ứng bạn nhận được
//
// FastLED cung cấp một vài bảng màu được cấu hình sẵn và làm cho nó
// cực kỳ dễ dàng để tạo nên bảng màu của riêng bạn với bảng màu.
//
// Một số lưu ý về 'lý thuyết và thực hành' trừu tượng hơn của
// Bảng màu nhỏ gọn FastLED nằm ở dưới cùng của tập tin này.
CRGBPalette16 currentPalette;
TBlendType currentBlending;
extern CRGBPalette16 myRedWhiteBluePalette;
extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;
void setup() {
delay( 3000 ); // power-up safety delay
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness( BRIGHTNESS );
currentPalette = RainbowColors_p;
currentBlending = LINEARBLEND;
}
void loop()
{
ChangePalettePeriodically();
static uint8_t startIndex = 0;
startIndex = startIndex + 1; /* motion speed */
FillLEDsFromPaletteColors( startIndex);
FastLED.show();
FastLED.delay(1000 / UPDATES_PER_SECOND);
}
void FillLEDsFromPaletteColors( uint8_t colorIndex)
{
uint8_t brightness = 255;
for( int i = 0; i < NUM_LEDS; i++) {
leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
colorIndex += 3;
}
}
// Có một số bảng màu khác nhau được thể hiện ở đây.
//
// FastLED cung cấp một số 'preset' bảng màu: RainbowColors_p (Cầu vồng), RainbowStripeColors_p (Cầu vồng sọc),
// OceanColors_p(Đại dương), CloudColors_p(Mây), LavaColors_p(Dung nham), ForestColors_p(Rừng), and PartyColors_p(Tiệc).
//
// Ngoài ra, bạn có thể tự xác định bảng màu của riêng mình hoặc bạn có thể viết
// mã tạo các bảng màu.
void ChangePalettePeriodically()
{
uint8_t secondHand = (millis() / 1000) % 60;
static uint8_t lastSecond = 99;
if( lastSecond != secondHand) {
lastSecond = secondHand;
if( secondHand == 0) { currentPalette = RainbowColors_p; currentBlending = LINEARBLEND; }
if( secondHand == 10) { currentPalette = RainbowStripeColors_p; currentBlending = NOBLEND; }
if( secondHand == 15) { currentPalette = RainbowStripeColors_p; currentBlending = LINEARBLEND; }
if( secondHand == 20) { SetupPurpleAndGreenPalette(); currentBlending = LINEARBLEND; }
if( secondHand == 25) { SetupTotallyRandomPalette(); currentBlending = LINEARBLEND; }
if( secondHand == 30) { SetupBlackAndWhiteStripedPalette(); currentBlending = NOBLEND; }
if( secondHand == 35) { SetupBlackAndWhiteStripedPalette(); currentBlending = LINEARBLEND; }
if( secondHand == 40) { currentPalette = CloudColors_p; currentBlending = LINEARBLEND; }
if( secondHand == 45) { currentPalette = PartyColors_p; currentBlending = LINEARBLEND; }
if( secondHand == 50) { currentPalette = myRedWhiteBluePalette_p; currentBlending = NOBLEND; }
if( secondHand == 55) { currentPalette = myRedWhiteBluePalette_p; currentBlending = LINEARBLEND; }
}
}
//Hàm này lấp đầy bảng màu với các màu hoàn toàn ngẫu nhiên.
void SetupTotallyRandomPalette()
{
for( int i = 0; i < 16; i++) {
currentPalette[i] = CHSV( random8(), 255, random8());
}
}
// Hàm này thiết lập một bảng các sọc đen và trắng,
// sử dụng mã. Vì bảng màu thực sự là một mảng
// Mười sáu màu CRGB, khác nhau dùng hàm fill_* để setup
void SetupBlackAndWhiteStripedPalette()
{
// 'black out' all 16 palette entries...
fill_solid( currentPalette, 16, CRGB::Black);
// and set every fourth one to white.
currentPalette[0] = CRGB::White;
currentPalette[4] = CRGB::White;
currentPalette[8] = CRGB::White;
currentPalette[12] = CRGB::White;
}
// Hàm này thiết lập một bảng các sọc màu tím và xanh lục.
void SetupPurpleAndGreenPalette()
{
CRGB purple = CHSV( HUE_PURPLE, 255, 255);
CRGB green = CHSV( HUE_GREEN, 255, 255);
CRGB black = CRGB::Black;
currentPalette = CRGBPalette16(
green, green, black, black,
purple, purple, black, black,
green, green, black, black,
purple, purple, black, black );
}
// Ví dụ này cho thấy cách thiết lập bảng màu tĩnh
// được lưu trữ trong PROGMEM (flash), có dung lượng lớn hơn RAM. Một bảng PROGMEM tĩnh như thế này
// có đạt kicchs thước chiếm 64 byte flash.
const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM =
{
CRGB::Red,
CRGB::Gray, // 'white' is too bright compared to red and blue
CRGB::Blue,
CRGB::Black,
CRGB::Red,
CRGB::Gray,
CRGB::Blue,
CRGB::Black,
CRGB::Red,
CRGB::Red,
CRGB::Gray,
CRGB::Gray,
CRGB::Blue,
CRGB::Blue,
CRGB::Black,
CRGB::Black
};
// Ghi chú bổ sung trên bảng màu FastLED:
//
// Thông thường, trong đồ họa máy tính, bảng màu (hoặc "color lookup table")
// có 256 mục, mỗi mẫu chứa một màu RGB 24 bit cụ thể. Bạn có thể
// lập chỉ mẫu vào bảng màu bằng cách sử dụng giá trị 8 bit (một byte) đơn giản.
// Một bảng màu 256 mẫu chiếm tới 768 byte RAM, trên Arduino
// chiếm quá nhiều RAM
//
//
// Tuy nhiên, FastLED cũng cung cấp một sự thay thế nhỏ gọn. Ưu đãi của FastLED
// bảng màu lưu trữ 16 mẫu khác nhau, nhưng có thể được truy cập NHƯ NẾU
// họ thực sự có 256 mẫu; điều này được thực hiện bằng cách nội suy
// giữa 16 mẫu rõ ràng để tạo mười lăm bảng màu trung gian
// các mẫu giữa mỗi cặp.
//
// Vì vậy, ví dụ, nếu bạn đặt hai mục rõ ràng đầu tiên của một bản rút gọn
// bảng màu sang Xanh lục (0,255,0) và Xanh lam (0,0,255), sau đó lấy ra
// mười sáu mục đầu tiên từ bảng màu ảo (256), bạn sẽ nhận được
// Màu xanh lá cây, theo sau là một dải màu trơn từ màu xanh lục sang màu xanh lam, và sau đó là màu xanh lam.
Kết quả