Декомпьютеризация насосной, часть 1

Да, именно так. Продолжение-ответ на этот пост.

В последние годы начал понемногу использовать микроконтроллеры в домашних самоделках, поэтому давно уже была мысль, что малинка в “компьютере для управления насосом” – как-то перебор. Кроме того, она так и не была до конца доделана – я там так и не сделал веб-интерфейс, а доступен был только SSH и CLI. Один раз побилась ФС и я не мог залогиниться. Одна из схем детектора наличия сети вылетела в грозу, а термодатчик спонтанно умер в какой-то другой момент времени. Единственный плюс – это все же полноценный хост со всеми сопутствующими возможностями: например, там есть cron, в котором у меня прописаны команды управления подсветкой и переключением реле – но в целом это решаемо.

Еще одним минусом текущего сетапа было то, что все провода сходились к центральному узлу и “малинка” от главного щитка была немного далеко. С более дешевыми контроллерами это решалось проще и можно было сделать 2 независимых модуля – один для бассейна, а один для насоса.

Кроме того, у меня уже довольно давно была открыта в браузере вкладка с https://web.esphome.io – тогда поверхностно прочитал про ESP Home, но меня больше увлекла идея того, что достаточно просто подключить ESP к компьютеру, ткнуть в браузере кнопку и получить заготовку для “умного дома”. В итоге, когда наконец-то нашлось время для всего этого, решил развиваться именно в этом направлении.

Все оказалось весьма просто и удобно. Есть Home Assistant – проект по управлению умным домом. Он может иметь дело с самыми разными источниками данных; создавать схемы по взаимодействию различных исполнительных устройств и так далее. ESP Home позволяет легко создавать на базе ESP8266 или ESP32, которые интегрируются в Home Assistant. Функции описываются небольшими секциями в конфиг-файле, а дальше движок собирает прошивку и загружает ее в ESP. Т.е., не нужно каждый раз с нуля создавать весь код для микроконтроллера; кое-что – например, работа с wifi или OTA-обновления – тут идут в дефолтной заготовке. А дальше буквально в пару строк можно добавить поддержку веб-интерфейса, работу с кнопкой или реле, термодатчики и вообще все, что только можно придумать. Да, код может быть будет не такой компактный, как если бы писался полностью “под себя”, но если все равно планируется использовать “жирный” контроллер и ресурсов хватает, то можно основательно сэкономить время. Думаю, на самостоятельное написание прошивки того устройства, которому посвящен этот пост, я бы решался еще долго.

Прежде всего – подготовил хост – базу под Home Assistant и ESP Home. Процесс установки подробно описан в официальных руководствах:

Для автостарта создаем 2 файла-сервиса для systemd:

/etc/systemd/system/hass.service

[Unit]
Description=esphome
After=network.target

[Service]
Type=simple
User=homeassistant
WorkingDirectory=/srv/homeassistant
ExecStart=/srv/homeassistant/bin/python /srv/homeassistant/bin/hass
RestartSec=30
Restart=on-failure
Environment=”PATH=/srv/homeassistant/bin:/usr/local/sbin:/usr/local/bin:/usr/bin”

[Install]
WantedBy=multi-user.target

[свернуть]

и

/etc/systemd/system/esphome.service

[Unit]
Description=esphome
After=network.target

[Service]
Type=simple
User=esphome
WorkingDirectory=/srv/esphome
ExecStart=/srv/esphome/venv/bin/python /srv/esphome/venv/bin/esphome config/ dashboard
RestartSec=30
Restart=on-failure
Environment=”PATH=/srv/esphome/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/bin”

[Install]
WantedBy=multi-user.target

[свернуть]

Включаем/стартуем.

Далее в Home Assistant добавляем модуль для работы ESP Home, указывая наш инстанс.

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

  • У меня не получилось реализовать схему “3 измерителя на ESP-01” в варианте с общим RX для всех измерителей. Сейчас уже сложно вспоминать все подробности (хотя прошло не так уж много времени – но сильно много событий), но вроде ругань была на invalid modbus frame или что-то в этом роде.
  • На базе ESP32 C3 super mini, которые я заказываю в последнее время в больших количествах (маленькие, дешевые и современные – вполне годная замена для ESP-01. С оговорками), реализовать подключение трех PZEM-004t тоже не вышло: сказалось ограничение софта. “Внутри” использовались только аппаратные UART’ы, software serial  для текущей версии ESP Home для ESP32 не разрешен – а аппаратных в данном случае было только 2. При использовании 2 измерителей – все было прекрасно.
  • В итоге все успешно запустилось на ESP-12 – это esp8266, так что тут был software serial, а в самом ESP-12 достаточно выводов, чтобы подключить все необходимое.

Собственно, вполне реально заменить мою самодельную прошивку на ESP Home (у меня в большинстве случаев используется ESP-12, так что проблем быть не должно), измерители в таком случае будут Home Assistant-совместимые, что откроет дополнительные возможности. Плюсом такой реализации будет еще и встроенный кэш данных. В моей прошивке запрос данных через веб-интерфейс провоцирует опрос измерителей, что дает задержку. В случае с прошивкой от ESP Home те опрашиваются циклически, а результаты помещаются в буфер. Зато получить их потом можно мгновенно.

Впрочем, на данный момент пока нет планов такой переделки – да и придется попутно переписать некоторые скрипты, которые на сейчас собирают статистику.

А вот сборкой модуля для бассейна я решил заняться плотно. Хотелось разделить функции малинки на 2 блока и прежде всего собрать то, что касается фильтра и освещения. Работа с скважинным насосом будет позже и этой теме будет посвящена вторая часть.

Итак, что требовалось:

  • Переключение фильтра между таймером и ручным режимом.
  • Включение/выключение в ручном режиме.
  • Включение/выключение света.
  • Управление этими функциями локально с панели прибора.
  • Управление через веб-интерфейс.
  • Измерение температуры в помещении – а потом решил добавить замер температуры воды контура фильтра. Она актуальна только во время работы фильтра, но делая устройство – было бы глупо не реализовать.
  • Наличие дисплея для отображения текущего состояния. Под это решил приспособить давно купленные SSD1306 с разрешением 128х32.
  • Контроль находящегося рядом вольтметра Zubr 3F – т.е., состояние фаз (уровень напряжения и наличие всех фаз).
  • Контроль состояния двигателя фильтра – наличие на нем напряжения и тока через обмотку (хотя бы по одной фазе – фильтр трехфазный).
  • Подбирая модули реле, в последний момент решил добавить еще один канал (благо, у микроконтроллера еще были свободные выводы) для управление насосом противотока. Физически управление рядом, реализовать несложно, зато потом можно легко сделать управление со смартфона или другого модуля – например, по команде с радиокнопки.

Собственно, код проекта

Пароли и ключи на всякий случай убрал. Из особенностей:

  • Сделал заготовку под подключение к двум сетям – домовой и той, что будет в точке назначения.
  • Добавил кнопку перезагрузки и счетчик аптайма – хотя бы поначалу так проще дебажить проблемы.
  • Для простоты решил использовать Google Fonts – это позволило не раскладывать нужные файлы шрифтов в определенных каталогах, а платформа скачает нужное прямо во время компиляции прошивки.
  • Для i2c указал “frequency: 800kHz” – это убрало ругань в логах на отсутствие реакции устройства за отведенное время.
  • Для Dallas’овских датчиков, несмотря на рекомендации, все же решил использовать индексы, так как у меня нет заготовленных датчиков, адреса которых я буду знать до загрузки прошивки.
  • PZEM в итоге использовал 3-й версии. Да, у меня осталось несколько вроде как рабочих v1, но при быстром тесте уже в процессе сборки я так и не получил от них ответа – не знаю, возможно, требуется модификация под 3.3V, а может они просто нерабочие. Мне как раз приехала партия v3 с Ali, поэтому решил не заморачиваться и ставить их.
  • Первоначально был план использовать обычные релейные модули. Потом вспомнил про залипание контактов при включении подсветки бассейна и вспомнил про купленные когда-то модули на SSR. Решил использовать их – для начала хотя бы частично (там, где контакты работали только на замыкание – для света и включения насоса в ручном режиме). Однако поразмыслив, решил, что вполне можно использовать SSR и для переключения режимов, а логику реализовать программно. В итоге на сейчас попытки включить насос, который находится в режиме работы через таймер, ни к чему не приводят (кстати, баг: HA позволяет передвинуть ползунок выключателя в On, модуль при этом возвращается в Off, но HA этого не видит). В итоге в качестве исполнительного устройства поставил модуль на 4 реле – в этот момент и пришла в голову идея насчет противотока.
  • Управление кнопками делается либо короткими нажатиями, либо удержанием на пару секунд.
  • Модуль для обнаружения фазы думал использовать с Али, но, во-первых, тот еще едет, а во-вторых, под него просто не было бы места в корпусе. В итоге собрал аналог.
  • PZEM-004t пришлось обрезать с двух сторон, чтобы он влез в корпус. С той стороны, где UART – вдоль сигнальной дорожки. А вот с силовой стороны пришлось выпаять разъем и отрезать на плате в том числе некоторые дорожки и монтажные точки.
  • С дисплеем все оказалось довольно просто: объявляем шрифты (решил ограничить количество доступных символов), дальше рисуем области данных. В данном случае без страниц или чего-то такого – просто 4 области, где выводится температура, состояние света и фильтра. При рисовании объекта за пределами разрешения экрана объект не отображается – попался на этом поначалу.

Схема:

Питание для контроллера и для периферии решил сделать раздельным, хотя на макетке все питалось напрямую от стабилизатора на ESP’шке. Однако длина линии одного из датчиков температуры будет несколько метров вдоль силовых кабелей, поэтому не хочется, чтобы на шину питания что-то ловилось.

Однако без глюков не обошлось еще на этапе сборки. Конструктивно все собрано в пластиковом модуле на 4 места под DIN-рейку с arduino.ua. Все получилось очень плотно. Корпус реле буквально на несколько мм не влазил – пришлось подпилить реле (да, все равно успешно работают). “Мозг” системы собран на макетной плате, там распаян индикатор, разъем для ESP, а рядом – малогабаритный блок питания. И вот тут и начались проблемы – блок создавал такую помеху на контроллер, что начинали нажиматься кнопки, а контроллер иногда перезагружался. Пришлось убрать БП с макетки и перенести на нижний этаж, рядом с свободным местом возле одного из реле.

На момент написания еще не тестировал блок в щитке, но в “домашних” условиях глюки пропали – модуль вполне успешно отработал ночь.

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

Дополнительная плата сделана из подходящей макетки; на ней распаян клеммник, схема контроля фазы, разъемы коммутации, а также PZEM. Последний припаял за дорожку, идущую вдоль торца платы, к макетке. UART-разъем сильно мешал закрытию верхней крышки, но удалось выгнуть его так, что все вместилось – честно говоря, уже думал переносить его на тыльную сторону платы. Резисторы по 15 КОм – 7 штук просто потому, что надо было набрать нужную мощность (от 1 Вт), а других номиналов особо не было. Конденсатор сначала припаял ко входу оптопары, но емкости в 22 мкФ оказалось маловато. В итоге перепаял на выход – теперь даже с избытком – хватило бы 10. Надеюсь, накопленный заряд при открытии оптопары не повредит ее.

Из “скрытых” возможностей – добавил на кнопку управления светом управление противотоком при удержании кнопки. Пусть будет, вдруг пригодится. Еще есть мысли – добавить на экран отображение состояния wifi-подключения.

Update: поставил модуль в работу, все прекрасно завелось.

Схема в щитке:

Соответственно, трансформатор тока стоит уже непосредственно на проводе, идущем к двигателю фильтра, а вход фазы PZEM’а – между автоматом и пускателем фильтра.

Общий вид:

7 мыслей о “Декомпьютеризация насосной, часть 1”

Добавить комментарий