Перейти к содержимому

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

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

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

 

Прошивка для данного автомата создана на базе фреймворка 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.

Распакуйте его в каталог 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 будет накапливать данные и отображать их. Если оно у вас есть, конечно.

Как изменить рабочие каталоги проекта

Как я уже написал выше, проект собран исходя из условий, что сам проект находится в папке C:\Projects\PlatformIO\dzen_autowatering, а общие библиотеки – в C:\Projects\PlatformIO\libs. Допустим, данный вариант для вас неприемлем, например на диске C:\ совсем нет места. Или собираете под linux, скажем, а там другая структура. Что потребуется поменять:

  • platformio.ini – все ссылки на библиотеки и файлы PEM (сертификаты)
  • src\CMakeLists.txt – подключаемые PEM-файлы (сертификаты)
  • .vscode\c_cpp_properties.json – пути к библиотекам для корректной работы IntelliSence
  • если будете использовать bat-файлы из папки ota – то и их тоже, но их вам придется править в любом случае

 

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

 


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

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

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

 

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

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

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

// -----------------------------------------------------------------------------------------------------------------------
// ----------------------------------------------- EN - GPIO -------------------------------------------------------------
// ----------------------------------------------- RU - GPIO -------------------------------------------------------------
// -----------------------------------------------------------------------------------------------------------------------
#define CONFIG_GPIO_SYSTEM_LED      23 // Номер вывода для системного (статусного) светодиода
#define CONFIG_GPIO_WATERING_LED    4  // Номер вывода для светодиода полива
#define CONFIG_GPIO_PUMP            13 // Номер вывода для управления насосом
#define CONFIG_GPIO_WATER_LEAK_ACT  19 // Номер вывода для активации контроля перелива
#define CONFIG_GPIO_WATER_LEAK1     33 // Вход контроля перелива 1
#define CONFIG_GPIO_WATER_LEAK2     25 // Вход контроля перелива 2
#define CONFIG_GPIO_WATER_LEAK3     26 // Вход контроля перелива 3
#define CONFIG_GPIO_WATER_LEVEL     27 // Вход для контроля низкого уровня воды
#define CONFIG_GPIO_DS18B20         32 // Вход для DS18B20
// EN: Analog inputs
// RU: Аналоговые входы
#define CONFIG_GPIO_SOIL_MS1        36
#define CONFIG_GPIO_SOIL_MS2        39
#define CONFIG_GPIO_SOIL_MS3        34
#define CONFIG_GPIO_SOIL_MS4        35
// EN: RS485 bus 
// RU: Шина RS485
#define CONFIG_GPIO_RS485_RX        17
#define CONFIG_GPIO_RS485_TX        16
// EN: I2C bus #0: pins, pullup, frequency
// RU: Шина I2C #0: выводы, подтяжка, частота
#define CONFIG_I2C_PORT0_SDA        21
#define CONFIG_I2C_PORT0_SCL        22
#define CONFIG_I2C_PORT0_PULLUP     false 
#define CONFIG_I2C_PORT0_FREQ_HZ    100000
#define CONFIG_I2C_PORT0_STATIC     3
// EN: I2C bus #1: pins, pullup, frequency
// RU: Шина I2C #1: выводы, подтяжка, частота
// #define CONFIG_I2C_PORT1_SDA     16
// #define CONFIG_I2C_PORT1_SCL     17
// #define CONFIG_I2C_PORT1_PULLUP  false
// #define CONFIG_I2C_PORT1_FREQ_HZ 100000
// #define CONFIG_I2C_PORT1_STATIC  2

 

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

// -----------------------------------------------------------------------------------------------------------------------
// ---------------------------------------------- EN - Wifi networks -----------------------------------------------------
// ------------------------------------------------ RU - WiFi сети -------------------------------------------------------
// -----------------------------------------------------------------------------------------------------------------------
#define CONFIG_WIFI_1_SSID "wifi1ssid"
#define CONFIG_WIFI_1_PASS "wifi1password"
#define CONFIG_WIFI_2_SSID "wifi2ssid"
#define CONFIG_WIFI_2_PASS "wifi2password"
#define CONFIG_WIFI_3_SSID "wifi3ssid"
#define CONFIG_WIFI_3_PASS "wifi3password"

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

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

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

// -----------------------------------------------------------------------------------------------------------------------
// ---------------------------------------------- EN - Wifi networks -----------------------------------------------------
// ------------------------------------------------ RU - WiFi сети -------------------------------------------------------
// -----------------------------------------------------------------------------------------------------------------------
#define CONFIG_WIFI_SSID "ssid"
#define CONFIG_WIFI_PASS "password"

 

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

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

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

// -----------------------------------------------------------------------------------------------------------------------
// ---------------------------------------------- EN - MQTT broker -------------------------------------------------------
// ---------------------------------------------- RU - MQTT брокер -------------------------------------------------------
// -----------------------------------------------------------------------------------------------------------------------
// EN: Parameters of MQTT brokers. Two brokers can be defined: primary and backup
// RU: Параметры MQTT-брокеров. Можно определить два брокера: основной и резервный
// CONFIG_MQTTx_TYPE :: 0 - public, 1 - local, 2 - gateway (CONFIG_MQTT1_HOST not used)

/********************* local server ************************/
#define CONFIG_MQTT1_TYPE 2
#define CONFIG_MQTT1_HOST "192.168.1.1"
#define CONFIG_MQTT1_PING_CHECK 0
#define CONFIG_MQTT1_PING_CHECK_DURATION 250
#define CONFIG_MQTT1_PING_CHECK_LOSS 50.0
#define CONFIG_MQTT1_PING_CHECK_LIMIT 3
#define CONFIG_MQTT1_PORT_TCP 1883
#define CONFIG_MQTT1_PORT_TLS 8883
#define CONFIG_MQTT1_USERNAME "watering"
#define CONFIG_MQTT1_PASSWORD "q7katxak0g8s77hnx87xn"
#define CONFIG_MQTT1_TLS_ENABLED 0
#define CONFIG_MQTT1_TLS_STORAGE CONFIG_DEFAULT_TLS_STORAGE
#define CONFIG_MQTT1_TLS_PEM_START CONFIG_DEFAULT_TLS_PEM_START
#define CONFIG_MQTT1_TLS_PEM_END CONFIG_DEFAULT_TLS_PEM_END
#define CONFIG_MQTT1_CLEAN_SESSION 1
#define CONFIG_MQTT1_AUTO_RECONNECT 1
#define CONFIG_MQTT1_KEEP_ALIVE 60
#define CONFIG_MQTT1_TIMEOUT 10000
#define CONFIG_MQTT1_RECONNECT 10000
#define CONFIG_MQTT1_CLIENTID "esp32_watering1"
// #define CONFIG_MQTT1_LOC_PREFIX ""
// #define CONFIG_MQTT1_PUB_PREFIX ""
#define CONFIG_MQTT1_LOC_LOCATION "local"
#define CONFIG_MQTT1_PUB_LOCATION "%location%"
#define CONFIG_MQTT1_LOC_DEVICE "watering1"
#define CONFIG_MQTT1_PUB_DEVICE "watering1"

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

  • 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? Потому что таких поливалок может быть несколько – по одной на подоконник.

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

/********************* public server ***********************/
#define CONFIG_MQTT2_TYPE 0
#define CONFIG_MQTT2_HOST "XX.WQTT.RU"
#define CONFIG_MQTT2_PING_CHECK 1
#define CONFIG_MQTT2_PING_CHECK_DURATION 400
#define CONFIG_MQTT2_PING_CHECK_LOSS 50.0
#define CONFIG_MQTT2_PING_CHECK_LIMIT 5
#define CONFIG_MQTT2_PORT_TCP 2632
#define CONFIG_MQTT2_PORT_TLS 2633
#define CONFIG_MQTT2_USERNAME "u_username"
#define CONFIG_MQTT2_PASSWORD "q7katxak0g8s77hnx87xn"
#define CONFIG_MQTT2_TLS_ENABLED 1
#define CONFIG_MQTT2_TLS_STORAGE TLS_CERT_BUFFER
#define CONFIG_MQTT2_TLS_PEM_START CONFIG_DEFAULT_TLS_PEM_START
#define CONFIG_MQTT2_TLS_PEM_END CONFIG_DEFAULT_TLS_PEM_END
#define CONFIG_MQTT2_CLEAN_SESSION 1
#define CONFIG_MQTT2_AUTO_RECONNECT 1
#define CONFIG_MQTT2_KEEP_ALIVE 60
#define CONFIG_MQTT2_TIMEOUT 5000
#define CONFIG_MQTT2_RECONNECT 10000
#define CONFIG_MQTT2_CLIENTID "esp32_watering1"
// #define CONFIG_MQTT2_LOC_PREFIX ""
// #define CONFIG_MQTT2_PUB_PREFIX ""
#define CONFIG_MQTT2_LOC_LOCATION "local/%location%"
#define CONFIG_MQTT2_PUB_LOCATION "%location%"
#define CONFIG_MQTT1_LOC_DEVICE "watering1"
#define CONFIG_MQTT2_PUB_DEVICE "watering1"

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

 

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

// -----------------------------------------------------------------------------------------------------------------------
// ---------------------------------------------- EN - Telegram notify ---------------------------------------------------
// ------------------------------------------- RU - Уведомления в Telegram -----------------------------------------------
// -----------------------------------------------------------------------------------------------------------------------
// EN: Allow Telegram notifications (general flag)
// RU: Разрешить уведомления в Telegram (общий флаг)
#define CONFIG_TELEGRAM_ENABLE 1
#if CONFIG_TELEGRAM_ENABLE
// EN: Telegram API bot token
// RU: Токен бота API Telegram
#define CONFIG_TELEGRAM_TOKEN "00000000000:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
// EN: Chat or group ID
// RU: Идентификатор чата или группы
#define CONFIG_TELEGRAM_CHAT_ID_MAIN     "-1009999999998"
#define CONFIG_TELEGRAM_CHAT_ID_SERVICE  "-1009999999999"
#define CONFIG_TELEGRAM_CHAT_ID_PARAMS   CONFIG_TELEGRAM_CHAT_ID_SERVICE
#define CONFIG_TELEGRAM_CHAT_ID_SECURITY CONFIG_TELEGRAM_CHAT_ID_MAIN
// EN: Send message header (device name, see CONFIG_TELEGRAM_DEVICE)
// RU: Отправлять заголовок сообщения (название устройства, см. CONFIG_TELEGRAM_DEVICE)
#define CONFIG_TELEGRAM_TITLE_ENABLED 0
// EN: Device name (published at the beginning of each message)
// RU: Название устройства (публикуется в начале каждого сообщения)
#define CONFIG_TELEGRAM_DEVICE "💎 ЛИМОН"
#endif // CONFIG_TELEGRAM_ENABLE

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

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

 

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

// -----------------------------------------------------------------------------------------------------------------------
// -------------------------------------- EN - http://open-monitoring.online/ --------------------------------------------
// -------------------------------------- RU - http://open-monitoring.online/ --------------------------------------------
// -----------------------------------------------------------------------------------------------------------------------
// EN: Enable sending data to open-monitoring.online
// RU: Включить отправку данных на open-monitoring.online
#define CONFIG_OPENMON_ENABLE 1
#if CONFIG_OPENMON_ENABLE
// EN: Frequency of sending data in seconds
// RU: Периодичность отправки данных в секундах
#define CONFIG_OPENMON_SEND_INTERVAL 180
// EN: Controller ids and tokens for open-monitoring.online
// RU: Идентификаторы контроллеров и токены для open-monitoring.online
#define CONFIG_OPENMON_CTR01_ID 9999
#define CONFIG_OPENMON_CTR01_TOKEN "aaaaaaa"
// EN: Allow publication of ping results и системной информации on open-monitoring.online
// RU: Разрешить публикацию результатов пинга и системной информации на open-monitoring.online
#define CONFIG_OPENMON_PINGER_ENABLE 1
#if CONFIG_OPENMON_PINGER_ENABLE
#define CONFIG_OPENMON_PINGER_ID 0000
#define CONFIG_OPENMON_PINGER_TOKEN "bbbbbbb"
#define CONFIG_OPENMON_PINGER_INTERVAL 180000
#define CONFIG_OPENMON_PINGER_RSSI 1
#define CONFIG_OPENMON_PINGER_HEAP_FREE 1
#define CONFIG_OPENMON_PINGER_HOSTS 0
#endif // CONFIG_OPENMON_PINGER_ENABLE
#endif // CONFIG_OPENMON_ENABLE

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

- ID: 9999
- Имя: В4225 - Лимон
- Владелец: kotyara12
- Код доступа: aaaaaaa
- Таймаут записи данных: 60 сек.
- Параметры:
    Реальные:
      1. Лимон влажность : FLOAT
      2. Лимон температура : FLOAT
      3. Полив : INT
      4. Перелив 1 : INT
      5. Перелив 2 : INT
      6. Перелив 3 : INT
      7. Вода : INT
      8. Комната температура : FLOAT
      9. Комната влажность : FLOAT
      10. Батареи отопления : FLOAT
    Вычисляемые:
      -

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

- ID: 0000
- Имя: В4225 SYS - Лимон
- Владелец: kotyara12
- Код доступа: bbbbbb
- Таймаут записи данных: 60 сек.
- Параметры:
    Реальные:
      1. RSSI : INT
      2. Heap free kb : FLOAT
      3. Heap free : FLOAT
      4. Status : INT
      5. Ping : INT
      6. Ping min : INT
      7. Ping max : INT
      8. Loss : FLOAT
      9. Loss min : FLOAT
      10. Loss max : FLOAT
    Вычисляемые:

 

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 преобразователя:

// RS485 Modbus RTU
#define SENSOR_MODBUS_PORT              UART_NUM_1
#define SENSOR_MODBUS_SPEED             9600
#define SENSOR_MODBUS_PIN_RXD           CONFIG_GPIO_RS485_RX
#define SENSOR_MODBUS_PIN_TXD           CONFIG_GPIO_RS485_TX
#define SENSOR_MODBUS_PIN_RTS           -1
#define SENSOR_MODBUS_PIN_CTS           -1

 

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

#define CONFIG_LED_WATER_LEAK    1, 100, 100
#define CONFIG_LED_WATER_LEVEL   2, 100, 1000
#define CONFIG_LED_WATER_ON      1, 500, 500
#define CONFIG_LED_WATER_OFF     0, 0, 0

 

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

 


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

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

  • Для измерения влажности и температуры почвы используется сенсор 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-чат. Возможно, я дополню или исправлю статью. Буду благодарен за конструктивные идеи и замечания, но комментарии “всё г..но” – будут удалены без сожаления.

 


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

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

  1. Автополив. Часть 1. Датчики влажности почвы
  2. Автополив. Часть 2. Схема и компоненты
  3. Автополив. Часть 3. Прошивка

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

  1. Прошивка K12 на основе ESP-IDF
  2. Прошивка K12 для ESP32. Команды
  3. Прошивка K12 для ESP32. Системный светодиод
  4. rLoadControl: индикация состояния нагрузки на MQTT DASH
  5. Настраиваем MQTT DASH для Android

 

💠 Полный архив статей вы найдете здесь


Пожалуйста, оцените статью:
[ 5 из 5, всего 1 оценок ]

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *