Найти тему

Автополив. Часть 3. Прошивка

Оглавление

Добрый день, уважаемый читатель!

Продолжаю серию статей об автомате для полива растений с удаленным контролем и управлением. Все статьи цикла:

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

Прошивка для данного автомата создана на базе фреймворка ESP-IDF в PlatformIO IDE, и она полностью открытая – вы можете просмотреть или скачать её по следующей ссылке: github.com/kotyara12/dzen_autowatering. Можно использовать данную прошивку и в Espressif IDE (с некоторыми переделками), но вот в Arduino IDE собрать её не получится.

Подопытный
Подопытный

Функциональность прошивки

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

Устройство стабильно работает без доступа в интернет, но для удаленной настройки, переключения режимов и контроля, интернет все-таки необходим. Удаленное управление осуществляется посредством широко известного протокола MQTT. Для оповещения пользователя о внештатных ситуациях предусмотрены оповещения в telegram.

Для управления поливом используется два значения – порог включения полива и порог отключения. Разумеется, порог выключения должен быть несколько выше порога включения, дабы устройство не переходило в автоколебательный режим. Далее, поскольку распространение влаги в почве – весьма и весьма инерционный процесс, можно легко доставить к растению слишком много воды, и получить “болото”, прежде чем датчик влажности успеет “почувствовать” это. Поэтому в прошивке предусмотрен “импульсный” режим работы – то есть насос при поливе включается не непрерывно, а циклично – например насос работает 15 секунд, затем следует пауза 5 минут (насос выключен). Это время необходимо, чтобы поступившая порция влаги успела равномерно распределиться по объему почвы.

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

Подготовка к работе

Прежде чем приступить к работе, нам понадобятся некоторые файлы и сведения. В тексте ниже часто встречаются ссылки, которые ведут либо на GitHub, либо на другие статьи, расположенные на данном сайте. Они могут понадобиться вам для разъяснения, как выполнить тот или иной этап работы. Итак.

1. Для работы вам понадобится PlatformIO с установленной платформой Espressif 32. Если данная IDE у вас еще не установлена, то можете почитать следующие статьи: “Установка PlatformIO” и “Переползаем на PlatformIO“.

2. Скачайте исходный код проекта с GitHub-а по ссылке: github.com/kotyara12/dzen_autowatering.

-2

Распакуйте его в каталог C:\Projects\PlatformIO. То есть у вас должен получиться следующий путь: C:\Projects\PlatformIO\dzen_autowatering. Да, можно использовать другой путь к проекту, но тогда вам понадобится самостоятельно изменить некоторые настройки в нескольких файлах проекта – если вы не уверены в своих силах, то лучше не изменять это.

3. Внутри папки с проектом вы найдете zip-архив с библиотеками прошивки, например libs_local_20240303.zip. Распакуйте его также в вышеупомянутый каталог C:\Projects\PlatformIO. То есть у вас должен появится еще один подкаталог: C:\Projects\PlatformIO\libs, внутри которого будет еще несколько подкаталогов.

4. Откройте проект C:\Projects\PlatformIO\dzen_autowatering в Visual Studio Code и попробуйте его скомпилировать. Если вы до этого сделали все правильно – то проект будет успешно скомпилирован. Но заливать его в микроконтроллер ещё рано.

5. Подготовьте данные для подключения к WiFi-сети (или сетям) – имя SSID и пароль. Сеть может быть скрытая (без трансляции SSID), но ESP32 классической линейки поддерживает только 2,4 GHz. Всего в прошивке можно указать до пяти WiFi-сетей, при этом прошивка сама выберет актуальную в данный момент сеть (с небольшой задержкой).

6. Выберите любой из облачных MQTT-брокеров, который вы будете использовать для удаленного управления устройством. Также вполне можно использовать и локальный брокер – например на роутере или сервере Home Assistant. В итоге вы должны подготовить параметры подключения устройства к брокеру: имя или адрес MQTT сервера, порт, логин и пароль.

7. Если вы планируете использовать Telegram-уведомления, необходимо создать учетную запись бота и выполнить соответствующие настройки. Вы должны подготовить следующие данные: токен бота и идентификаторы чатов, куда отправлять сообщения.

8. Если вы планируете отправлять данные с устройства на сторонние сервисы,  то вам понадобятся соответствующие учетные данные – например код и токен доступа. Облачные сервисы могут понадобится, дабы накапливать данные измерений где-то в облаке, а затем просматривать их в виде графиков. На момент написания статьи поддерживаются три сервиса:

Но, в принципе, и без этого можно легко пользоваться устройством. А можно подключить его к Home Assisatnt через MQTT-брокер, и тогда уже HA будет накапливать данные и отображать их. Если оно у вас есть, конечно.

Всё готово? Приступаем к настройкам.

Настройка проекта

Практически все “общие” настройки проекта хранятся в файле project_config.h, который вы найдете в папке include проекта. Некоторые “прикладные” настройки, то есть связанные непосредственно с поливом, можно найти в файле watering.h, который находится в папке lib\watering. И вообще, весь прикладной код полива расположен там же, в этой же самой папке lib\watering.

Аналоговые входы “зарезервированы” для китайских емкостных датчиков с аналоговым выходом, но на текущий момент в проекте фактически не используются.

Общие параметры

Начнем с общих настроек. Что значит “общих”? Это значит, что состав этих параметров практически не меняется от проекта к проекту. Про данный файл я немного как-то рассказывал в другой статье, а здесь стоит упомянуть лишь то, что все параметры объявлены в нем в виде макросов препроцессора компилятора. Итак, открываем файл project_config.h и приступаем…

1. Вначале проверьте используемые в проекте GPIO микроконтроллера. Если вы собрали схему в точности как у меня, ничего менять не потребуется. Иначе, возможно, что-то придется и подкорректировать.

Скопировать можно тут: https://kotyara12.ru/iot/watering_03/
Скопировать можно тут: https://kotyara12.ru/iot/watering_03/

2. Как и следовало ожидать, после GPIO первым делом настроим параметры подключения к WiFi-сети. Или сетям. Найдите секцию Wifi networks (в файле по умолчанию это строки 158-167):

-4

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

Зачем нужно несколько сетей? Чтобы не перепрограммировать устройство при его перемещении от одного роутера к другому. Например вы собрали устройство в городской квартире, настроили и отладили. Затем, как и положено, отвезли его на дачу – а там другая WiFi – сеть. Чтобы не перепрошивать устройство, можно сразу же зашить в него все возможные варианты. Конечно, можно счесть это как костыль, но поскольку я сознательно избегаю локальных web-интерфейсов, то это самый приемлемый вариант переключения между сетями. Кроме того, я всегда добавляю “аварийную сеть”, раздаваемую со смартфона на случай выхода из строя роутера, например. Устройство запоминает последнюю “рабочую” сеть и по умолчанию подключается именно к ней.

Если вам не нужны несколько сетей – имеет смысл сделать так:

-5

3. Далее настраиваем параметры подключения к MQTT-брокеру. MQTT-сервер это на данный момент единственный “официальный” канал управления и контроля за устройством. Нам понадобятся:

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

Ищем секцию MQTT broker. Здесь можно настроить одновременно два брокера – основной и резервный. В качестве основного я обычно использую локальный брокер на роутере, в качестве резервного – облачный. Если вам не нужны два – настройте только CONFIG_MQTT1_. Следует в первую очередь обратить внимание на выделенные строки.

-6

Пройдемся по параметрам подробнее.

  • CONFIG_MQTT1_TYPE определяет тип сервера :: 0 – публичный, 1 – локальный, 2 – шлюз wifi-сети (в этом случае параметр CONFIG_MQTT1_HOST не используется, а вместо него используется IP-адрес вашего роутера).
  • CONFIG_MQTT1_HOST – имя или IP-адрес сервера
  • CONFIG_MQTT1_PING_CHECK – использовать проверку доступности сервера с помощью ping-а. Имеет смысл только в случае, если у вас настроено два подключения (в этом случае устройство сможет автоматически переключаться между ними еще до возникновения проблем с передачей данных).
  • CONFIG_MQTT1_PORT_TCP – порт подключения для открытых соединений
  • CONFIG_MQTT1_PORT_TLS – порт подключения для защищенных соединений
  • CONFIG_MQTT1_USERNAME – логин пользователя
  • CONFIG_MQTT1_PASSWORD – пароль пользователя
  • CONFIG_MQTT1_TLS_ENABLED – использовать ли защищенное соединение при подключении к данному брокеру или нет
  • CONFIG_MQTT1_TLS_STORAGE – место хранения TLS-сертификата. Подробнее об этом читайте здесь. В данном случае используется хранилище по умолчанию. Лучше не трогать этот параметр, если  вы не уверены, как это работает. Как и следующие два параметра, начинающиеся с CONFIG_MQTT1_TLS_PEM_.
  • CONFIG_MQTT1_CLEAN_SESSION – чистая сессия MQTT-брокера. Это означает что при обрыве соединения с брокером, клиенту придется заново возобновить все подписки. Логика работы прошивки рассчитана именно на этот режим работы, поэтому не изменяйте данный параметр без особой необходимости.
  • CONFIG_MQTT1_AUTO_RECONNECT – использовать автоматическое переподключение к брокеру в случае обрыва соединения. Не изменяйте данный параметр без особой необходимости.
  • CONFIG_MQTT1_KEEP_ALIVE – интервал проверки соединения с сервером в секундах. Если по истечении данного времени сервер не ответил на пинг, соединение считается разорванным. Не изменяйте данный параметр без особой необходимости.
  • CONFIG_MQTT1_TIMEOUT и CONFIG_MQTT1_RECONNECT – таймауты передачи данных и подключения к серверу в миллисекундах. Не изменяйте данный параметр без особой необходимости.
  • CONFIG_MQTT1_CLIENTID – идентификатор клиента. Следует внимательно следить за уникальностью данного идентификатора, чтобы от не “перекликался” с другими вашими устройствами на одном и том же сервере.
  • CONFIG_MQTT1_PUB_PREFIX и CONFIG_MQTT1_LOC_PREFIX – префикс, добавляемый в начало каждого топика для локальных и публичных топиков. Если ваш сервер не требует этого, закомментируйте эти макросы.
  • CONFIG_MQTT1_PUB_LOCATION и CONFIG_MQTT1_LOC_LOCATION – начальная часть топика, отвечающая за расположение устройства. Например home или village.
  • CONFIG_MQTT1_PUB_DEVICE и CONFIG_MQTT1_LOC_DEVICE – часть топика, отвечающая за название устройства. В данном случае это watering1. Почему 1? Потому что таких поливалок может быть несколько – по одной на подоконник.

Для публичного (резервного брокера настройки могут выглядеть примерно так:

-7

Ну разумеется, вам потребуется настроить все это по своему вкусу. Вам не нужны два сервера? – Удаляете ненужную секцию и не забудьте проверить, чтобы имя всех параметров начиналось с CONFIG_MQTT1.

4. Настройте Telegram-бота. Для этого находим соответствующую секцию в том же самом файле.

-8

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

Если вы не намерены использовать телегу, отключите её с помощью #define CONFIG_TELEGRAM_ENABLE 0.

5. Настраиваем передачу данных на сторонние сервисы по HTTPS. Об данных сервисах я подробнее рассказывал здесь. По умолчанию в прошивке настроена передача данных на Open Monitoring:

-9

Кроме данных с сенсоров, на этот сервис передаются и служебные данные о работе устройства. Параметры основного контроллера у меня выглядят как в примере ниже. Если вы не планируете ничего менять в коде прошивки – создайте подобный набор параметров (имена могут отличаться, главное – порядок и тип INT или FLOAT).

-10

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

-11

6. Выбираем режим протоколирования. Найдите строчку #define CONFIG_RLOG_PROJECT_LEVEL. По умолчанию в ней выбрано RLOG_LEVEL_DEBUG, то есть в UART выводятся все сообщения, вплоть до отладочных. Вы можете ограничить их уровнем RLOG_LEVEL_INFO или RLOG_LEVEL_ERROR, например. А можно вообще отключить с помощью RLOG_LEVEL_NONE – ведь когда устройство собрано и успешно работает – их все равно никто не видит и не читает.

Кроме описанных выше параметров, существует огромное количество параметров, которые одновременно применяются для всех проектов, собранных на базе моих библиотек. Найти их вы можете в файлах, которые расположены в каталоге c:\Projects\PlatformIO\libs\consts\. Можете попробовать что-то изменить по вашему вкусу и потребностям. Например в def_tg_messages.h вы можете изменить шаблоны различных сообщений, отправляемых в telegram.

Прикладные параметры

Прикладные параметры расположены в файле watering.h. Что здесь можно изменить?

1. Режим работы UART-RS485 преобразователя:

-12

2. Режимы мигания светодиода полива в разных режимах работы:

-13

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

Как изменить тип подключенных сенсоров

Прошивка была разработана исходя из следующих сенсоров:

  • Для измерения влажности и температуры почвы используется сенсор CWT-Soil-TH-S.
  • Для измерения температуры и влажности воздуха в комнате с растениями (или в теплице, например) используется сенсор SHT20 в пластиковом корпусе.
  • Для измерения температуры радиатора отопления используется самый обычный всенародно любимый сенсор DS18B20.

Вы вправе изменить это по своему усмотрению. Как это сделать – я рассказывал в другом цикле статей, но суть от этого не меняется. Стоит отметить только, что если вы желаете заменить сенсор влажности на китайский емкостный, то я советую вам обратить внимание на вот это драйвер: github.com/kotyara12/reSensors/tree/master/reMoisture. Затем вам потребуется изменить код соответствующим образом. Но я не советую вам этого делать – емкостные сенсоры хоть и дешевы, но геморроя с ними достаточно.

После того, как всё настроено – проверяем еще раз и компилируем. В случае успеха – заливаем созданную прошивку в ESP32 и ждем приветственное сообщение в Telegram.

MQTT – топики

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

  • топики управления %location%/%device%/config/... – в данные топики вы отправляете нужные вам параметры и команды
  • топики подтверждения %location%/%device%/confirm/... – в эти топики устройство возвращает вам реальные значения, применяемые на устройстве, тем самым подтверждая их актуальность.

Подробнее про принципы формирования топиков устройства можно почитать здесь. Как настроить MQTT-клиент для работы с данными топиками я рассказывал здесь и здесь.

Перечень топиков данных

Почти все топики данных устройство публикует в JSON-формате.

  • %location%/watering1/sysinfo – здесь периодически публикуется системная информация: версия прошивки, параметры wifi, время наработки, свободная память и т.д.
  • %location%/watering1/status – во время работы устройства здесь публикуется системная информация в очень кратком виде [время наработки / уровень сигнала wifi / свободная память и nvs]; данный топик по умолчанию также является и LWT-топиком.
  • %location%/watering1/time – отображается текущая время и дата в различном виде.
  • %location%/watering1/ping – здесь публикуются результаты пинга серверов яндекса и гугуоля
  • %location%/watering1/tasklist – список запушенных задач FreeRTOS, здесь есть очень полезная фича – stack_minimum, которая показывает минимально свободный размер стека задачи. Ориентируясь по этим данным, можно оптимизировать размер стека для каждой задачи.
  • %location%/watering1/soil – данные с сенсора влажности почвы.
  • %location%/watering1/indoor – данные с сенсора температуры в комнате.
  • %location%/watering1/heating – данные с сенсора DS18B20, который приклеен термопроводным клеем к системе отопления.
  • %location%/watering1/water_leak – данные о сработавших датчиках перелива воды
  • %location%/watering1/watering – данные о текущем состоянии нагрузки (насоса), то есть полива
  • %location%/watering1/water_level – уровень воды в емкости

Топики параметров

Как я уже описал выше, топики параметров разделены на две составляющие. В списке ниже я укажу только config – составляющую, подразумевая при этом, что есть ещё и config – составляющая. Все топки параметров отправляются в простом виде (plain). Курсивом я выделил наиболее значимые параметры.

  • %location%/watering1/config/watering/notify/watering – режим уведомлений в telegram при включении и отключении полива: 0 – нет уведомлений, 1 – есть, но тихо, 2 – уведомления со звуком
  • %location%/watering1/config/watering/notify/leaks – режим уведомлений в telegram при срабатывании датчика перелива: 0 – нет уведомлений, 1 – есть, но тихо, 2 – уведомления со звуком
  • %location%/watering1/config/watering/notify/level – режим уведомлений в telegram при срабатывании датчика низкого уровня воды: 0 – нет уведомлений, 1 – есть, но тихо, 2 – уведомления со звуком
  • %location%/watering1/config/watering/modeрежим полива: 0 – полив заблокирован, 1 – включен принудительно, 2 – полив по датчику влажности почвы
  • %location%/watering1/config/watering/timespanрасписание полива, например 06:00-12:00 или 18:00-06:00
  • %location%/watering1/config/watering/soil/moist_minминимальная влажность, при которой будет запущен полив (в режиме 2)
  • %location%/watering1/config/watering/soil/moist_maxмаксимальная влажность, при достижении которой полив будет остановлен (в режиме 2)
  • %location%/watering1/config/watering/soil/temp_min – минимальная температура почвы, при которой разрешен автоматический полив
  • %location%/watering1/config/watering/soil/temp_max – максимальная температура почвы, при которой разрешен автоматический полив
  • %location%/watering1/config/watering/total_durationобщая длительность полива в минутах. Если за это время максимальная влажность так и не будет набрана, полив будет остановлен.
  • %location%/watering1/config/watering/cycle_durationдлительность включения насоса в пределах одного цикла полива в секундах.
  • %location%/watering1/config/watering/cycle_intervalдлительность паузы между включениями насоса в секундах.
  • %location%/watering1/config/watering/wleaks_debounce – количество последовательных измерений, при котором устранение перелива не учитывается (очень медленный debounce)
  • %location%/watering1/config/watering/wleaks_sensor1 – позволяет дистанционно отключить датчик перелива в случае его выхода из строя. Осторожно! Это может привести к коммунальной аварии местного значения.
  • %location%/watering1/config/watering/wleaks_sensor2 – тоже для датчика перелива 2
  • %location%/watering1/config/watering/wleaks_sensor3 – тоже для датчика перелива 2
  • %location%/watering1/config/watering/wlevel_sensor – позволяет дистанционно отключить датчик уровня топлива воды.
  • %location%/watering1/config/sensors/intervals/read – можно изменить интервал основной рабочей задачи, то есть это интервал опроса датчиков в секундах
  • %location%/watering1/config/sensors/intervals/mqtt – интервал публикации данных на MQTT-брокере в секундах
  • %location%/watering1/config/sensors/intervals/openmon – интервал отправки данных на open-monitoring.online в секундах
  • %location%/watering1/config/sensors/intervals/thingspeak – интервал отправки данных на thingspeak.com в секундах
  • %location%/watering1/config/sensors/soil – целая группа топиков, позволяющая настроить параметры сенсора влажности почвы, например фильтр и смещение
  • %location%/watering1/config/sensors/indoor – целая группа топиков, позволяющая настроить параметры сенсора температуры в комнате, например фильтр и смещение
  • %location%/watering1/config/sensors/heating – целая группа топиков, позволяющая настроить параметры сенсора температуры системы отопления, например фильтр и смещение
  • %location%/watering1/config/notifications – а здесь вы можете включить или отключить служебные уведомления устройства, например о том, что какой-либо сервер или датчик “отвалился”.

Служебные топики

Кроме этого, существует еще два топика:

  • %location%/watering1/system/ota – сюда вы должны будете отправить HTTPS-ссылку на BIN-файл с обновлением прошивки для ОТА.
  • %location%/watering1/system/terminal – сюда можно отправлять команды для перезагрузки устройства или иных действий. Подробнее здесь.

Надеюсь, приведенной информации вам будет достаточно, чтобы настроить панель управления вашим устройством на смартфоне, например.

Возможно, я что-то забыл упомянуть и вам не достаточно информации для повторения проекта?

Напишите в комментариях или в telegram-чат. Возможно, я дополню или исправлю статью. Буду благодарен за конструктивные идеи и замечания, но комментарии “всё г..но” – будут удалены без сожаления, а авторы таких - заблокированы без предупреждения

Ссылка на проект

Все статьи цикла

Связанные статьи