Умное освещение и старая проводка

в 3:15, , рубрики: esphome, homeassistant, умный дом

В статье хочется поделиться реализацией управления освещением, которая может быть использована в различных системах "умного дома". Ключевая особенность - возможность работать вместе с обычной двухпроводной проводкой освещения.

Краткая предыстория
Идея появилась после покупки китайской светодиодной люстры, которой можно управлять с помощью радиопульта - включать, изменять яркость и цветовую температуру. Дома уже функционировал Home Assistant, и возникло логичное желание управлять этой люстрой для реализации режима "искусственный рассвет" - с ним намного комфортнее просыпаться в осенне-зимний период.
Проводка в комнате сделана давно. К люстре идет только два провода от выключателя, следовательно для любого умного управления пришлось бы держать выключатель в положении "включено" и управлять освещением только с помощью пульта. Это довольно неудобно, к тому же простых способов интегрировать пульт в систему Home Assistant я не придумал - нужно или коммутировать кнопки пульта или эмулировать радиокоманды.

Интеграция с Home Assistant
Другой способ интеграции - это переделка электроники люстры. Нужно заменить радиоуправление на модуль ESP32 под управлением ESPHome, который отлично интегрируется с Home Assistant.
Все управление освещением производится изменением состояния двух каналов яркости с помощью ШИМ-сигналов - холодного белого и теплого белого. Прошивка ESPHome умеет это "из коробки". Требуемый режим "искусственный рассвет" тоже легко реализуется - просто устанавливаем время включения на 30 минут, и получим плавное нарастание яркости.
Получается, что интегрировать люстру в систему умного дома относительно несложно, осталось придумать как сохранить возможность управления освещением с помощью существующих выключателей. Для этого нужно передавать команду от выключателя к люстре по тем же двум проводам, что и питание.

Передача команды по питающим проводам
Один из способов передать команду - использовать кратковременное прерывание питания. Это легко реализовать - заменяем обычный выключатель на проходной, у которого замкнуты выходные контакты. То есть цепь замкнута в обоих положениях выключателя, но в момент переключения цепь прерывается. Время прерывания зависит от выключателя и доходит до нескольких десятков миллисекунд.
Если бы люстра питалась постоянным током, такое прерывание питания было бы легко детектировать. Однако в сети у нас переменный ток, где значение напряжения проходит через ноль 100 раз в секунду. Остается попробовать детектировать прерывание питания по длительности - при переключении выключателя длительность нулевого значения напряжения составит несколько миллисекунд, в то время как при обычном переходе сетевого напряжения через ноль напряжение сразу же начнет увеличиваться с обратной полярностью.
В итоге проводка в комнате остается без изменений, только меняется выключатель на стандартный проходной. Люстра остается запитанной все время и готова принимать команды от Home Assistant. При переключении выключателя вручную питание люстры на короткое время прерывается, и это интерпретируется как команда включения/выключения света (то есть стандартное поведение не изменилось). Особенно удобно получается, когда проводка уже использует проходные выключатели - достаточно лишь дополнить один из них перемычкой.

Детектор прерывания питания
Для определения факта прерывания питания спроектируем детектор. Сетевое напряжение через выпрямитель и опторазвязку заведем на вход АЦП микроконтроллера, который будет контролировать длительность нулевого напряжения на входе. В обычном режиме на входе будут идти подряд полуволны синуса, и длительность нулевого значения напряжения будет очень малой. В момент переключения контактов проходного выключателя длительность нуля составит несколько миллисекунд.
Аналоговая часть схемы детектора имеет следующий вид:

Детектор прерывания питания

Детектор прерывания питания

Питание поступает через токоограничительные резисторы на диодный мост, к выходу которого подключен вход оптопары. Выход оптопары идет на вход АЦП микроконтроллера. На входе микроконтроллера включен встроенный Pull-up, таким образом, сетевое напряжение 100 раз в секунду через оптопару подтягивает вход микроконтроллера к земле. При отсутствии напряжения на входе АЦП покажет максимальное значение.
Для тестов использовалась плата Ардуино на базе микроконтроллера AVR, надежное срабатывание оптопары происходило при суммарном значении сопротивления токоограничительных резисторов в 200К. Алгоритм работы детектора простой - непрерывно измеряем напряжение на входе АЦП, и когда значение превысит пороговое, считаем время в течении которого входное напряжение превышает порог.
Поскольку максимальное разрешение тут не нужно, АЦП работает на максимально возможной скорости. В окончательной версии детектора значение порогового времени составляет примерно 0,4 мс. При регистрации пропадания питания на эту величину времени детектор выдает выходной сигнал, который служит командой включения/выключения света.
Поначалу я опасался, что пороговое время потребует точной настройки, и при быстром переключении выключателя детектор не будет срабатывать, однако система показала себя очень надежной.
Недостатком детектора можно считать рассеяние тепла на резисторах. При сопротивлении 200К максимальный ток светодиода составит чуть более 1 мА, в итоге на резисторах будет рассеиваться примерно 0,25 Вт тепла.

Финальный вариант
Как уже упоминалось, для люстры был сделан новый контроллер на базе модуля ESP32 под управлением прошивки ESPHome. В оригинальном контроллере приемник радиокоманд подавал ШИМ-сигналы на драйвер светодиодной ленты. В переделанном варианте к драйверу вместо приемника через опторазвязку подключен модуль ESP32. Детектор прерывания питания реализован на отдельном микроконтроллере AVR (attyny44A, размещен под модулем ESP32).
Вся электроника собрана на макетной плате, для питания используется модуль MeanWell IRM-02-3.3.
Следует также упомянуть про электробезопасность. Поскольку электроника подключается непосредственно к сети 220 В, нужно максимально обезопасить устройство. Так, для питания ESP32 и детектора используется гальванически развязанный модуль блока питания, детектор подключается к сети через опторазвязку, управление драйвером светодиодной ленты тоже происходит через опторазвязку. Вся электроника помещается в пластмассовый корпус для исключения возможности контакта с корпусом люстры.

Контроллер в сборе
Контроллер в сборе

В результате получилось очень удобно. Свет в комнате включается как от обычных выключателей, так и автоматически по будильнику. Кроме того, с помощью прошивки ESPHome реализован ночной режим - если включить свет в определенные часы, то яркость будет минимальной. Настраивать параметры режимов можно средствами Home Assistant.
Система работает уже более года, и показала себя в работе надежной и удобной.

Интерфейс Home Assistant

Интерфейс Home Assistant

Заключение
В статье прежде всего хотелось поделиться идеей использования кратковременного прерывания питания в качестве команды управления освещением. Мне ранее попадались описания переделок светодиодных люстр под прошивку ESPHome, но возможности работы с обычными выключателями там не было.
В качестве развития идеи можно попробовать исключить отдельный микроконтроллер и завести сигнал сразу на вход АЦП ESP32. Однако в этом случае алгоритм должен быть сложнее - штатными средствами не получится детектировать сигналы столь малой длительности. Поскольку при работе ESP32 периодически возникают прерывания от подсистемы WiFi, сигнал малой длительности от АЦП легко пропустить. Можно попробовать средствами DMA записывать в массив данные АЦП, и затем искать в нем признак прерывания питания, но до экспериментов дело не дошло. В итоге оказалось гораздо быстрее и проще сделать детектор на отдельном микроконтроллере.

Автор: wolowizard

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js