Библиотека FastLED
Адресные ленты WS2812B, WS2811, APA102 и десятки других: цвета, палитры, эффекты, ограничение мощности.
FastLED — стандарт для адресных лент. Она знает тайминги десятков контроллеров, держит массив цветов в памяти и по команде show() выгружает его в ленту. Сверху — арифметика цветов: HSV, плавные переходы, затухание, радуга и палитры, из которых собираются любые эффекты.
Каждый пиксель занимает три байта, поэтому на UNO с двумя килобайтами памяти лента длиннее трёхсот пикселей уже не помещается. ESP32 держит тысячи.
Установка и подключение
В менеджере библиотек ищите FastLED автора Daniel Garcia, Mark Kriegsman. Если менеджер предложит поставить зависимости — соглашайтесь. Как открыть менеджер и что делать, если библиотека не находится, — в общей статье про библиотеки.
#include <FastLED.h>Создание объекта — обычно до setup():
#define LED_PIN 6
#define NUM_LEDS 30
CRGB leds[NUM_LEDS]; // массив цветов, по одному на пиксель
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS); // в setup(): тип ленты, вывод, порядок цветовМетоды
Только то, что нужно в обычном скетче. Сигнатуры сверены с версией 3.10.5.
FastLED.addLeds<ТИП, PIN, ПОРЯДОК>(leds, n)- Зарегистрировать ленту: тип (WS2812B, WS2811, WS2813, APA102…), вывод данных и порядок цветов (GRB для WS2812B, BRG или RGB для WS2811).
FastLED.show()- Отправить массив в ленту. Пока не вызван, ничего не меняется.
FastLED.setBrightness(uint8_t b)- Общая яркость 0–255, применяется при show(). Не трогает сами цвета в массиве.
FastLED.clear(bool write = false)- Обнулить массив; с true — сразу и погасить ленту.
FastLED.setMaxPowerInVoltsAndMilliamps(v, mA)- Ограничить потребление: библиотека сама снизит яркость, чтобы не превысить бюджет источника.
FastLED.delay(ms)- Задержка, во время которой лента продолжает обновляться (нужно для временно́го дизеринга).
leds[i] = CRGB(r, g, b)- Задать цвет пикселя по компонентам 0–255. Есть именованные: CRGB::Red, CRGB::Black.
leds[i] = CHSV(h, s, v)- Цвет через оттенок, насыщенность и яркость — удобнее для эффектов: меняете h, получаете радугу.
fill_solid(leds, n, color)- Залить n пикселей одним цветом.
fill_rainbow(leds, n, startHue, deltaHue)- Радуга: начальный оттенок и шаг между соседями.
fadeToBlackBy(leds, n, amount)- Притушить все пиксели на amount/256 — так делают хвосты за бегущей точкой.
leds[i].fadeToBlackBy(amount)- То же для одного пикселя.
ColorFromPalette(palette, index, brightness)- Цвет из палитры (RainbowColors_p, HeatColors_p, своя) по позиции 0–255.
beatsin8(bpm, low, high)- Синусоида с частотой в ударах в минуту — для дыхания и покачивания без delay().
Пример
#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(80);
FastLED.setMaxPowerInVoltsAndMilliamps(5, 500); // питание от платы: не больше 500 мА
}
void loop() {
// «комета»: точка бежит, хвост гаснет
static uint8_t pos = 0;
fadeToBlackBy(leds, NUM_LEDS, 30);
leds[pos] = CHSV(millis() / 20, 255, 255);
pos = (pos + 1) % NUM_LEDS;
FastLED.show();
delay(25);
}Ограничение мощности — самая недооценённая функция. С ним лента на полной яркости не просаживает USB и не перезагружает плату.
На чём попадаются
Красный и зелёный поменялись местами
Неверный порядок цветов в addLeds. WS2812B — GRB; у WS2811 бывает BRG или RGB.
Лента горит мусором или первый пиксель не тот
Резистор 330 Ом у входа данных и общая земля. Для ESP32 добавьте преобразователь уровня или запитайте ленту от 4,5 В.
Скетч не компилируется: не хватает памяти
На UNO массив CRGB[300] — уже 900 байт. Уменьшайте NUM_LEDS или берите плату с большей памятью.
Эффект дёргается при Serial.print
Пока идёт show(), прерывания отключены, и приём по Serial теряется. Не печатайте в цикле с show() или печатайте меньше.
Где используется на сайте
- Лента WS2812B: схема подключения и скетч
- Лента WS2813: схема подключения и скетч
- Лента WS2811: схема подключения и скетч