Лестница в небо: кастомизируем WLED

fb92ae855c2e8634acbc7d4562bfae7b.JPG

На хабре уже было несколько статей про wled, но обычно они ограничивались штатными возможностями прошивки — гирлянды с эффектами, управление RGB-подсветкой комплектующих ПК, вскользь упоминалась и возможность интеграции с умным домом.

Здесь же мы рассмотрим решение конкретной задачи — от идеи и попыток использования стандартной прошивки до сборки своей с увеличенным количеством управляющих пинов, расширенным web-интерфейсом, api для отладки, своей логикой для управления подсветкой и даже демкой на jsfiddle.

Задача у нас следующая — есть наполовину уличная лестница (остекленная веранда), на которой хочется сделать «лестницу в небо» — поочередную подсветка ступеней со стороны идущего человека.
Условия работы соответствующие — зимой мороз, летом жара, днем подсветка бесполезна из-за естественного освещения.

Готовое решение

На самом деле в доме на внутренней лестнице уже есть подсветка с простой анимацией, но реализована она на готовом контроллере, на обычных лентах — там пришлось тянуть отдельные провода к каждой ступени.

dceee6e7eb745e6d7cfc63e093481826.JPG

На этот раз хотелось большего, поэтому требования были составлены следующим образом:

  • многоцветность,

  • наличие готовых эффектов,

  • отключение подсветки при достаточном естественном освещении,

  • ступени должны загораться и снизу вверх и сверху вниз, причём анимация не должна прерываться и идти с 2 сторон, если движение одновременно зафиксировано с обоих сторон.

Стоимость первого и второго решения мы ещё посчитаем и сравним ближе к концу.

Базовая прошивка wled

Wled это готовая прошивка для работы с адресными светодиодами, которая помимо своей прямой функции содержит также http api, web интерфейс, поддержку взаимодействия с внешними системами (например, mqtt) и даже синхронизацию разных wled устройств.

Также wled это целая экосистема, имеющая интеграции и плагины, пожалуй, ко всем распространённым системам умного дома, причём, довольно неплохие. Home assistant, например, автоматически распознает устройства wled в сети и умеет обновлять их прошивку по воздуху.

Перейдём ближе к нашей задаче: wled из коробки уже как будто поддерживает все необходимое:

  • группы светодиодов под каждую ступень,

  • настройка анимации включения / выключения групп с таймингами,

  • поддержка 2 входных пинов (для wemos d1 mini / esp8266), на которые можно повешать кнопки/переключатели/датчики движения,

  • триггеры на изменение значений пинов для запуска анимации.

слева-направо: палитры, анимации, сегменты, пресеты

слева-направо: палитры, анимации, сегменты, пресеты

Собственно, работает это как-то так (здесь я с ноута подключен к WiFi точке доступа wled и запускаю анимацию в ручном режиме из web-интерфейса):

96bec545856aa677e8d2367f3bdba80c.gif

Выглядит отлично, но на практике не все так радужно:

  • при каждом срабатывании датчика анимация запускается заново,

  • параллельно 2 анимации работать не могут,

  • штатно в прошивке под ESP8266 доступно только 2 входных пина, датчик освещённости уже не подключить,

  • даже при расширении количества доступных пинов датчик освещённости привязать некуда, сложные условия или хотя бы банальный if с проверкой пары значений написать нельзя (и настроить в интерфейсе, соответственно, тоже).

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

Будем постепенно решать эти проблемы.

Расширение количества входов (кнопок)

По умолчанию подшивка wled для wemos d1 mini допускает только 2 входных порта, несмотря на то, что контроллер и плата содержат куда большее количество свободных пинов.

К счастью, эта проблема легко поправима — нужно всего лишь указать флаг WLED_MAX_BUTTONS с требуемым количеством пинов и собрать прошивку.

Сборка прошивки wled

А вот тут начинаются сложности, если вы ранее не сталкивались с такой схемой билда, опыт прошивки arduino тут не поможет.
Впрочем, все описано в официальной инструкции. Вам только нужен будет некоторый софт — git, vs code, platformio extension, docker, node, wsl в windows-системе. Также несколько ребутов и вероятно не работающая кнопка build, которая судя по некоторым issues может работать рандомно и собирать бинарник не с первого раза.

Если вы не хотите собирать прошивку сразу для всех поддерживаемых платформ — нужно будет также раскомментировать строку в конфиге с d1_mini и закомментировать строку выше с перечислением всех поддерживаемых платформ.

Далее нужно дописать ключ -D WLED_MAX_BUTTONS=10 в build_flags для расширения числа доступных «кнопок».

У меня в итоге все собралось через test, первый этап которого включает в себя build и выдает нужный бинарник прошивки.

Искомые 10 доступных пинов получены, но в итоге оказались не задействованы

Искомые 10 доступных пинов получены, но в итоге оказались не задействованы

Кастомизация wled

Раз уж мы все равно выяснили, что стандартными функциями не обойтись — давайте взглянем, что wled предлагает для кастомизации: вот тут инструкция по реализации своих скриптов (usermod’ов), в рамках которых можно и gui расширить, и api написать, и с пинами микроконтроллера на C++ поработать.

Изначально я и начал писать этот код по инструкции, пока случайно в недрах репозитория не обнаружил набор целой кучи уже готовых usermod’ов, о которых официальная дока ничего не говорит.

А тем временем здесь есть очень много всего:

Мой usermod и его описание можно найти в репозитории, все необходимые пояснения есть в readme и в коде. Стиль кода (или его отсутствие) — следствие реализации на основе чужого решения (и в целом общего подхода написания usermod’ов), после получения рабочего варианта заняться рефакторингом не довелось.

И все же, несмотря на удобный и быстрый по меркам микроконтроллеров процесс прошивки, отлаживать баги на физическом устройстве и схеме оказалось трудоёмко. Я честно пытался это сделать, но после пары десятков итераций попросил chatGPT (на тот момент ещё 4 версии) весь текущий код конвертировать в демку на html/css/js и отлаживал логику уже там.

132be063c7fdf18aa0d7ef4a20fb85a9.JPG

Демку можно потыкать тут — jsfiddle.

Финальная логика работы следующая:

  • каждый датчик независимо запускает включение ступеней со своей стороны.

  • через on_time_ms после последнего срабатывания датчика запускается выключение ступеней (всегда в 1 сторону).

  • повторные срабатывания датчиков влияют только на время выключения, анимация повторно не запускается.

  • при этом пины и задержки задаются в интерфейсе, а в api отдаются состояния датчиков.

  • к отдельному пину подключается датчик освещенности (логический модуль, выдающий высокий или низкий уровень), который отключает подсветку при дневном освещении.

Для включения usermod в прошивку достаточно его заинклюдить в /wled00/usermods_list.cpp:

#include "../usermods/usermod_stairs.h":

Настройки usermod'а в интерфейсе WLED

Настройки usermod’а в интерфейсе WLED

Схема подключения

Здесь небольшое лирическое отступление по поводу схемы подключения.

Все участки ленты мы подключаем последовательно, но при этом питания, особенно в варианте с 5v лентой, будет катастрофически не хватать и лента в лучшем случае будет терять яркость от начала к концу. По этой причине необходимо подводить питание еще и в промежуточные точки ленты (у меня это каждые 2 ступени — пустил силовой провод по одной из сторон лестницы).

Также здесь стоит сказать, что разработчики WLED позаботились о безопасности и в прошивке есть софтовый расчет максимальной потребляемой мощности лентой на выбранных режимах и по умолчанию выставлено ограничение по максимально возможной мощности ленты, рассчитанный исходя из прямого подключения ленты к пинам контроллера. При превышении этого значения контроллер будет пропорционально снижать яркость диодов в зависимости от используемого эффекта.

4cc6d92ad779f6ea55a2253fcf00e432.png

Если у вас лента запитана по всем канонам, а не напрямую от контроллера — это значение нужно установить равным максимальному (номинальному?) току, который выдает ваш блок питания, или вовсе убрать ограничение.

Общую схему подключения можно изобразить примерно в таком виде:

Извините, что не по ГОСТу

Извините, что не по ГОСТу

Несмотря на то, что ESP работает на 3.3 В, а лента питается / управляется 5 В — прямое соединение работает корректно, отчасти из-за небольшого расстояния между контроллером и первым участком ленты. Если в вашем случае это расстояние велико и возникают сбои, а также если лента питается другим напряжением и не может быть подключена напрямую (12 В) — в схему нужно добавить преобразователь уровней согласно официальным рекомендациям.

Как видно, проводов здесь нужно гораздо меньше, чем в случае с готовым контроллером.

Результат

Финальный результат выглядит так:

02bec1841a45a2698b8cbb0d6406ff70.gif

Я остановился на одной из анимаций, которая лишь слегка меняет интенсивность свечения отдельных диодов, чтобы выглядело динамично, но в то же время не мешало в процессе эксплуатации.

Впрочем, можно выбрать любой эффект вплоть до использования различных анимаций под каждую ступень. Например, вот более динамичный режим:

8960e56b964d69f61a5e0c032b3d1a8a.gif

Также usermod можно отключить и управлять подсветкой штатными средствами — вдруг ваша лестница находится в центре дома и вы захотите устроить вечеринку с цветомузыкой.

Необходимые комплектующие и бюджет

Здесь и далее ссылки на комплектующие на поиск али, без рефералок.

Т.е. суммарные затраты составили примерно 5150 ₽.

Готовое решение

Обещал также сравнение готового решения и описанной реализации.

На текущий момент появилась 2 версия контроллера с поддержкой датчика освещённости, у меня стоит первая версия без оного.

Комплектующее

Стоимость

Контроллер с датчиками

от 2000 до 4000 ₽

Одноцветная светодиодная лента

~2000 ₽

Блок питания можно взять немногим менее мощный, но вольтажом до 24v (должен соответствовать ленте)

~1000 ₽

Провода — нужно больше метраж, но меньшего сечения, считаем что стоимость драматически не отличается

1000 ₽

Стяжки, оплетка для эстетики

500 ₽

Общая сумма минимум 6500 ₽ (без поддержки датчика освещенности).

Как видно, небольшая экономия выходит только за счёт блока питания и датчиков. Контроллер же стоит на порядок дороже используемого нами.

Выводы

При более широких возможностях описанной реализации готовое решение все равно уступает и в цене, и в удобстве монтажа.

Да, здесь не учтена стоимость разработки, но у описанного устройства скорее хоббийная природа — мне попросту был интересен процесс, каким бы затратным он не оказался по итогу.

Если у вас остались вопросы или есть замечания/предложения — милости прошу в комментарии.

Полезные ссылки

© Habrahabr.ru