Компьютеризация поливного коллектора

Прошло уже пару лет с момента реализации автополива газона. Таймеры (Aquapulse AP 4014) успешно отработали, хотя внезапно наступившие заморозки весной 2020-го и попортили их, порвав пластик корпусов. Корпуса были заклеены с помощью горячего паяльника и кусочков пластика; не все таймеры получилось нормально заклеить – некоторые начинали травить снова, а пару я заменил целиком. В таком виде оно отработало в 2020-м и 2021-м годах.

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

Краны пришлось ждать весьма долго – сначала заказал немного не те (взял на дюйм, а на поливе стояли 3/4 – но пригодились в конечном счете все), потом разбивал посылку на несколько, чтобы уложиться в таможенный лимит. При заказе кранов случайно заказал не те, что в обзоре, а похожие – CWX-15, не обратив сначала внимание на различия, а только на цену. 15-я модель была без возможности ручного управления краном, но что-то менять было уже поздно. В вариантах при заказе крана были версии на 5/12/24В, а также с различными вариантами связи с внешним миром – двух- и трехпроводным, с автозакрытием и с выводом концевых выключателей “наружу”. Так как предпочтений на тот момент не было, заказал такие же, как в обзоре – двухпроводный вариант на 12В – для управления краном нужно было менять полярность приложенного напряжения.

С кранами вырисовалась следующая схема: 5 вместо таймеров, 1 общий на весь коллектор, 1 на отсечку воды сразу после первого гидроаккумулятора (до фильтров) и напрашивался еще один кран – его я поставил после фильтров и второго гидроаккумулятора на трубе, которая идет непосредственно в дом.

8 кранов требовали в идеале 16 каналов управления (чтобы не использовать инвертор между плечами мостов), плюс планировался дисплей для отображения статуса и кнопки управления. Такого числа линий не было ни у какого микроконтроллера под руками, поэтому было решено смотреть в сторону i2c-плат – а с ними уже можно было воспользоваться привычным ESP-01. На ту же шину можно было посадить и клавиатуру, и уже имевшиеся в наличии OLED-дисплеи.

Из подходящих интерфейсов для управления сходу попался вот такой контроллер на PCA9685. 16 ШИМ-каналов, i2c – то, что надо. Клавиатуры пока не было подходящей, а на arduino.ua модуль на 16 каналов был временно недоступен; с дисплеем идея мне нравилась все меньше и было решено использовать двухцветные светодиоды – поэтому сделал очередной заказ на Aliexpress, а пока собрал контроллер из того, что было на тот момент.

Использование ESP-01 накладывало определенные ограничения – i2c не числился среди доступных выводов, а задавать номера пинов для Wire я научился позже (и на момент написания этого текста до сих пор не уверен, что любая произвольная библиотека обращалась бы к порту i2c через Wire). Из подходящих библиотек в итоге была выбрана PCA9685_RT – она была в репозитории, логика работы была доступно расписана и для библиотеки можно было задать произвольные пины для подключения контроллера. Ждать не хотелось и контроллер был заказан по месту на arduino.ua.

Движок сервопривода при работе потреблял около 30-40 мА (при пуске, понятное дело, больше), плюс требовалось 12В (сам такие краны выбрал, да. Ну, на деле высокое напряжение – плюс, так как электронику хотелось разместить на удалении от кранов). Контроллер умел максимум 6В, так что требовался драйвер, принимающий сигналы от ШИМ-контроллера и управляющий кранами. В итоге были сделаны такие сборки:

Мосты собирались из того, что было, все номиналы – “на глаз”. Местами использовались КТ814, местами – КТ816. Провода планировалось сначала паять, потом вовремя вспомнил про заказанные по ошибке малогабаритные разъемы с лифтовым зажимом, начал ставить где можно их. Вторую плату сделал с оглядкой на первую и сходу делал ее из расчета установки разъемов. Глядя на то, что в итоге получилось, еще немного переделал первую, добавив недостающие разъемы и убрав лишние перемычки.

Для возможности отключать контроллер решил поискать подходящий разъем и выбор пал на LPT-порт со старой материнки. Покромсав его бокорезами, впаял на макетную плату, сдвинув один ряд выводов (штатно выводы идут “змейкой”). На ту же плату пристроил ШИМ-контроллер, использовав некоторые его земляные выводы в качестве крепежа; там же разместил и разъем под ESP-01 и стабилизатор (использовал купленный ранее AMS1117 на 3.3В с обвязкой в виде пары конденсаторов) для нее и ШИМ-контроллера.

В итоге все впритык уместилось в одном из корпусов с того же arduino.ua:

В качестве основы для прошивки сначала был использован проект управления вытяжкой Cata с увеличенным до нужного числом блоков, а также дополнениями для работы с ШИМ-контроллером и сервисными функциями. Получился жуткий говнокод, но первый месяц оно отработало именно в таком виде. По сервисным функциям – было решено добавить обслуживание крана для защиты от закисания в виде одного внешнего вызова. Иначе говоря, при вызове определенной страницы кран менял свое положение на противоположное и через короткое время возвращался обратно.

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

Тем временем приехали заказанные компоненты и я начал переделывать прошивку под новый вариант. Плата клавиатуры на TTP229 была рассчитана не под кнопки, а под сенсорное касание и успешно срабатывала как при подаче нуля на пин, так и “+”. Не сильно удобно, но в итоге получилось сделать такую конструкцию:

Кнопка просто замыкает сенсорный пин на общий. Для лучшей помехозащищенности в коде предусмотрел срабатывание только при удержании кнопки больше 2 сек. Попутно код был переписан с использованием массивов, что заметно его уменьшило и улучшило читаемость (хотя еще есть, куда двигаться, но лучшее – враг хорошего 🙂 ). Попутно нашел руководство о том, как сменить пины для общения с i2c-устройством для Wire – библиотеки для работы с данными устройствами (и еще одно). В теории теперь для PCA9685 адрес можно и не указывать, но решил уже ничего не менять, а вот для клавиатуры это пригодилось.

Двухцветные светодиоды никаких доработок не требовали и просто подключались параллельно сервокранам через токоограничительный резистор.

Итоговая конструкция:

На сейчас все управление идет с внешнего хоста – в crontab прописаны команды, дергающие нужные странички на контроллере и открывающие/закрывающие нужные краны. В дальнейшем есть планы добавить встроенный таймер для большей автономности контроллера.

Код проекта

Update: Добавил все необходимое для реализации таймера. Время забирается с Интернета через NTP; есть страница настроек, где можно задать часовой пояс (DST не реализовывал), число правил таймера, а также SSID и пароль для 3-й Wifi-точки. На странице таймера есть возможность включить/выключить правило; выбрать нужный кран, задать время срабатывания таймера и необходимое действие (открыть/закрыть/сервис). Максимальное количество правил ограничил 45-ю, выше – надо менять логику отдачи HTML-страницы, не хватает памяти. Еще немного причесал код, активнее используются циклы и массивы. Потенциально, раз уж есть наработки по обработке передаваемых на сервер параметров – можно было бы реализовать действия в рамках одной страницы с номером крана и действием в качестве ее параметров. В общем, есть, куда двигаться, но на пока так. В коде оставил ссылку на тред по преобразованию string в char – вообще пока не понимаю этот момент, но “неправильный” итоговый ответ так или иначе работает как там, так и у меня. Прокачаю скиллы кодинга на С – станет яснее.

Вторая версия – с таймером

3 мысли о “Компьютеризация поливного коллектора”

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