Продолжение темы создания модулей для домашней автоматизации и “умного дома” на базе недорогих микроконтроллеров.
Ну, прежде всего, что “не так” с моим бойлером? Уже много лет использую дешевый симисторный диммер (фазовый регулятор мощности) для уменьшения потребления бойлером в моменте: мне нет необходимости кипятить его за полтора-два часа, вполне достаточно, если он нагреется за ночь. Плюсы – нет закипания воды возле ТЭНа; сам ТЭН работает в “мягком” режиме, плюс нет нагрузки на проводку и сеть в целом – ресурс в итоге можно использовать для чего-то еще.
Диммер собран в коробке от накладной розетки и с радиатором, содранным с какой-то материнской платы:
Бойлер вполне успешно нагревается за ночь, потребляя какие-нибудь 300 Вт. В случае каких-то “нештатных” ситуаций – приехали гости или при отключениях света – мощность ставится повыше, чтобы быстрее восполнять потребность в воде. Кроме того, все это время бойлер был подключен через старый электросчетчик – несколько лет записывал расход электроэнергии каждый месяц, пока не надоело.
Вот, собственно, все эти моменты и решено было автоматизировать, а заодно и добавить новых. Итак, требования:
- Как и с прошлыми модулями – интеграция в Home Assistant.
- Основной момент: удаленное управление диммером.
- Учет энергии на базе PZEM-004t
- Хорошо бы знать температуру воды в бойлере.
- Раз больше нет ручки резистора на диммере – сделать замену для локального управления мощностью: пару кнопок для увеличения и уменьшения значения.
- Ну и раз такое дело – то и как-то отображать текущий режим мощности. Снова ставить OLED-дисплей – как-то перебор, поэтому решил ограничиться двухцветным светодиодом. В принципе, выводов хватает и на трехцветный.
Для контроля температуры поначалу хотел использовать Dallas’овские DS18B20 в герметичном корпусе, однако, разобрав бойлер, увидел, что запихивать его там просто некуда. Можно было разместить возле фланца на дне – но подумал, что в таком случае датчик будет показывать больше температуру ТЭНа, чем воды. Вспомнил про купленные ранее модули MAX6675 для работы с термопарами – купил их когда-то несколько штук из расчета использования для твердотопливного котла (замер температуры дымохода и так далее). Комплектная термопара габаритная, но модуль вполне успешно работал и с термопарой для мультиметра – их тоже накупил несколько штук. А ее габариты вполне позволяли засунуть ее вместе с термостатом вглубь бойлера. На этом и остановился.
Основным моментом разработки модуля была простая в реализации схема управления диммером с помощью ШИМ. Почему-то в сети не встречаются подобные варианты – есть или с обратной связью и синхронизацией с сетью, или примитивные, где микроконтроллер напрямую дергает симистор и все. Хотя, казалось бы, есть готовая схема диммера, в котором изначально заложена синхронизация, просто модулируй ток заряда RC-цепи ШИМом и все. Но – как-то не попался такой вариант. Начал думать над своим.
Как простейший вариант еще – можно было бы найти какой-то цифровой потенциометр (типа X9C104), управлять им, а его включить в RC-цепь диммера. Но таких резисторов в наличии у меня пока не было. Да и как только что выяснилось, к нему можно прикладывать достаточно невысокое напряжение (для приведенного в примере выше – порядка 5В).
В случае с ШИМом очевидный вариант – управлять входом оптопары с микроконтроллера, а выход включить последовательно с резистором RC-цепи. При 100% цикле имеем полную мощность на диммере, при 0% диммер не работает, а в промежуточных вариантах емкость заряжается пропорционально коэффициенту заполнения у ШИМа. Минус: как выяснилось, у PC817 достаточно низкое максимальное напряжение для выходной части, порядка 35В, а к резистору диммера может прикладываться порядка 300В. Значит, требовалось “усилить” оптопару, добавив высоковольтный транзистор. Оптопара подключается к БЭ-переходу транзистора и он ее защищает от высокого напряжения. Чтобы сохранить прямую пропорцию между ШИМ и режимом работы диммера – надо было добавить еще один каскад-инвертор. Так как на управляющих цепях симистора переменное напряжение – весь этот каскад подключался через диодный мост. В итоге получилась примерно такая схема:
И оно даже как-то работало, но… Резисторы смещения приходилось ставить уже на мегаомы, так как уже ток смещения обеспечивал заряд конденсатора в RC-цепи. Все работало не особо устойчиво и в узком диапазоне, а транзистор требовался на полное сетевое напряжение – еще тогда выдрал его из какого-то дешевого компьютерного БП (под руку попался D5027).
Решил пойти другим путем и ШИМить конденсатор. Измерения показали, что напряжение там находится в пределах 100В, так что и номиналы деталей можно было использовать поменьше. Так как теперь работали в нижнем плече RC-цепи, то инвертор больше не требовался – оптопара управляла напрямую силовым транзистором.
В таком виде оно и попало в финальную конструкцию. На нулевом заполнении выставил подстроечник на диммере так, чтобы нагрузка была выключена, но на грани включения. Потом заменил подстроечник (и стоящий последовательно с ним резистор) на постоянные – вышло около 80 КОм, подбирал из того, что было. По мощности – от 0,5 Вт и выше, в итоге поставил 3х0,5W – к резистору, как уже писал, может прикладываться порядка 300В, так что он немного греется. Собственно, номинал резистора ограничивает регулировку мощности “сверху”. Сильно уменьшать его не стоит: растет ток через него и отсюда – требуемая мощность; кроме того, растет ток через симистор на максимальной мощности – т.е., нужен лучший теплоотвод. В итоге от 1,5 КВт полной мощности бойлера оставил где-то 1,1, а потом еще ограничил в прошивке.
Кнопки и светодиод статуса реализованы в прошивке C’шными вставками через lambda. У светодиода в итоге реализованы такие состояния:
- полностью выключен (0-5%)
- слабый зеленый (5-15%)
- яркий зеленый (15-25%)
- красно-зеленый (25-35%)
- слабый красный (35-50%)
- яркий красный (>50%)
Да, удачно совпало, что ШИМ на разных выводах контроллера не синфазный, поэтому получилось реализовать включение одновременно и красного, и зеленого цвета на двухцветном двухвыводном светодиоде, включенном между выходами контроллера. Хотя в целом, как уже писал, вполне можно было взять RGB-светодиод и занять еще один выход, тогда можно было бы реализовать любые цвета.
Конденсатор между коллектором и эмиттером силового транзистора немного меняет диапазон, служа дополнительным делителем и сглаживая работу транзистора. Можно поиграться с номиналом в диапазоне 0,05-0,5 мкФ (меньше – раньше начало работы диммера).
Еще была мысль добавить DS18b20 для контроля температуры внутри корпуса – все же радиатор прикручен непосредственно к пластику. Но удержался.
В качестве конструкции использовал самый малый из имевшихся корпусов с arduino.ua. Гермовводы для кабеля; “микрофонный” разъем с Aliexpress для подключения термопары; где можно – максимально использовал винтовой крепеж на имевшиеся в корпусе втулки. Традиционно – макетная плата в качестве основы для “мозгового центра”.
Протестировал, после сборки все успешно и с первого раза работало. Уже после сборки доработал прошивку, задав лимиты для максимума ШИМ, а потом и для минимума (тот уплыл после установки максимума).
В целом – все устраивает. У диммера, как это уже замечал ранее, на малых пределах мощность сильно скачет в зависимости от входного напряжения: например, около 300W при 227В и около 200W при 221В. Стоит учитывать; хотя, в некотором роде, делается стабилизация нагрузки на сеть: при просадке бойлер убирает свою и так небольшую нагрузку. Но оптимальный режим по мощности при моих затратах – где-то на уровне 400 Вт.
Да, забыл: веб-сервер в прошивке решил использовать 2-й версии, так как 1-й не может отображать ползунок регулировки мощности.
Update: по непонятным причинам начались ложные срабатывания кнопки увеличения мощности. Добавил в фильтры кнопок “- delayed_on: 30ms
“.