Симулятор адресной ленты NeoPixel онлайн: 16 светодиодов WS2812
Адресная лента NeoPixel (она же WS2812) — мой самый честный урок про ток: 60 светодиодов на белом цвете на полной яркости съедают 3,6 А, и от USB Uno плата уходит в перезагрузку за полсекунды. На 16 светодиодах это уже 0,96 А — предел USB. В браузере этих расчётов нет: лента питается «из ниоткуда», и можно потрогать логику дыхания, радуги и конфетти без перегоревшего предохранителя.
Лента ставится на стенд симулятора из каталога: розовый провод с меткой NEO, один пин данных на D6 (стандартный для Adafruit_NeoPixel). 16 пикселей — базовая длина в карточке; задайте цвета в карточке через 16 hex-кодов или зажгите скетчем. Ниже — стартовый скетч с дыханием, радуга через hue, конфетти через random8 и честная граница модели.
Что эмулируется на стенде
NeoPixel в каталоге — деталь «Адресная лента NeoPixel 16 шт»: один пин данных на D6, розовый провод с меткой NEO. Adafruit_NeoPixel(16, PIN, NEO_GRB + NEO_KHZ800) — конструктор с 16 пикселями, пином 6 и порядком GRB (зелёный-красный-синий, как в чипе WS2812B). show() выталкивает цвета в ленту — без вызова show() ничего не зажжётся. Ловушка про «ток и предохранитель» — из заголовка: 60 светодиодов на белом 3,6 А, USB Uno держит 500 мА, и предохранитель срабатывает за полсекунды. На 16 пикселях — 0,96 А, ещё в пределах, но близко к потолку.
- 16 пикселей WS2812B: один пин данных, порядок байт GRB (зелёный-красный-синий), тайминг 800 кГц.
- Adafruit_NeoPixel(16, 6, NEO_GRB + NEO_KHZ800): конструктор; setPixelColor(i, r, g, b), show().
- setBrightness(0..255): общая яркость ленты, делит каждый канал. На 60 — четверть яркости, на 255 — максимум (и максимум тока).
- Color(r, g, b): перевод из 0-255 в 32-битный цвет, который ждёт setPixelColor.
- Цвета в карточке: 16 hex-кодов через «|» (например, FF0000|00FF00|...) — задайте вручную для проверки стенда.
Стартовый скетч: дыхание LED на 16 пикселях
#include <Adafruit_NeoPixel.h> #define PIN 6#define N 16Adafruit_NeoPixel lenta = Adafruit_NeoPixel(N, PIN, NEO_GRB + NEO_KHZ800); void setup() { lenta.begin(); lenta.setBrightness(80); // четверть — ток в пределах USB} void loop() { static unsigned long t0 = 0; if (millis() - t0 >= 30) { t0 += 30; byte yarkost = (sin(millis() / 500.0) + 1.0) * 127; for (int i = 0; i < N; i++) { lenta.setPixelColor(i, lenta.Color(yarkost, 0, 0)); // красное дыхание } lenta.show(); }}Запустите скетч — лента дышит красным: синус от 0 до 255 с периодом 3,14 секунды. Плавность даёт синус, а не линейный счётчик: у треугольной огибающей края «дёргаются», глаз замечает. Полный разбор дыхания, beatsin8 и scale8 — в уроке про дыхание LED на FastLED.
Радуга: fill_rainbow и движение по hue
#include <Adafruit_NeoPixel.h> Adafruit_NeoPixel lenta = Adafruit_NeoPixel(16, 6, NEO_GRB + NEO_KHZ800); byte startHue = 0; uint32_t cvet(byte hue) { byte r, g, b; byte c = hue / 42; // 6 секторов по 42 byte x = (hue % 42) * 6; switch (c) { case 0: r = 255; g = x; b = 0; break; case 1: r = 255 - x; g = 255; b = 0; break; case 2: r = 0; g = 255; b = x; break; case 3: r = 0; g = 255 - x; b = 255; break; case 4: r = x; g = 0; b = 255; break; case 5: r = 255; g = 0; b = 255 - x; break; } return lenta.Color(r, g, b);} void setup() { lenta.begin(); lenta.setBrightness(80);} void loop() { static unsigned long t0 = 0; if (millis() - t0 >= 50) { t0 += 50; for (int i = 0; i < 16; i++) { byte hue = startHue + i * 16; lenta.setPixelColor(i, cvet(hue)); } lenta.show(); startHue += 4; }}Радуга — основа FastLED: fill_rainbow(leds, N, startHue, deltaHue). В Adafruit_NeoPixel нет готового fill_rainbow, поэтому пишем свою функцию cvet(hue) через HSV → RGB. Полный разбор с FastLED — в уроке про fill_rainbow и параметр hue; палитры и градиенты — в уроке про fill_palette.
Граница: модель против живой ленты
| Проверка | Симулятор | Только железо |
|---|---|---|
| setPixelColor, show, Color — базовый API | да: 16 пикселей зажигаются | то же, плюс реальный ток |
| setBrightness(0..255) | да: число, без тока | то же, плюс реальная нагрузка |
| GRB-порядок байт в WS2812B | да: NEO_GRB по умолчанию | то же — проверьте порядок в чипе |
| Ток 60 мА на пиксель на белом | не моделируется | да — 16 × 60 = 0,96 А, предел USB |
| Резистор 330 Ом на данных и конденсатор 1000 мкФ | не нужны | обязательны для защиты первого пикселя |
| Самопрогрев и тепловое смещение цвета | не моделируется | да — длинная лента теплеет, синий уходит |
Браузер зажигает пиксели без тока и без защиты: резистор 330 Ом на данных (близко к первому пикселю) и конденсатор 1000 мкФ между 5V и GND — обязательны на плате. Без резистора первый пиксель «горит» чаще остальных: импульс данных заводит через паразитную ёмкость, и пиксель выходит из строя за месяц. Без конденсатора при смене цветов (всё → всё на 255) токовый пик валит блок питания.
Грабли NeoPixel
- Ток 60 мА на пиксель на белом: 60 пикселей × 60 мА = 3,6 А. USB Uno — 500 мА, нужен отдельный блок 5V. setBrightness(64) — четверть, ток четверть.
- GRB против RGB: чип WS2812B ждёт зелёный-красный-синий, NEO_GRB. Другие чипы (APA102, SK6812) — другой порядок, и NEO_RGB или NEO_RGBW.
- Забытый show(): setPixelColor рисует в буфер, без show() пиксели не меняются. Аналог display() на OLED.
- Резистор 330 Ом на данных: между пином Arduino и DI первого пикселя. Без него первый пиксель горит чаще остальных, лечится только заменой.
- Конденсатор 1000 мкФ между 5V и GND: сглаживает пиковый ток при смене цветов. Без него блок питания «свистит», а длинная лента начинает глючить.