Витрина в мастерской на шестьдесят пикселей жила от USB-зарядки на 1 А: радуга вприпрыжку, всё хорошо — пока однажды я не залил её белым для фотографии. Зарядка щёлкнула и отрубилась прямо перед съёмкой, повторно включаться отказалась минуту. Бюджет я считать умел — урок про setBrightness и ток — но считать каждый кадр руками нереально: радуга просит один ток, белый втрое больше, эффекты меняют картину шестьдесят раз в секунду, и держать это в голове устанешь уже на втором эффекте. В библиотеке есть штатный автомат: скажи ему напряжение и потолок тока — и он перед каждым кадром сам ужимает яркость так, чтобы расчёт не вышел за границу. Порт живёт, картинка тускнеет ровно настолько, насколько надо.
Разберём: как включается ограничитель и что он делает с setBrightness; из какой модели библиотека считает ток и где эта модель врёт; индикаторный светодиод, показывающий работу лимита; и границы — когда автолимит спасает, а когда нужен блок побольше.
Одна строка в setup и ужатие в каждом кадре
Включение — одна строка после addLeds: FastLED.setMaxPowerInVoltsAndMilliamps(5, 500). Первое число — напряжение питания ленты, второе — потолок тока, который вы готовы отдать. Старое имя set_max_power_in_volts_and_milliamps до сих пор компилируется, но в заголовках помечено как устаревшее — пишите новый вызов. Дальше всё происходит в каждом show(): библиотека смотрит на буфер, считает расчётный ток кадра и, если он не влезает в потолок, пропорционально ужимает яркость — так, чтобы расчёт уложился. setBrightness после этого работает как запрос: просите 255, а фактическая яркость встаёт на максимум, разрешённый лимитом. Снимете перегруз — полный свет вернётся сам, без правки кода. Скелет кадра без delay при этом не меняется: millis-каркас из базовых уроков живёт как жил.
Модель, по которой считается ток, зашита в библиотеке: полный красный канал пикселя — 16 мА, зелёный — 11, синий — 15, плюс миллиампер тёмного покоя на пиксель. Белый пиксель по этой модели — 43 мА, и тут честное замечание: даташит WS2812B обещает до 60 мА белым, то есть модель занижает самый дорогой цвет примерно на треть. Отсюда практика: лимит ставится не впритык к источнику, а с зазором — на USB с его пятьюстами миллиамперами я говорю библиотеке 400. Проверяется модель USB-метром в разрыв провода: прибор покажет реальный ток вашего экземпляра ленты, и за минуту вы увидите, насколько он отличается от расчёта. Физику про ток и каналы я разбирал в уроке про закон Ома — здесь хватает пропорций.
#include <FastLED.h> #define LED_PIN 6#define NUM_LEDS 60 CRGB leds[NUM_LEDS]; void setup() { FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS); FastLED.setBrightness(255); // запрос: полная яркость // Автолимит: 5 вольт, 400 мА из 500 - зазор на заниженную модель FastLED.setMaxPowerInVoltsAndMilliamps(5, 400); // Светодиод на пине 13 горит в кадры, когда лимит режет яркость set_max_power_indicator_LED(13); fill_solid(leds, NUM_LEDS, CRGB(255, 255, 255));} void loop() { FastLED.show(); // каждый кадр ужимается под расчётные 400 мА delay(1000);}Что вы увидите на этом скетче. Шестьдесят пикселей белым при полной яркости просили бы 3,6 ампера; лимит в 400 мА по модели с её 43 мА на пиксель разрешает зажечь примерно девять-десять из них — фактическая яркость упрётся около шестидесяти из 255, лента останется заметно приглушённой, но живой, и порт не щёлкнет. Светодиод на пине 13 загорится — это индикатор: в этом кадре работал ограничитель. Замените белый на fill_rainbow — у каждого пикселя горит один-два кристалла вместо трёх, расчётный ток падает втрое, и та же лента зажжётся на полный запрос. Это лучший способ почувствовать цену цветов без амперметра: белый — люкс, радуга — втрое дешевле, приглушённые палитры — ещё дешевле.
Границы автомата. Ограничитель считает ток по буферу — он не знает про короткое замыкание в проводах, просадку на длинной линии и блок, выдающий меньше паспортного. Для витрины на USB он идеален; для ленты от трёх метров проще поставить блок правильного размера и заняться инжекцией, о которой говорит урок про блок 5 В и инжекцию. И не путайте с powerbank-ом: паспортная ёмкость в миллиампер-часах ничего не говорит о выдаваемом токе — банка на 20 000 мА·ч может отсекаться при полуамперах, если её защита заточена под зарядку телефона. Автолимит от этого не спасает: он режет потребление ленты, но не умеет уговаривать чужую защиту.
Лимит — потолок, а не ручка
Самое полезное свойство автомата — разделение ролей. setBrightness — художественный запрос: сколько света хочет ваш эффект. Лимит — технический потолок: сколько может позволить источник. До включения лимита эти две ручки были одной, и витрины жили приглушёнными из страха за порт: яркость держали низкой постоянно, хотя перегруз случается лишь на пиках. После включения я ставлю setBrightness(255) и забываю про ток: эффекты отрабатывают драматургию, автомат молча режет пики, и в обычные кадры никто ничего не замечает. Плавное ведение яркости, если оно нужно, остаётся художественной задачей — так диммер ведёт уровень в уроке про потенциометр-диммер, лимит в это не вмешивается.
Практический ритуал после включения лимита: поснимайте свои эффекты с индикатором на пине 13. Горит изредка, на самых ярких пиках — всё здорово, автомат страхует то, что случается раз в минуту. Горит половину времени — контент живёт за пределами источника, и либо лимит поднять, либо эффект перекрасить. И заметьте про старт: fill_solid в setup() ужимается на первом же show() — лента стартует уже в рамках бюджета, без вспышки на полную перед темнением, о которой вы узнали бы только с камерой. USB-порт 2.0 даёт пятьсот миллиампер, порт 3.0 — девятьсот, зарядка — по паспорту один-два ампера: в вызов идёт честная цифра вашего источника, а не «какой-нибудь USB».
Оговорка, чтобы вы не повторили мой спор с заказчиком: ужатие пиков видно глазу, и в витрине для клиентов это может читаться как дефект. Лечится не отказом от лимита, а контентом: запрет чистого белого, палитры без крайних яркостей, шлейфы вместо заливок — приёмы из урока про бюджет тока. Лимит при этом остаётся страховкой от того, что вы не углядели: новый эффект, написанный в три ночи, не уронит витрину в самый дорогой момент.
Разбор модели. Кадр живёт массивом из сорока восьми каналов, и ток считается ровно по формуле библиотеки: красный по 16 мА, зелёный по 11, синий по 15, плюс миллиампер покоя на пиксель. Белый на полном запросе просит 688 модельных милламперов — лимит 400 ужимает кадр до 58 процентов, и Serial печатает это построчно. Перекиньте кнопку на радугу при той же ручке: req падает ниже лимита, scale встаёт в сто процентов, лента зажигается на полный запрос — вот наглядно, почему радуга втрое дешевле белого. На плате ту же арифметику делает show() после setMaxPower, только встроенно, до отправки кадра. И отличие модели от жизни видно в тех же числах: 688 модельных на белом — это до 960 реальных по даташиту, поэтому лимит я держу на 400 из 500, а не на всех пятистах.
| Источник питания | Потолок источника | Лимит для setMaxPower |
|---|---|---|
| USB-порт 2.0 | 500 мА | 400 мА — зазор на заниженную модель |
| USB-порт 3.0 | 900 мА | 700 мА |
| Зарядка 5 В 2 А | 2000 мА | 1500-1600 мА, провод проверить |
| Блок 5 В 3 А | 3000 мА | 2400 мА или бюджет руками |
- 1. Что делает FastLED.setMaxPowerInVoltsAndMilliamps(5, 500)?
- 2. Сколько мА на белый пиксель считает внутренняя модель FastLED?
- 3. setBrightness(255) при лимите 400 мА на перегруженной белой сцене — что покажет лента?
- 4. Почему я ставлю лимит 400 на порту с потолком 500 мА?
- 5. Как увидеть работу ограничителя без амперметра?
- setMaxPowerInVoltsAndMilliamps(5, 400): перед каждым show() кадр ужимается под расчётный потолок
- Модель: 16/11/15 мА по каналам плюс 1 мА покоя — белый 43 мА против 60 реальных, лимит ставьте с зазором
- setBrightness — художественный запрос, лимит — технический потолок; после ужатия свет вернётся сам
- set_max_power_indicator_LED(13): светодиод горит в кадры, когда ограничитель работает
- Автолимит не про КЗ и не заменяет блок: трём метрам нужен блок и инжекция
Частые вопросы по теме урока
- Что делает FastLED.setMaxPowerInVoltsAndMilliamps(5, 500)?
- Ограничитель пересчитывает допустимую яркость для каждого кадра: расчётный ток не выходит за потолок, а перегруз показывает себя приглушением, не отрубанием порта. Перед каждым show() ужимает кадр так, чтобы расчётный ток не вышел за 500 мА
- Сколько мА на белый пиксель считает внутренняя модель FastLED?
- Модель по каналам: 16/11/15 мА плюс миллиампер тёмного покоя — белый выходит 43 мА. Даташит обещает до 60, поэтому лимит ставят с зазором. 43 — 16 красный, 11 зелёный, 15 синий плюс 1 покоя
- setBrightness(255) при лимите 400 мА на перегруженной белой сцене — что покажет лента?
- setBrightness — запрос, лимит — потолок. Фактическая яркость упрётся в максимум, разрешённый расчётом, и вернётся сама, когда перегруз уйдёт. Максимум яркости, разрешённый лимитом, — ниже запроса
- Почему я ставлю лимит 400 на порту с потолком 500 мА?
- На белых сценах реальный ток выходит выше расчёта: модель считает 43 мА на пиксель, даташит — до 60. Двадцать процентов зазора закрывают разницу. Модель занижает белый примерно на треть — нужен зазор
- Как увидеть работу ограничителя без амперметра?
- Индикаторный пин из set_max_power_indicator_LED зажигается в кадры, где лимит режет яркость: мигает — пики есть, не горит — лимит не работает. Светодиод на пине из set_max_power_indicator_LED горит в кадры ужатия