Что такое WS2812
WS2812 — «умный» светодиод: в каждом корпусе 5050 сидят три диода (R, G, B) и микросхема драйвера. Управляется одним проводом: посылаете последовательность цветов — каждый диод забирает свой и передаёт дальше. Можно задать каждому пикселю свой цвет и яркость по одному пину Arduino.
Продаётся как лента (30/60/144 диода на метр), кольца, матрицы, отдельные модули. Питание — 5 В (WS2812B) или 12 В (WS2815 — с резервной линией данных).
Подключение
Arduino D6 ──[резистор 330 Ом]── DIN ленты
GND ── GND ленты ── GND БП (общий!)
5V БП ── +5V ленты
Два обязательных элемента:
- Резистор 330–470 Ом между пином и DIN — защита входа от бросков.
- Конденсатор 1000 мкФ на питании ленты — сглаживает броски тока при включении.
- Общий GND между Arduino и блоком питания ленты.
Питание ленты — отдельное: 30 диодов на полной яркости берут ~1.8 А; от пина 5V Arduino лента мощнее нескольких диодов не заведётся.
Библиотека FastLED
Ставим FastLED — стандарт для адресных лент:
#include <FastLED.h>
#define LED_PIN 6
#define NUM_LEDS 30
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB // у WS2812 порядок GRB, не RGB!
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(64); // общая яркость 0-255 — экономит ток!
}
void loop() {
leds[0] = CRGB::Red;
leds[1] = CRGB::Green;
leds[2] = CRGB::Blue;
FastLED.show();
delay(500);
}
FastLED.show() отправляет весь массив — все пиксели обновляются одновременно. setBrightness масштабирует всё разом.
Базовые эффекты
Бегущий огонь
for (int i = 0; i < NUM_LEDS; ++i) {
leds[i] = CHSV(i * 8, 255, 255); // HSV — удобнее для эффектов
}
FastLED.show();
Радуга
static uint8_t hue = 0;
for (int i = 0; i < NUM_LEDS; ++i)
leds[i] = CHSV(hue + i * 4, 255, 255);
FastLED.show();
hue++; // сдвиг каждый кадр — радуга бежит
delay(20);
Вспышка и затухание
fill_solid(leds, NUM_LEDS, CRGB::White);
FastLED.show();
fadeToBlackBy(leds, NUM_LEDS, 40); // кадры затухания
FastLED имеет готовые: fill_solid, fill_rainbow, fill_gradient, blur, beatsin8, fadeToBlackBy — эффекты собираются как конструктор.
Альтернатива: Adafruit_NeoPixel
Если FastLED тяжела (много памяти), берите NeoPixel — проще API:
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
strip.begin();
strip.setPixelColor(0, strip.Color(255, 0, 0)); // R,G,B
strip.show();
Питание и ток — самое важное
Один пиксель на полной белой яркости — ~60 мА. Считайте:
- 30 диодов: ~1.8 А → БП 2 А минимум;
- 1 метр 144 диода: ~8.6 А → БП 10 А;
- 5 метров 60 диодов/м: ~18 А → несколько точек питания.
Правила:
FastLED.setBrightness(64)— ограничьте яркость, ток падает пропорционально.- Ленты >1 м запитывайте в нескольких точках или с двух концов — иначе дальний конец тускнеет (падение напряжения на дорожках).
- Никогда не питайте ленту от пина 5V Arduino.
Типичные проблемы
- Первый диод горит случайным цветом: нет резистора на DIN или «проскочила» помеха при старте — резистор и инициализация FastLED.
- Мусор по ленте: длинный провод данных — экранируйте; резистор 330 Ом на DIN.
- Тусклый конец: недостаточное питание — подайте +5 В с двух концов ленты.
- Всё мигает и перезагружается: лента тянет больше, чем даёт БП — считайте ток, уменьшайте яркость.
- Цвета перепутаны: порядок
GRBvsRGB— у WS2812 вaddLedsобязательно GRB. - Медленно при сотнях диодов: обновление занимает ~30 мкс на пиксель — 300 диодов = 9 мс на кадр.
Итог
WS2812 — один пин Arduino = полный контроль над каждым пикселем. Запомните: резистор 330 Ом на DIN, конденсатор 1000 мкФ на питании, отдельный БП с запасом по току, setBrightness для экономии, GRB в addLeds. Дальше — ambilight, ночники, новогодние эффекты и умная подсветка.
Полный пример: радуга на ленте
#include <FastLED.h>
#define LED_PIN 6
#define NUM_LEDS 30
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(64); // 0..255 — уменьшите для экономии
}
void loop() {
static uint8_t hue = 0;
for (int i = 0; i < NUM_LEDS; ++i)
leds[i] = CHSV(hue + i * 5, 255, 255); // каждый пиксель свой оттенок
FastLED.show();
hue++;
delay(20);
}
Базовые эффекты FastLED
fill_solid(leds, NUM_LEDS, CRGB::Red); // заливка
leds[i] = CRGB::Green; // один пиксель
fadeToBlackBy(leds, NUM_LEDS, 20); // затухание хвоста
FastLED.setBrightness(128); // общая яркость
CHSV — цвет в оттенке/насыщенности/яркости: CHSV(hue, 255, 255) — чистый цвет любого оттенка.
Бегущий огонёк
int pos = 0;
void loop() {
fadeToBlackBy(leds, NUM_LEDS, 60); // хвост гаснет
leds[pos] = CRGB::White;
pos = (pos + 1) % NUM_LEDS;
FastLED.show();
delay(50);
}
Питание: самое важное в WS2812
Каждый пиксель — до 60 мА при белом цвете на полной яркости. 30 пикселей × 60 мА = 1.8 А — от 5V-пина Uno лента умрёт. Правила:
- Отдельный БП 5 В на ленту (10 А для 150+ пикселей).
- Общий GND между БП и Arduino — без этого пиксели не получат данные.
- Конденсатор 1000 мкФ на входе питания ленты — сглаживает броски.
- Подключайте питание с двух концов длинной ленты — иначе дальние пиксели тускнеют.
- Резистор 470 Ом последовательно в линию данных — защита от выбросов.
Уровни: 3.3V → 5V
ESP32 и 3.3V-платы выдают данные на 3.3 В — WS2812 ожидает ~5 В. Обычно работает и так, но для надёжности ставят level shifter (74AHCT125, 74HCT245).
Альтернативы WS2812
- WS2813 — резервный сигнальный канал: при обрыве одного пикселя остальные работают.
- WS2815 — 12 В питание, меньше падение по длине.
- SK6812 — RGBW-вариант с отдельным белым.
- APA102 — SPI-интерфейс: быстрее, проще тайминги, но два провода данных.
Проекты
- Амбилайт-подсветка монитора.
- Умная новогодняя гирлянда.
- Индикатор уровня/статуса.
- Матрица 8×32 для текста.
- Умная подсветка по датчику движения.
Полный пример: амбилайт-эффект
#include <FastLED.h>
#define NUM_LEDS 30
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, 6, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(64);
}
void loop() {
static uint8_t hue = 0;
for (int i = 0; i < NUM_LEDS; ++i)
leds[i] = CHSV(hue + i * 5, 255, 255);
FastLED.show();
hue++;
delay(20);
}
Питание: правила
- Каждый пиксель до 60 мА при белом — 30 пикселей = 1.8 А.
- Отдельный БП 5В на ленту, общий GND с Arduino.
- Конденсатор 1000 мкФ на входе питания.
- Подключайте питание с двух концов длинной ленты.
- Резистор 470 Ом в линию данных.
Альтернативы
- WS2813 — резервный канал данных, при обрыве одного пикселя остальные работают.
- WS2815 — 12В, меньше падение по длине.
- SK6812 — RGBW с отдельным белым.
- APA102 — SPI, быстрее, проще тайминги.