База знаний · Датчики и модули

Адресные светодиоды WS2812B: лента, кольцо, модуль

Один провод на всю цепочку, 30 мкс на светодиод и до 60 мА на каждый: почему лента просит больше, чем плата способна дать.

Обычный светодиод умеет только гореть и не гореть. У адресного внутри сидит крошечный контроллер, и разговаривать с ним можно словами «стань синим» — по одному-единственному проводу, сколько бы светодиодов ни стояло в цепочке. Отсюда и вся магия лент, колец и матриц: три провода, а картинка любая. Расплата — жёсткие требования ко времени и очень серьёзный аппетит к току.

Как это работает

Один бит длится 1,25 мкс — разная только длина импульсабит «ноль»0,4 мкс0,85 мксбит «единица»0,8 мкс0,45 мксДопуск — ±150 нс. Поэтому во время посылки плата не может отвлечьсяни на что: прерывания выключены, часы стоят, приём по USB теряется.На светодиод уходит 24 бита — это ровно 30 мкс.
Никакого адреса в посылке нет: светодиод берёт первые 24 бита, которые до него дошли, и передаёт остаток дальше. Поэтому лента всегда подключается с одного конца — со стрелкой, нарисованной на плёнке.

Данные идут по одному проводу без всякого такта: смысл бита кодируется длиной импульса. Период всегда 1,25 мкс, у нуля высокий уровень длится 0,4 мкс, у единицы — 0,8 мкс. Допуск — ±150 нс, то есть плюс-минус две команды процессора. Именно поэтому библиотеки на время посылки выключают прерывания: любая помеха собьёт длину импульса, и лента покажет мусор.

На один светодиод уходит 24 бита (по 8 на зелёный, красный и синий) — ровно 30 мкс. Адресов в посылке нет: первый светодиод забирает первые 24 бита себе, остальное выталкивает соседу. Когда поток кончился и линия замолчала дольше 50 мкс, все разом показывают то, что получили. В новых партиях эта пауза выросла до 280 мкс, и библиотека Adafruit сейчас честно выжидает 300 мкс — цифра прямо записана в её исходнике.

Три провода и две детали

До 8—10 светодиодов: питание от платыПЛАТАвывод 6 — данные5V и GND — питаниеЛЕНТАВХОД СЛЕВА, ПО СТРЕЛКЕ300—500 Ом5 В с платыобщая земляконденсатор 1000 мкФКонденсатор ставят у самого входа ленты: он гасит скачок в момент включения.
Ток в пределах USB, отдельный блок не нужен — но резистор в линии данных всё равно ставим.

Кроме проводов производители чипов просят добавить две детали, и обе не для красоты. Резистор 300—500 Ом в линии данных сглаживает фронт сигнала — без него первый светодиод часто ведёт себя странно. Конденсатор 500—1000 мкФ у входа питания гасит бросок тока в момент включения: без него лента при старте способна уронить питание всей платы.

Порядок подключения тоже имеет значение: сначала земля, потом плюс, потом данные; отключать — наоборот. Если питание раздельное, включайте сначала ленту, а потом плату. Причина простая: пока у ленты нет своего питания, сигнал данных пытается запитать её через защитные диоды внутри чипа — а это верный способ убить первый светодиод.

Ток: главное число этой статьи

Сколько тока попросит лента60 светодиодов, половинаUSB, 0,5 Аблок 2 Ашкала до 5 А1,81 АОтдельный блок 5 В на 5 А, провода потолщеСчитаем по 60 мА на светодиод — это оценка сверху для белого цвета.
Ток растёт вместе с яркостью почти линейно, и это главный рычаг: та же лента на четверти яркости просит вчетверо меньше. В листе данных WS2812B потребления нет вовсе, поэтому все цифры здесь — оценка сверху по 20 мА на каждый из трёх кристаллов.

Здесь стоит сказать прямо: в листе данных 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.541 + 180 в куче2 526самая простая: цвет числом, всё по-английски и понятноникаких эффектов из коробки — только «зажечь и показать»
FastLED 3.10.33083 706цвет по кругу (HSV), палитры, ограничение тока, десятки чиповпочти вдвое больше флеша, синтаксис с угловыми скобками пугает
iarduino_NeoPixel 1.1.634 + 180 в куче1 960самая экономная, комментарии в исходнике по-русскинепривычная яркость: 127 — это «как есть», а не половина

Числа получены сборкой одинаковых по смыслу скетчей на 60 светодиодов под Uno. Сравнивать столбец ОЗУ впрямую нельзя: FastLED держит картинку в обычном массиве, и компилятор её видит, а две другие библиотеки просят память при запуске — те же три байта на светодиод просто не попадают в отчёт компилятора. Реальный расход у всех трёх примерно одинаковый, а вот разница во флеше настоящая: FastLED почти вдвое тяжелее, и на Uno это заметно.

Чем длиннее лента, тем медленнее картинка

СветодиодовДлительность посылкиПредел обновлений в секунду
4 (модуль)0,12 мсоколо 2 400
16 (кольцо)0,48 мсоколо 1 280
60 (метр ленты)1,8 мсоколо 480
1444,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 В, и трёхвольтовый сигнал станет законным. Яркость при этом падает едва заметно.

Какие бывают адресные светодиоды

ЧипПитаниеПроводовЧем отличаетсяО чём помнить
WS2812B5 Втрисамый ходовой; порядок цветов GRBодин сгоревший светодиод глушит всех, кто за ним
WS28135 Вчетыреесть запасная линия данных — цепочка переживает поломкудороже, пауза-сброс длиннее
WS281512 Вчетыреток на светодиод впятеро меньше, длинные ленты не проседаютнужен блок 12 В; на короткие ленты незачем
SK6812 RGBW5 Втричетвёртый, белый кристалл — честный белый вместо смесина светодиод уходит 32 бита, а не 24
APA102, SK98225 Вчетыреотдельный провод такта: точность времени не нужна вовседороже; занимает у платы ещё один вывод

Для первых опытов проще всего взять готовый модуль или небольшое кольцо: светодиодов немного, питать можно прямо от платы, а паять ничего не нужно. В магазине есть модуль на четыре светодиода за 216 ₽ и кольцо на 60 светодиодов за 1 161 ₽— последнее уже требует отдельного питания, если включать его ярко.

Что делать, если не работает

СимптомПочемуЧто делать
Ничего не горитлента подключена не с того концасмотрите стрелку на плёнке: вход всегда слева по стрелке
Красный и зелёный поменялись местамипорядок цветов в чипе не RGB, а GRBNEO_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