ELECTRONICS

Библиотека FastLED

менеджер: FastLEDDaniel Garcia, Mark Kriegsmanверсия 3.10.5

Адресные ленты 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() или печатайте меньше.

Где используется на сайте

Что дальше