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

Краткая предыстория

Идея появилась после покупки китайской светодиодной люстры, которой можно управлять с помощью радиопульта - включать, изменять яркость и цветовую температуру. Дома уже функционировал 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 записывать в массив данные АЦП, и затем искать в нем признак прерывания питания, но до экспериментов дело не дошло. В итоге оказалось гораздо быстрее и проще сделать детектор на отдельном микроконтроллере.

Комментарии (22)


  1. shadovv76
    02.12.2024 05:10

    Хороший проект. У меня такой же стиль (на макетках). Решал эту проблему своим путем https://habr.com/p/530588/ "Удобное DIY управление светом без изменения существующей проводки". В идее передачи сигнала по питающим проводам есть фундаментальная проблема - питание может кратковременно пропадать/проседать и просто так. Бывало вернешься с викенда в квартиру, а свет горит. Спустя 9 лет уже отказался от этой схемы вопреки протестам домочадцев (схема работала и не требовала инженера в доме для своего обслуживания) в пользу унификации решений на зигби с использованием конденсатора в люстре. Теперь без меня ничего само не починится :( Вам удачи!


    1. wolowizard Автор
      02.12.2024 05:10

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


  1. BadDancer
    02.12.2024 05:10

    Решение классное! Но, кмк, малость не безопасное. Не выключать же автомат каждый раз, как захочешь поменять лампочку в люстре? Хотя у Вас же светодиодная люстра...


  1. ArtemSmit
    02.12.2024 05:10

    Зачем так усложнять? Реле ZigBee без нуля сделает все то же самое


    1. wolowizard Автор
      02.12.2024 05:10

      реле может только включать/выключать свет, хотелось реализовать "искусственный рассвет" с плавным нарастанием яркости


      1. ArtemSmit
        02.12.2024 05:10

        Пожалуйста, есть диммируемые реле, 1100 на озоне


        1. Fedor0804
          02.12.2024 05:10

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


  1. mariana123
    02.12.2024 05:10

    А если была бы возможность предусмотреть изначально управление люстрой через умный дом, то с какой проводкой это удобнее делать?


    1. wolowizard Автор
      02.12.2024 05:10

      проще всего было бы дополнительно к цепи с выключателями предусмотреть отдельную линию для постоянного питания люстры


    1. ArtemSmit
      02.12.2024 05:10

      Раскладывать проводку шлейфом с выводом в щиток каждой группы освещения отдельно. В щитке ставить уже реле на din-рейку. К выключателям тянуть витую пару. Одного кабеля хватит чтоб развести 7 выключателей в комнате. Это если провода закладывать, можно беспроводные выключатели, но придётся периодически батарейки менять. Это если на этапе ремонта. Если на данный момент денег нет - ложить проводку с выводом нуля в подрозетник выключателя, это позволит в дальнейшем что-то сделать без лишних проблем. По собственным граблям шёл к умному дому, получилось довольно бюджетно и функционально.


      1. CheBurashka
        02.12.2024 05:10

        если витуху к выключателям, то, я так полагаю, что вернуться к классической схеме выключателей без всяких реле уже не получится?


  1. IgorMaster
    02.12.2024 05:10

    Вариантов проложить километры проводов с ремонтом и кучей денег - очень много. А вот с существующей двухпроводной и красивым техрешением... - вот прочел сейчас и порадовался! Решение по вашему ТЗ правильное, беру в копилку. Ну и моя мысля, вместо расчета длительности переключения добавить емкость, для уборки логических нолей при переходе синусоиды через ноль и ловить ноль при разряде ёмкости при переключении...


    1. wolowizard Автор
      02.12.2024 05:10

      с этого все и начиналось ) У меня не получилось отладить чисто аналоговый вариант системы с емкостью для определения перехода через ноль. Дело в том, что момент переключения может совпасть с моментом перехода через ноль - детектор не сработает. При слишком маленьком значении емкости были ложные срабатывания от наводок. Во время экспериментов на стенде в варианте с емкостью система работала, но процент срабатывания был процентов 80...90. В продакшн такое нельзя, когда механический выключатель не срабатывает с первого раза - раздражает страшно. После этого и появилась идея смотреть значение сигнала на входе с помощью АЦП


  1. VT100
    02.12.2024 05:10

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

    Используя резистор достаточного сопротивления (условно - от 470 кОм) - можно ловить переход через ноль и без развязки. См. app. note AVR182 фирмы Atmel и tech. brief TB3138 фирмы Microchip.


    1. wolowizard Автор
      02.12.2024 05:10

      знакомый документ ) Первые эксперименты были как раз по схеме оттуда с подачей сигнала на вход прерывания, но потом вариант со входом АЦП и опторазвязкой показался надежнее и безопаснее


  1. Iv38
    02.12.2024 05:10

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

    WirenBoard в своих релейных модулях просто предусмотрела аварийный режим, когда потеря связи с головным устройством может переводить реле на прямое управление от выключателя. Но производители zigbee-выключателей до внедрения подобного фолбэка почему-то не дошли.

    Но ваше решение интересное и имеет свои преимущества.


  1. ptr128
    02.12.2024 05:10

    Потоковый ADC через DMA на ESP-32 отлично работает. Я использовал это для измерения True RMS напряжения и тока. По 10К SPS вполне хватало.


  1. Cuberbiller
    02.12.2024 05:10

    Детектор прерывания питания реализован на отдельном микроконтроллере

    Скажите, а почему не применили простейший T-триггер на дискретной логике (например, К561ТМ2) ?


    1. wolowizard Автор
      02.12.2024 05:10

      не совсем понимаю, а как можно измерить длительность импульса триггером?


      1. Cuberbiller
        02.12.2024 05:10

        Измерить никак. А зафиксировать сам факт импульса легко. Сетевые 100Гц фильтруются при этом конденсатором.


        1. wolowizard Автор
          02.12.2024 05:10

          выше отвечал на похожий вопрос. С конденсатором не получилось, ненадежно работало


  1. exidler
    02.12.2024 05:10

    Подскажите, а не проще было отказаться совсем от ADC, и использовать логический вход, и прерывания на его изменения? Отслеживая просто длительность нуля/единицы.

    Тогда без проблем можно завести напрямую на ESP32