Добрый день, уважаемый читатель!
Продолжаю серию статей об автомате для полива растений с удаленным контролем и управлением. Все статьи цикла:
Данное устройство изначально было разработано для автоматического полива комнатных растений в период отсутствия хозяев дома, однако его можно с успехом использовать и для полива грядок в теплице. В прошлый раз я рассказывал, какие компоненты понадобятся для сборки и привел примерную схему устройства. Настало время опубликовать исходный код прошивки и рассказать, как его использовать.
Прошивка для данного автомата создана на базе фреймворка 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. Если вы планируете отправлять данные с устройства на сторонние сервисы, то вам понадобятся соответствующие учетные данные – например код и токен доступа. Облачные сервисы могут понадобится, дабы накапливать данные измерений где-то в облаке, а затем просматривать их в виде графиков. На момент написания статьи поддерживаются три сервиса:
- Российский Народный мониторинг
- Российский Open Monitoring
- Буржуинский ThingSpeak
Но, в принципе, и без этого можно легко пользоваться устройством. А можно подключить его к 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. Датчики влажности почвы
- Автополив. Часть 2. Схема и компоненты
- Автополив. Часть 3. Прошивка
Связанные статьи
- Прошивка K12 на основе ESP-IDF
- Прошивка K12 для ESP32. Команды
- Прошивка K12 для ESP32. Системный светодиод
- rLoadControl: индикация состояния нагрузки на MQTT DASH
- Настраиваем MQTT DASH для Android
💠 Полный архив статей вы найдете здесь
Пожалуйста, оцените статью:
Александр, приветствую. Решил тоже автоматизировать полив, только грядок на даче. Пока в голове есть только задумка, как это все должно работать, но чукча не инженер, есть немного опыта в домашней автоматизации на ESP8266, но что-то более серьезное боюсь не вытяну =) Есть ли возможность помочь в разработке? Естественно не за бесплатно. Сколько будет ориентировочно стоить и как с вами удобнее связаться по этому вопросу?
Добрый день!
Контакты есть здесь: https://kotyara12.ru/author/ и на главной странице сайта внизу.
Но сейчас, боюсь, еще один проект не потяну чисто по времени
А какой насос применять при поливе в теплице?
Добрый день!
В статье про теплицу есть вариант.
https://kotyara12.ru/iot/greenhouse_04/