Hướng dẫn điều khiển dải LED RGB WS2812B bằng ESP32, tạo hiệu ứng đổi màu, chạy sáng, cầu vồng động và hơn thế nữa.
Trong ví dụ này chúng ta sẽ dùng LED RGB WS2812B NeoPixel.
Mục lục
- Giới thiệu
- Cấu tạo WS2812B
- Phần cứng cần chuẩn bị
- Sơ đồ kết nối
- Cài thư viện
- Mã nguồn ví dụ
- Giải thích mã
- Demo & mở rộng
1) Giới thiệu
LED WS2812B (NeoPixel) là loại LED RGB thông minh, mỗi bóng có chip điều khiển riêng và có thể nối chuỗi nhiều bóng chỉ qua một chân DATA.
Bạn có thể:
- Hiển thị màu tĩnh hoặc động.
- Tạo hiệu ứng chạy đèn, cầu vồng, nhấp nháy, phản ứng âm thanh, v.v.
2) Cấu tạo WS2812B
- Mỗi LED có 3 màu cơ bản Red, Green, Blue (8-bit mỗi kênh → 16 triệu màu).
- Tín hiệu điều khiển theo giao thức 1-wire (1 chân DATA).
- Chuỗi LED có 3 dây:
- VCC (5V)
- GND
- DIN (Data Input)
3) Phần cứng cần chuẩn bị
| Linh kiện | Số lượng | Ghi chú |
|---|---|---|
| ESP32 DevKit V1 | 1 | |
| Dải LED WS2812B hoặc vòng LED RGB 8 bóng | 1 | |
| Nguồn 5V | 1 | Có thể cấp từ ESP32 nếu < 10 LED |
| Điện trở 330Ω | 1 | Nối giữa GPIO và chân DATA |
| Tụ điện 1000µF | 1 | Nối giữa 5V và GND để chống sụt áp |
| Breadboard, dây nối | Vài sợi |
4) Sơ đồ kết nối

- LED VCC → 5V
- LED GND → GND (chung với ESP32)
- LED DIN → GPIO15 (qua điện trở 330Ω)
- Tụ 1000µF nối song song giữa 5V và GND để ổn định nguồn.
5) Cài thư viện
Trong Arduino IDE → Tools → Manage Libraries…
Tìm và cài:
- Adafruit NeoPixel (by Adafruit)
6) Mã nguồn ví dụ
#include <Adafruit_NeoPixel.h>
#define PIN 15 // Chân dữ liệu LED
#define NUMPIXELS 8 // Số LED trong dải
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin(); // khởi tạo dải LED
}
void loop() {
rainbowCycle(5);
}
// Hiệu ứng cầu vồng chạy qua các LED
void rainbowCycle(uint8_t wait) {
uint16_t i, j;
for (j = 0; j < 256 * 5; j++) { // 5 vòng màu
for (i = 0; i < pixels.numPixels(); i++) {
pixels.setPixelColor(i, Wheel(((i * 256 / pixels.numPixels()) + j) & 255));
}
pixels.show();
delay(wait);
}
}
// Hàm tạo màu RGB từ giá trị 0-255
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if (WheelPos < 85) {
return pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if (WheelPos < 170) {
WheelPos -= 85;
return pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
7) Giải thích mã
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800)→ cấu hình dải LED.pixels.setPixelColor(i, pixels.Color(r,g,b))→ đổi màu từng bóng.Wheel()tạo dải màu cầu vồng.rainbowCycle()chạy màu liên tục qua các LED.
8) Demo & mở rộng
- Khi nạp xong code, bạn sẽ thấy dải LED chạy màu cầu vồng liên tục.
- Có thể đổi hiệu ứng:
- pixels.fill(Color(255,0,0)) → toàn bộ LED đỏ.
- pixels.clear() → tắt tất cả LED.
- Dùng thêm WebSocket để điều khiển màu qua trình duyệt.
- Kết hợp âm thanh / cảm biến chuyển động để tạo hiệu ứng tương tác.


Để lại một bình luận