Skip to content

Latest commit

 

History

89 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🌱 Капельный полив на ESP32

CI Релиз Загрузки Лицензия

Platform Framework Control

Автономная система капельного полива для дачного участка: 8 независимых каналов, автополив по влажности почвы, учёт расхода воды и контроль засора фильтра. Управление — полностью через Telegram-бота, без облаков и сторонних приложений (библиотеки Alex Gyver).

📑 Оглавление

Возможности

  • 🌿 8 независимых каналов: клапан + ёмкостный датчик влажности почвы на каждый
  • 🤖 Управление через Telegram — настройка, статус, отчёты, до 8 пользователей с ролями
  • 💧 Автополив по влажности с гистерезисом; режимы «всегда ВКЛ», «всегда ВЫКЛ», «авто», «парник»
  • 🔧 Авто-калибровка границ датчиков: диапазон сам расширяется под реальные условия, разовые выбросы отфильтровываются
  • 🌙 Погодные блокировки: ночь и дождь (настраиваются)
  • 📟 Датчик потока: расход за сессию и накопленный итог, текущая скорость в статусе
  • 🧽 Контроль засора фильтра: тревога в Telegram при падении потока ниже порога
  • 💪 Нагнетательный насос: пусковой режим + удержание по числу открытых клапанов
  • 🗑️ Пролив дренажа после простоя, 🚰 заливка бака на ночь
  • 📊 Журналы CSV на SD-карте, графики и отчёты прямо в чате
  • 📤 OTA-обновление прошивки файлом через Telegram

Состав системы

Компоненты

Компонент Назначение
ESP32 (DevKit) контроллер
SD-карта, модуль 3.3 В конфигурация, журналы CSV, отчёты
Кнопка (подтянута к земле) сброс настроек
Датчик освещённости (дискретный) определение дня/ночи
Датчик дождя (дискретный) блокировка полива в дождь
Датчик потока YF-S201 (~450 имп/л) учёт расхода и контроль фильтра, ставится на общую магистраль
DS3231 (I2C) часы реального времени, синхронизация с NTP
PCF8574 (I2C, адрес 0x20) расширитель портов для 8 клапанов
Релейный модуль, 8 каналов управление клапанами полива
Реле ×3 нагнетательный насос, налив ёмкости, пролив дренажа
74HC4051 аналоговый мультиплексор датчиков влажности
Ёмкостные датчики влажности ×8 по одному на канал

Схема подключения

Схема подключения

Распиновка ESP32

GPIO Подключение GPIO Подключение
2 встроенный светодиод (индикация) 18 SD-карта · SCK
4 датчик освещённости 19 SD-карта · MISO
5 SD-карта · CS 21 I2C · SDA (DS3231, PCF8574)
12 74HC4051 · S0 22 I2C · SCL (DS3231, PCF8574)
13 74HC4051 · S1 23 SD-карта · MOSI
14 74HC4051 · S2 25 реле пролива дренажа
15 датчик дождя 26 реле нагнетательного насоса
16 кнопка сброса настроек 27 датчик потока YF-S201
17 реле налива ёмкости 33 АЦП — сигнал мультиплексора

Установка

Потребуется: Wi-Fi сеть с выходом в интернет и созданный Telegram-бот (инструкция по созданию бота).

  1. Соберите схему
  2. Скачайте исходники репозитория
  3. Токен бота можно задать двумя способами (начиная с v1.8.0):
    • ничего не делать — при первом запуске устройство само попросит токен на странице настройки WiFi и сохранит его в EEPROM (так работают готовые бинарники из релизов);
    • вшить в прошивку — скопировать secrets.example.h в secrets.h и вписать токен (файл не коммитится в git).
  4. Прошейте ESP32 (Arduino IDE или arduino-cli, плата esp32)

⚠️ У бота в @BotFather пропишите список команд:

reset - сброс состояния
control - управление поливом
status - текущий статус
pause - остановка статусных сообщений
continue - продолжение получения сообщений

Первый запуск

  1. Настройка Wi-Fi. При первом старте устройство поднимает собственную Wi-Fi точку. Подключитесь к ней — откроется страница настройки: выберите домашнюю сеть, введите пароль и токен бота (если он не вшит в прошивку). После сохранения устройство перезагрузится.

    🔐 Токен хранится в EEPROM. Если он уже сохранён, поле «Токен» можно оставить пустым — значение не изменится. А если прошивка окажется без токена (например, взята из релизов), устройство при старте поднимет портал только для его ввода: сеть, пользователи и калибровки при этом сохраняются, и работа продолжится с того же места.

  2. Регистрация владельца. Напишите боту кодовое слово со страницы настройки — вы становитесь владельцем устройства.

  3. Базовая настройка через меню бота:

    • режимы работы клапанов → сценарий;
    • калибровка датчиков влажности;
    • названия культур по каналам;
    • пороги срабатывания.
  4. Система готова к работе.

⚠️ Запомните кодовую фразу со страницы настройки Wi-Fi — без неё не зарегистрироваться владельцем.

💡 Сброс к заводским настройкам: зажмите кнопку на 3 секунды сразу после старта и дождитесь трёх коротких миганий светодиода.

Руководство пользователя

Команды бота

Команда Действие Кому доступна
/reset сброс состояния меню, стартовое меню всем зарегистрированным
/control меню управления поливом всем зарегистрированным
/status текущий статус системы и датчиков всем зарегистрированным
/pause остановить статусные сообщения всем зарегистрированным
/continue возобновить статусные сообщения всем зарегистрированным
/register запрос на регистрацию незарегистрированным

Роли пользователей

Роль Как получить Что доступно
👑 Владелец первым вводит кодовое слово с портала настройки всё + OTA-обновление; не может быть понижен или удалён
🎭 Администратор назначается через «Пользователи → Повышение» управление, настройка, пользователи, перезагрузка
👤 Пользователь отправляет /register, админ подтверждает управление поливом, статус, отчёты

Структура меню

Пункты с пометкой 👑 видят только администраторы и владелец.

Статус системы

/status показывает полную картину одним сообщением:

Блок Содержимое
📅 Дата и время текущее время системы (NTP + RTC)
🌙/☀️ Погода день или ночь, идёт ли дождь
🌱 По каждому каналу название культуры, влажность %, порог %, состояние клапана, режим работы (владельцу дополнительно — сырое значение АЦП)
💧 Расход воды литры за текущую сессию и накопленный итог
🧽 Фильтр текущая скорость потока, эталон, порог тревоги, состояние (норма/засор)
💪 Насос давления работает сейчас или нет и почему (пусковой режим / порог клапанов / дренаж), текущая настройка
💾 Память свободная память контроллера

Типовые сценарии

🚿 Настроить автополив канала
  1. Управление → Режим работы → выбрать клапан → 🤖 АВТО (или 🏠 А.П. для парника — поливает и в дождь)
  2. Управление → Пороги срабатывания → выбрать клапан → ввести порог влажности в %. Клапан откроется при влажности ниже «порог − дельта» и закроется выше «порог + дельта» — как это работает
  3. Управление → Названия → дать каналу имя культуры («🍅 Томаты»)
🔧 Откалибровать датчик влажности
  1. Настройка → Калибровка → выбрать датчик
  2. Опустить датчик в воду → ➡️ ДАЛЕЕ (это 100 % влажности)
  3. Вытереть насухо → ➡️ ДАЛЕЕ (это 0 %)
  4. Установить датчик в почву → ✅ ЗАВЕРШИТЬ

Если известны точные значения АЦП — Настройка → Ручная калибровка, ввести пару мин,макс.

🔍 Найти датчик, если неизвестен его номер

Управление → Поиск датчика: замер в воде, затем насухо — бот назовёт номер датчика с наибольшей разницей показаний.

💧 Посмотреть расход воды

Управление → Расход воды — литры за текущую сессию полива и накопленный итог, там же кнопка стирания данных. Текущая скорость потока — в Статусе.

🧽 Пришла тревога «засорился фильтр»
  1. Перекройте воду и прочистите фильтр на магистрали
  2. Настройка → Фильтр прочищен — система заново замерит скорость «чистого» потока

Подробнее о механизме — Контроль засора фильтра.

💪 Настроить насос повышения давления

Настройка → Насос давления:

  • число 1–8 — держать насос включённым, пока открыто столько клапанов и больше;
  • 9 — не держать, только пусковые 30 секунд при каждом открытии клапана.

Текущее состояние насоса и причина — в Статусе. Диаграмма работы.

📈 Получить графики и файлы измерений

Отчёты → Графики — график влажности по каналам за вчера/сегодня/декаду/период/дату. Отчёты → Файл... — бот пришлёт CSV-файл с измерениями (формат).

🔕 Отключить уведомления на время

Команда /pause, вернуть — /continue (действует до перезагрузки устройства).

👥 Добавить нового пользователя
  1. Новый человек пишет боту /register
  2. Администраторам приходит запрос со ссылкой-командой — админ нажимает её, человек зарегистрирован как «пользователь»
  3. При необходимости повысить: Пользователи → Повышение
📤 Обновить прошивку по воздуху

Владелец отправляет в чат файл DripIrrigation.ino.bin — устройство обновится и перезагрузится. Подробнее.

Как работает автоматика

Общая картина: раз в минуту выполняется цикл полива, а фоновые задачи (бот, насос, контроль потока, дренаж, связь) работают непрерывно.

Алгоритм работы

Полив по влажности

Раз в минуту система опрашивает все 8 датчиков (медиана из 9 замеров АЦП — устойчиво к помехам) и для каждого канала в режиме «авто» сравнивает влажность с порогом. Гистерезис (зона ±Δ вокруг порога) исключает дребезг — клапан не щёлкает туда-сюда при колебаниях показаний:

Автополив с гистерезисом

Авто-калибровка границ

Со временем реальный диапазон датчика уходит за границы, заданные при калибровке: почва после ливня оказывается влажнее «воды» из стакана, а в засуху — суше «сухого» замера. Тогда проценты упираются в 0 или 100 и перестают что-либо показывать.

Система расширяет границы сама: если показание вышло за границу, она отодвигается до этого значения с запасом в дельту калибровки. Границы только расширяются, сужения нет — сузить можно лишь перекалибровкой.

Авто-калибровка границ

Два предохранителя:

  • Разовые выбросы игнорируются. Граница двигается, только если превышение держится 3 минутных замера подряд. Один сбойный отсчёт АЦП (наводка, плохой контакт) обнуляет счётчик и ничего не портит. Внутри окна подтверждения берётся самое мягкое из превышений, чтобы выброс не утянул границу. Отключается настройкой «Авто-калибровка без задержки».
  • Во время калибровки функция выключена. Пока открыт диалог калибровки или поиска датчика, датчик держат в воде или на воздухе — такие показания нельзя принимать за рабочие, иначе система «выучит» калибровочные экстремумы как норму.

Новые границы сохраняются на SD-карту автоматически.

Аварийный режим при неисправном оборудовании

Платы (RTC, SD-карта, расширитель клапанов PCF8574) инициализируются неблокирующе: если узел не отвечает, система всё равно завершает загрузку и поднимает бота. Неисправность приходит в чат с пояснением последствий — не нужно ехать к устройству и подключаться кабелем, чтобы понять, что случилось.

Пока неисправность не устранена:

  • полив остановлен — работать с неисправным железом опасно;
  • насос, дренаж и залив бака выключены напрямую по пинам (не через возможно мёртвый PCF8574);
  • интерфейс бота свёрнут до отчёта и единственной кнопки «Перезагрузка» — починив контакт, систему можно поднять прямо из чата.

Погодные блокировки

Ночью и в дождь полив останавливается, если это запрещено в настройках. Исключения: каналы «всегда ВКЛ» и режим «парник» продолжают полив под дождём (но не ночью). При наступлении ночи подаётся сигнал заполнения ёмкости — за ночь вода прогреется к утреннему поливу.

Насос повышения давления

При открытии любого клапана насос включается минимум на 30 секунд для стабилизации давления. Дальше — по настройке: либо выключается, либо продолжает работать, пока открыто N и более клапанов:

Работа насоса

Пролив дренажа также идёт с включённым насосом. Фактическое состояние насоса и причина всегда видны в Статусе.

Пролив дренажа

Если полив не шёл более 5 часов, при открытии первого клапана автоматически запускается пролив дренажа на 12 секунд — сброс накопившейся ржавчины из труб, чтобы не засорялись форсунки. Ручной запуск: Управление → Пролив дренажа.

Учёт расхода и контроль засора фильтра

На общей магистрали стоит импульсный датчик потока (YF-S201). Система считает расход за сессию полива и накопленный итог, а также непрерывно следит за скоростью потока:

Контроль засора фильтра

Ключевые детали алгоритма:

  • после открытия клапана трубы наполняются — поток кратковременно завышен, поэтому система дожидается стабилизации и только потом замеряет;
  • эталон «чистого» фильтра запоминается автоматически (разовые выбросы отфильтровываются — новое значение должно продержаться несколько минут);
  • замеры при работающем пусковом насосе и заливке бака не учитываются;
  • тревога подтверждается несколькими окнами замера подряд и повторяется не чаще раза в сутки.

Данные на SD-карте

/configuration.dat      — конфигурация системы (бинарная)
/ГГГГ/ММ/ДД.csv         — журнал измерений за день

Каждую минуту в CSV дописывается по строке на канал:

Колонка Описание
UnixTime метка времени UNIX
DateTime дата и время в читаемом виде
Index номер канала (1–8)
Title название культуры
Humidity влажность, %
Valve состояние клапана: 1 — открыт, 0 — закрыт
Border порог срабатывания, %
Night ночь: 1/0
Rain дождь: 1/0

Файлы за прошлые годы можно удалить из бота: Настройка → Удаление файлов.

Справочник по пунктам меню

/reset — сброс состояния

Сбрасывает состояние меню и выводит стартовое меню

/status · меню «Статус»

Полный статус системы — расшифровка блоков

/pause — остановка статусных сообщений

Останавливает сообщения о событиях на устройстве (действует до перезагрузки)

/continue — продолжение получения сообщений

Возобновляет сообщения о событиях

👑 Перезагрузка

Перезапускает устройство (с подтверждением)

👑 Пользователи

  • Список — зарегистрированные пользователи (идентификаторы и роли)
  • Повышение — Пользователь → Администратор
  • Понижение — Администратор → Пользователь (владельца понизить нельзя)
  • Удаление — удаление пользователя (владельца удалить нельзя)

Управление

  • Режим работы — режим каждого клапана: ✅ постоянно включен · ⛔ постоянно выключен · 🤖 автоматический по влажности · 🏠 парник (авто, работает и при дожде); кнопка «Установить для всех»
  • Названия — имя выращиваемой культуры для каждого канала
  • Пороги срабатывания — порог влажности каждого клапана в %
  • Расход воды — литры за сессию и накопленный итог; стирание данных
  • Пролив дренажа — ручной запуск пролива (12 секунд)
  • Поиск датчика — определить номер датчика по замерам в воде и насухо

Отчёты

  • Графики
    • за вчера — почасовой график влажности по каналам
    • за сегодня — почасовой график за текущий день
    • за декаду — последние 10 дней, 6 значений в сутки
    • за период — от 1 до 60 дней, целое(60 / кол-во дней) значений в сутки
    • за дату — график за выбранный день
  • Файл за вчера — CSV-файл с измерениями за вчера
  • Файл текущий — CSV-файл за сегодня
  • Файл за дату — CSV-файл за выбранный день

👑 Настройка

  • Работа ночью — разрешить/запретить полив ночью
  • Работа под дождём — разрешить/запретить полив в дождь
  • Дельта влажности — половина гистерезиса вокруг порога, % (0–100, по умолчанию 5)
  • Дельта калибровки — запас у границ калибровки датчиков, ед. АЦП (0–2048, по умолчанию 15). Используется и как запас при авто-калибровке границ
  • Авто-калибровка без задержки — двигать границу сразу по первому замеру за ней. По умолчанию выключено: граница двигается, только если превышение держится 3 замера подряд (3 мин) — так одиночный выброс АЦП не портит калибровку. Включайте, только если нужна мгновенная реакция
  • Насос давления — держать насос при ≥ N открытых клапанах (1–8); 9 — только пусковые 30 с
  • Порог фильтра — % от скорости «чистого» фильтра, ниже которого тревога (10–90, по умолчанию 50)
  • Фильтр прочищен — сброс эталона после чистки, система замерит его заново
  • Таймаут Telegram — через сколько секунд без связи считать её потерянной (120–3600, по умолчанию 180). Увеличьте, если приходит много сообщений о кратковременных обрывах связи
  • Калибровка — пошаговая калибровка датчика: замер в воде, затем насухо
  • Ручная калибровка — ввод граничных значений АЦП парой мин,макс
  • Сброс настроек — возврат к заводским установкам
  • Удаление файлов — удаление архивов измерений за прошлые годы

Обновление прошивки (OTA)

  1. Возьмите готовый файл со страницы релизов (собирается автоматически в GitHub Actions) — или соберите сами (Скетч → Экспорт бинарного файла в Arduino IDE):
    • DripIrrigation.ino.bin — обычный (~1.3 МБ);
    • DripIrrigation.ino.bin.gz — сжатый (~0.8 МБ), удобнее по мобильному интернету — устройство распакует его само.
  2. Отправьте файл в чат боту от имени владельца
  3. Устройство скачает файл, обновится и перезагрузится; после старта придёт сообщение «🚀 Система запущена! Прошивка vX.Y.Z»

💡 Имя файла может содержать суффикс копии, который добавляет Windows при повторном скачивании: DripIrrigation.ino.bin (2).gz и DripIrrigation.ino (2).bin тоже принимаются — переименовывать не нужно.

🔁 Если пришло OTA Fetch Error — файл не удалось скачать (обычно не хватило памяти на защищённое соединение после долгой работы). Прошивка при этом не пострадала: просто отправьте файл ещё раз, а если повторяется — перезагрузите систему через меню и повторите.

✅ Проверить версию можно в любой момент — она указана в шапке /status. Если после OTA номер не изменился, обновление не применилось.

🛡️ OTA безопасен: прошивка пишется в неактивный раздел, загрузка переключается только при валидном образе. Неудачное обновление оставит устройство на прежней прошивке (не «кирпич»).

⚠️ Прошивка должна быть собрана под ту же схему разделов (partition scheme), что и установленная.

🏷️ Версия задаётся в version.h (FW_VERSION) и должна совпадать с git-тегом релиза.

Сторонние компоненты

  • Библиотеки Alex Gyver: FastBot2, GyverNTP, GyverDS3231, FileData, CharDisplay и зависимости
  • uzlib (zlib-лицензия) — потоковая распаковка gzip для OTA из .gz (файлы uzlib.h, tinflate.c, tinfgzip.c, crc32.c, adler32.c и заголовки)
  • PCF8574 library (Renzo Mischianti)

Лицензия

WTFPL 2.0 — делайте с этим кодом что хотите, без каких-либо условий.

Исключение: файлы uzlib.h, tinflate.c, tinfgzip.c, crc32.c, adler32.c, defl_static.h, tinf.h, tinf_compat.h, uzlib_conf.h — это стороннее заимствование (uzlib) и они остаются под своей zlib-лицензией; уведомления об авторстве в них сохранены.

About

Капельный полив на ESP32 с Telegram-ботом: 8 каналов, датчик потока, контроль засора фильтра, отчёты и OTA (библиотеки Alex Gyver)

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages