База знаний · Датчики и модули
Адресные светодиоды WS2812B: лента, кольцо, модуль
Один провод на всю цепочку, 30 мкс на светодиод и до 60 мА на каждый: почему лента просит больше, чем плата способна дать.
Обычный светодиод умеет только гореть и не гореть. У адресного внутри сидит крошечный контроллер, и разговаривать с ним можно словами «стань синим» — по одному-единственному проводу, сколько бы светодиодов ни стояло в цепочке. Отсюда и вся магия лент, колец и матриц: три провода, а картинка любая. Расплата — жёсткие требования ко времени и очень серьёзный аппетит к току.
Как это работает
Данные идут по одному проводу без всякого такта: смысл бита кодируется длиной импульса. Период всегда 1,25 мкс, у нуля высокий уровень длится 0,4 мкс, у единицы — 0,8 мкс. Допуск — ±150 нс, то есть плюс-минус две команды процессора. Именно поэтому библиотеки на время посылки выключают прерывания: любая помеха собьёт длину импульса, и лента покажет мусор.
На один светодиод уходит 24 бита (по 8 на зелёный, красный и синий) — ровно 30 мкс. Адресов в посылке нет: первый светодиод забирает первые 24 бита себе, остальное выталкивает соседу. Когда поток кончился и линия замолчала дольше 50 мкс, все разом показывают то, что получили. В новых партиях эта пауза выросла до 280 мкс, и библиотека Adafruit сейчас честно выжидает 300 мкс — цифра прямо записана в её исходнике.
Три провода и две детали
Кроме проводов производители чипов просят добавить две детали, и обе не для красоты. Резистор 300—500 Ом в линии данных сглаживает фронт сигнала — без него первый светодиод часто ведёт себя странно. Конденсатор 500—1000 мкФ у входа питания гасит бросок тока в момент включения: без него лента при старте способна уронить питание всей платы.
Порядок подключения тоже имеет значение: сначала земля, потом плюс, потом данные; отключать — наоборот. Если питание раздельное, включайте сначала ленту, а потом плату. Причина простая: пока у ленты нет своего питания, сигнал данных пытается запитать её через защитные диоды внутри чипа — а это верный способ убить первый светодиод.
Ток: главное число этой статьи
Здесь стоит сказать прямо: в листе данных WS2812B тока потребления нет вовсе. Все ходовые цифры — чужие измерения и оценки. Мы считаем по 20 мА на каждый из трёх кристаллов, то есть 60 мА на светодиод при белом на полной яркости; в карточке нашего модуля NeoPixel (Trema) — 216 ₽ указано «менее 45 мА» и 15 мА на цвет. Для выбора блока питания считать надо по верхней оценке.
Простая арифметика, которая многих отрезвляет: метр ленты на 60 светодиодов при белом свете просит 3,6 А. Пятиметровая лента — 18 А, это уже девяносто ватт и провода сечением с зарядку ноутбука. Разъём питания Arduino столько не отдаст никогда, и вывод 5V — тем более: через плату можно пропускать в лучшем случае полампера. Практический предел «питаем от платы» — восемь-десять светодиодов на приглушённой яркости, всё остальное просит отдельный блок.
Хорошая новость: ток почти линейно следует за яркостью. Команда яркости в библиотеке — это не «программное» затемнение, а укорачивание импульсов внутри чипа, поэтому лента на четверти яркости и правда ест вчетверо меньше. У FastLED есть встроенный ограничитель: скажите ему напряжение и предельный ток, и он сам притушит картинку, чтобы в них уложиться. Про то, что вообще может дать плата, есть отдельная статья «Питание Arduino».
Первый скетч
Самая ходовая библиотека — Adafruit NeoPixel: она есть в каталоге среды, ставится в два клика и делает ровно то, что нужно новичку.
#include <Adafruit_NeoPixel.h>
const int PIN_DATA = 6; // между выводом и лентой — резистор 300...500 Ом
const int COUNT = 16; // сколько светодиодов в цепочке
// NEO_GRB — порядок цветов внутри WS2812B: сначала зелёный, потом красный.
// Если красный и зелёный меняются местами, дело именно в этой строке.
Adafruit_NeoPixel strip(COUNT, PIN_DATA, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin();
strip.setBrightness(40); // 0...255; на полной яркости лента слепит и греется
strip.show(); // сразу гасим: после включения в памяти мусор
}
void loop() {
// Бегущий огонёк: зажигаем один светодиод, остальные гасим.
for (int i = 0; i < COUNT; i++) {
strip.clear();
strip.setPixelColor(i, strip.Color(0, 180, 255));
strip.show();
delay(60);
}
}
Две строки здесь ключевые. NEO_GRB — порядок цветов внутри чипа: WS2812B ждёт сначала зелёный, потом красный. Если перепутать, лента будет работать, но красный станет зелёным — это и есть самая частая «поломка» новичков. А strip.show() в setup нужен потому, что после включения в памяти библиотеки лежит мусор: без явного «показать» лента может вспыхнуть случайными цветами на полной яркости.
Радуга без пауз и с оглядкой на питание
FastLED умеет больше: цвет по кругу через тон и насыщенность, палитры, готовые эффекты — и тот самый ограничитель тока.
#include <FastLED.h>
const int PIN_DATA = 6;
const int COUNT = 16;
CRGB leds[COUNT]; // 3 байта на светодиод — это и есть вся картинка
unsigned long lastStep = 0;
byte shift = 0;
void setup() {
FastLED.addLeds<WS2812B, PIN_DATA, GRB>(leds, COUNT);
FastLED.setBrightness(40);
// Потолок питания: библиотека сама притушит ленту, если по её расчёту
// ток вышел больше заданного. 5 В и 500 мА — это ровно порт USB.
FastLED.setMaxPowerInVoltsAndMilliamps(5, 500);
}
void loop() {
// Ждём, но не через delay: плата в это время свободна для других дел.
if (millis() - lastStep < 30) {
return;
}
lastStep = millis();
shift++;
// CHSV — цвет по кругу: тон, насыщенность, яркость.
for (int i = 0; i < COUNT; i++) {
leds[i] = CHSV(shift + i * (255 / COUNT), 255, 255);
}
FastLED.show();
}
Обратите внимание: вместо delay здесь проверка времени по millis. С лентой это особенно важно — пока плата спит в delay, она не может ни кнопку опросить, ни датчик прочитать. Как это устроено, разобрано в статье про setup и loop.
Наша библиотека — самая экономная
Для модулей NeoPixel (Trema) есть своя библиотека iarduino_NeoPixel: она тоже лежит в каталоге среды, а во флеше занимает меньше всех. Устроена она чуть иначе — цвет и яркость задаются одной командой.
#include <iarduino_NeoPixel.h>
// Наша библиотека: сначала номер вывода, потом количество светодиодов.
// У модуля NeoPixel (Trema) их четыре, у кольца — 12, 16, 24 или 60.
iarduino_NeoPixel pixels(6, 4);
void setup() {
pixels.begin();
}
void loop() {
for (int i = 0; i < 4; i++) {
// Пятый параметр — яркость, и она устроена необычно: 127 отдаёт цвет
// как есть, меньше 127 затемняет, больше — высветляет до белого.
pixels.setColor(NeoPixelAll, 0, 0, 0, 127);
pixels.setColor(i, 0, 180, 255, 60);
pixels.write();
delay(150);
}
}
Одна деталь способна сбить с толку: яркость здесь считается от середины. 127 — это «отдай цвет как есть», меньше — затемнение, больше — высветление до белого. То есть 60 в примере это не «60 из 255», а «примерно вдвое темнее заданного цвета». Ещё отличие: показать картинку — это write(), а не show().
| Библиотека | ОЗУ, байт | Флеш, байт | Чем хороша | Чем неудобна |
|---|---|---|---|---|
| Adafruit NeoPixel 1.15.5 | 41 + 180 в куче | 2 526 | самая простая: цвет числом, всё по-английски и понятно | никаких эффектов из коробки — только «зажечь и показать» |
| FastLED 3.10.3 | 308 | 3 706 | цвет по кругу (HSV), палитры, ограничение тока, десятки чипов | почти вдвое больше флеша, синтаксис с угловыми скобками пугает |
| iarduino_NeoPixel 1.1.6 | 34 + 180 в куче | 1 960 | самая экономная, комментарии в исходнике по-русски | непривычная яркость: 127 — это «как есть», а не половина |
Числа получены сборкой одинаковых по смыслу скетчей на 60 светодиодов под Uno. Сравнивать столбец ОЗУ впрямую нельзя: FastLED держит картинку в обычном массиве, и компилятор её видит, а две другие библиотеки просят память при запуске — те же три байта на светодиод просто не попадают в отчёт компилятора. Реальный расход у всех трёх примерно одинаковый, а вот разница во флеше настоящая: FastLED почти вдвое тяжелее, и на Uno это заметно.
Чем длиннее лента, тем медленнее картинка
| Светодиодов | Длительность посылки | Предел обновлений в секунду |
|---|---|---|
| 4 (модуль) | 0,12 мс | около 2 400 |
| 16 (кольцо) | 0,48 мс | около 1 280 |
| 60 (метр ленты) | 1,8 мс | около 480 |
| 144 | 4,3 мс | около 215 |
| 300 (5 метров) | 9,0 мс | около 107 |
30 мкс на светодиод — величина неотменяемая, она заложена в протокол. Для глаза даже сотня обновлений в секунду избыточна, так что предел не мешает. Мешает другое: всё это время плата занята только лентой. Прерывания выключены, а значит стоят и часы: внутренний счётчик миллисекунд обновляется каждые 1,024 мс, и если посылка длится дольше, один тик просто теряется. На метре ленты это до миллисекунды за кадр, на пяти метрах — около семи. Обновляйте картинку тридцать раз в секунду — и часы платы начнут отставать заметно, а приём по последовательному порту потеряет байты.
Лечится это тремя способами: меньше светодиодов, реже обновление или другая плата. У ESP32 посылку формирует аппаратный узел, и процессор в это время свободен — там проблемы нет вовсе.
Трёхвольтовые платы: почему ESP не заводит ленту
Чип ждёт, что единица на входе данных будет не ниже 0,7 от его питания. При питании 5 В это 3,5 В, а ESP и Raspberry Pi Pico выдают 3,3 В — то есть формально ниже порога. Иногда работает, иногда нет, иногда работает до первого нагрева: классическая история «у меня завелось, а у соседа с той же схемой нет».
Два честных решения. Первое — преобразователь уровней между платой и лентой. Второе, более хитрое: запитать ленту не от 5 В, а через обычный диод, потеряв на нём 0,6 В. Тогда порог опустится примерно до 3,1 В, и трёхвольтовый сигнал станет законным. Яркость при этом падает едва заметно.
Какие бывают адресные светодиоды
| Чип | Питание | Проводов | Чем отличается | О чём помнить |
|---|---|---|---|---|
| WS2812B | 5 В | три | самый ходовой; порядок цветов GRB | один сгоревший светодиод глушит всех, кто за ним |
| WS2813 | 5 В | четыре | есть запасная линия данных — цепочка переживает поломку | дороже, пауза-сброс длиннее |
| WS2815 | 12 В | четыре | ток на светодиод впятеро меньше, длинные ленты не проседают | нужен блок 12 В; на короткие ленты незачем |
| SK6812 RGBW | 5 В | три | четвёртый, белый кристалл — честный белый вместо смеси | на светодиод уходит 32 бита, а не 24 |
| APA102, SK9822 | 5 В | четыре | отдельный провод такта: точность времени не нужна вовсе | дороже; занимает у платы ещё один вывод |
Для первых опытов проще всего взять готовый модуль или небольшое кольцо: светодиодов немного, питать можно прямо от платы, а паять ничего не нужно. В магазине есть модуль на четыре светодиода за 216 ₽ и кольцо на 60 светодиодов за 1 161 ₽— последнее уже требует отдельного питания, если включать его ярко.
Что делать, если не работает
| Симптом | Почему | Что делать |
|---|---|---|
| Ничего не горит | лента подключена не с того конца | смотрите стрелку на плёнке: вход всегда слева по стрелке |
| Красный и зелёный поменялись местами | порядок цветов в чипе не RGB, а GRB | NEO_GRB в конструкторе или GRB в строке addLeds |
| Первый светодиод моргает или врёт цветом | сигнал слишком резкий либо новая партия чипов с длинным сбросом | резистор 300—500 Ом в линию данных и свежая версия библиотеки |
| Дальний конец ленты желтеет и тускнеет | просадка напряжения вдоль дорожек | подать питание с обоих концов, а на длинных лентах — и в середину |
| Плата перезагружается, как только лента вспыхивает | ток больше, чем может дать плата или её USB-порт | отдельный блок питания, общая земля, конденсатор у входа ленты |
| Часы отстают, кнопки срабатывают через раз | во время посылки прерывания выключены | меньше светодиодов, реже обновление; на ESP32 проблемы нет |
| Лента работает от Arduino и не работает от ESP | трёхвольтового сигнала не хватает: чипу нужно 0,7 от питания | преобразователь уровней или питание ленты через диод, от 4,5 В |
И совет, который экономит больше всего нервов: начинайте с малого. Восемь светодиодов, яркость 40 из 255, питание от платы — если это работает, значит скетч и провода верные, и дальше вопрос только в питании. Если же сразу подключить пять метров, отлаживать придётся всё одновременно: и код, и ток, и уровни, и просадку по длине.
Частые вопросы
Сколько тока нужно ленте WS2812B?
Считают по 60 мА на светодиод при белом на полной яркости — это оценка сверху, в листе данных чипа потребления нет вовсе. Метр ленты на 60 светодиодов просит до 3,6 А, пять метров — до 18 А. От платы можно питать восемь-десять светодиодов, дальше нужен отдельный блок 5 В.
Почему у ленты красный горит зелёным?
Потому что WS2812B принимает цвета в порядке GRB: сначала зелёный, потом красный, потом синий. В библиотеке это задаётся при создании ленты — NEO_GRB у Adafruit NeoPixel или GRB в строке addLeds у FastLED. Замена одного слова чинит все цвета сразу.
Можно ли подключить ленту к ESP8266 или ESP32 напрямую?
Формально нет: чипу нужна единица не ниже 0,7 от его питания, при 5 В это 3,5 В, а ESP выдаёт 3,3 В. Иногда работает, иногда нет. Надёжных решений два: преобразователь уровней или питание ленты через обычный диод, чтобы её питание упало до 4,4 В и порог опустился.
Что выбрать: FastLED или Adafruit NeoPixel?
Для первых опытов проще Adafruit NeoPixel. FastLED даёт цвет по кругу, палитры и ограничитель тока, но занимает почти вдвое больше флеша: в нашем замере под Uno 3 706 байт против 2 526. Самая экономная из трёх — iarduino_NeoPixel: 1 960 байт.
Почему при работе ленты отстают часы и залипают кнопки?
Во время посылки библиотека выключает прерывания: длительность импульсов надо выдержать с точностью ±150 нс. Счётчик миллисекунд в это время стоит. На метре ленты каждая посылка длится 1,8 мс, на пяти метрах — 9 мс. У ESP32 этой беды нет, там посылку формирует аппаратный узел.
Зачем резистор и конденсатор в схеме ленты?
Резистор 300—500 Ом в линии данных сглаживает фронт сигнала: без него первый светодиод часто врёт цветом или моргает. Конденсатор 500—1000 мкФ у входа питания гасит бросок тока при включении — иначе лента способна уронить питание всей платы.
Почему первый светодиод в ленте моргает?
Либо сигнал слишком резкий — помогает резистор 300—500 Ом, либо у вас новая партия чипов: им нужна пауза не 50, а 280 микросекунд после посылки. Свежие версии библиотек это учитывают, Adafruit NeoPixel выжидает 300 мкс. Обновите библиотеку из каталога.
Читайте также
Обновлено: 25 августа 2026
