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

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

Проект на ESP32: четыре кольца WS2812B в печатном корпусе меняют цвет по команде, отправленной Telegram-боту из любой точки мира.

Идея: адресные светодиоды плюс мессенджер

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

Корпус из колец

Основой конструкции стали кольцевые модули на светодиодах WS2812B. Взяты четыре кольца: одно на 60 диодов, два на 24 и одно на 12. Расположены они так, что силуэт напоминает матрёшку или снеговика. Сначала идея была набросана от руки, затем размеры колец уточнили и перерисовали эскиз в масштабе в графическом редакторе.

Кольцевые светодиодные модули на WS2812B
Эскиз светильника из колец, нарисованный от руки

Детали корпуса напечатаны на 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 придётся добавлять отдельно.

← Все статьи