Светильник на адресных светодиодах с управлением через Telegram

Проект на ESP32: четыре кольца WS2812B в печатном корпусе меняют цвет по команде, отправленной Telegram-боту из любой точки мира.
Идея: адресные светодиоды плюс мессенджер
Светильников на адресных светодиодах много, как и ламп с удалённым управлением из экосистем «умного дома». В этом проекте обе идеи соединены: цвет задаётся не пультом и не фирменным приложением, а обычным текстовым сообщением Telegram-боту. Бот принимает команду, контроллер перекрашивает светодиоды и отправляет в чат подтверждение. Доступ не ограничен одним человеком: писать боту может любой, кто знает его имя.
Корпус из колец
Основой конструкции стали кольцевые модули на светодиодах WS2812B. Взяты четыре кольца: одно на 60 диодов, два на 24 и одно на 12. Расположены они так, что силуэт напоминает матрёшку или снеговика. Сначала идея была набросана от руки, затем размеры колец уточнили и перерисовали эскиз в масштабе в графическом редакторе.


Детали корпуса напечатаны на 3D-принтере. Каждое кольцо лежит в своём круглом коробе; в коробах предусмотрены места стыковки друг с другом и каналы для проводов, спереди они закрываются прозрачными крышками. Отдельная деталь — кронштейн, которым собранная конструкция крепится к плоскому основанию. В основании прячется управляющая плата: в проекте для этого использован готовый корпус от радиоаппаратуры, но его можно спроектировать и напечатать самостоятельно.

Питание и ограничение яркости
Кольца подключаются как обычная адресная лента: земля, питание 5 В и сигнальная линия от контроллера. Главное, что нужно учитывать, — потребление. Один пиксель WS2812B на полной яркости берёт до 60 мА, и для 124 пикселей, заданных в программе, это около 7,4 А. Включать светильник на максимум не рекомендуется из-за возможного перегрева колец и проводов, поэтому яркость в прошивке ограничена примерно вдвое. Для такого режима нужен блок питания 5 В с током не менее 3,5 А.

Почему ESP32
Собрать подобное устройство можно и на классической Arduino с модулем Wi-Fi, и на STM32, но выбор пал на ESP32, а именно на плату WEMOS LOLIN32. Причины следующие:
- два независимых 32-битных ядра, работающих параллельно, против одного 8-битного у обычной Arduino;
- тактовая частота и объём оперативной и флеш-памяти больше в десятки и сотни раз;
- Wi-Fi с антенной и Bluetooth уже есть на плате, дополнительные модули не нужны.
Сигнал на ленту снимается с GPIO 4, других логических связей в схеме нет. Сама плата работает от 3,3 В, поэтому 5 В на неё подают либо через USB-разъём, либо через выводы VIN, за которыми стоит встроенный понижающий преобразователь.
Как устроена прошивка
Программа делится на две части. Первая поддерживает соединение с интернетом и протокол бота, для этого взята библиотека UniversalTelegramBot. Она компактна, но у неё есть заметный недостаток: на время сеанса связи контроллер замирает на несколько секунд, и всё, что выполняется в том же потоке, останавливается. Вторая часть выводит цвет и анимацию перехода через библиотеку Adafruit_NeoPixel, которая стабильно работает и на AVR, и на ESP32.
Передача данных в ленту идёт на частоте 800 кГц и очень чувствительна к задержкам: если её прерывать, появляются рывки и пиксели случайного цвета. Простого выделения отдельного потока здесь недостаточно, поэтому вывод на светодиоды перенесён на второе ядро. Arduino IDE и так собирает код для ESP32 поверх FreeRTOS, так что задача для ленты создаётся одной строкой с указанием ядра 1, а связь с Telegram остаётся на ядре 0.
В скетче указываются имя и пароль сети Wi-Fi и токен бота — уникальный идентификатор, который выдаётся при создании бота вместе с именем. Пока соединения нет, кольца светятся красным, после подключения к сети — зелёным. Сообщения опрашиваются раз в секунду. Получив новый цвет, программа случайным образом выбирает одну из девяти анимаций перехода: «змейку», «колесо» в разные стороны, заполнение в случайном порядке, вращение или плавное перетекание из старого цвета в новый.
Команды бота
- /start — приветствие и список доступных команд;
- /n RRR,GGG,BBB — установить новый цвет, каждая составляющая от 0 до 255, например /n 100,0,0;
- /c — узнать, какой цвет установлен сейчас;
- /t — узнать температуру чипа: у ESP32 есть встроенный термодатчик, и по нему удобно следить за перегревом.
Присланные значения цвета программа делит на три и ограничивает сверху, чтобы не перегружать ленту. После смены цвета бот отвечает подтверждением, а до следующей смены выдерживается пауза в несколько секунд.
Что можно доработать
Проект показывает, что через мессенджер несложно управлять практически любым самодельным оборудованием — от освещения и теплицы до охранной системы. Возможные направления развития:
- Сообщения по инициативе устройства. Для этого в программе прописывается ID чата владельца; узнать его можно командой /getid у бота IDBot. По ID также удобно ограничить круг пользователей, чьи команды принимаются.
- Библиотека без задержек. AsyncTelegram2 не блокирует контроллер и может работать в одном потоке с остальной программой, но несколько сложнее в освоении, особенно в части кнопок.
- Смена SSID и пароля без перепрошивки: через Bluetooth, с SD-карты при запуске или вводом с кнопок и энкодера. Аналог энергонезависимой EEPROM у ESP32 есть.
- Кнопки в чате. Библиотеки позволяют их создавать, но в этом проекте они не понадобились: цвет всё равно задаётся тремя числами.
- Защита от коллизий. Если ботом пользуются несколько человек одновременно, стоит предусмотреть в коде ограничения на противоречивые и слишком частые команды.
На классических платах Arduino запустить Telegram-бота, скорее всего, не получится или получится с большим трудом: не хватит ни скорости, ни памяти, а модуль Wi-Fi придётся добавлять отдельно.