Автономная система капельного полива для дачного участка: 8 независимых каналов, автополив по влажности почвы, учёт расхода воды и контроль засора фильтра. Управление — полностью через Telegram-бота, без облаков и сторонних приложений (библиотеки Alex Gyver).
- Возможности
- Состав системы
- Установка
- Первый запуск
- Руководство пользователя
- Как работает автоматика
- Данные на SD-карте
- Справочник по пунктам меню
- Обновление прошивки (OTA)
- Лицензия
- 🌿 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 | по одному на канал |
| 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-бот (инструкция по созданию бота).
- Соберите схему
- Скачайте исходники репозитория
- Токен бота можно задать двумя способами (начиная с v1.8.0):
- ничего не делать — при первом запуске устройство само попросит токен на странице настройки WiFi и сохранит его в EEPROM (так работают готовые бинарники из релизов);
- вшить в прошивку — скопировать
secrets.example.hвsecrets.hи вписать токен (файл не коммитится в git).
- Прошейте ESP32 (Arduino IDE или arduino-cli, плата
esp32)
⚠️ У бота в @BotFather пропишите список команд:reset - сброс состояния control - управление поливом status - текущий статус pause - остановка статусных сообщений continue - продолжение получения сообщений
-
Настройка Wi-Fi. При первом старте устройство поднимает собственную Wi-Fi точку. Подключитесь к ней — откроется страница настройки: выберите домашнюю сеть, введите пароль и токен бота (если он не вшит в прошивку). После сохранения устройство перезагрузится.
🔐 Токен хранится в EEPROM. Если он уже сохранён, поле «Токен» можно оставить пустым — значение не изменится. А если прошивка окажется без токена (например, взята из релизов), устройство при старте поднимет портал только для его ввода: сеть, пользователи и калибровки при этом сохраняются, и работа продолжится с того же места.
-
Регистрация владельца. Напишите боту кодовое слово со страницы настройки — вы становитесь владельцем устройства.
-
Базовая настройка через меню бота:
- режимы работы клапанов → сценарий;
- калибровка датчиков влажности;
- названия культур по каналам;
- пороги срабатывания.
-
Система готова к работе.
⚠️ Запомните кодовую фразу со страницы настройки Wi-Fi — без неё не зарегистрироваться владельцем.
💡 Сброс к заводским настройкам: зажмите кнопку на 3 секунды сразу после старта и дождитесь трёх коротких миганий светодиода.
| Команда | Действие | Кому доступна |
|---|---|---|
/reset |
сброс состояния меню, стартовое меню | всем зарегистрированным |
/control |
меню управления поливом | всем зарегистрированным |
/status |
текущий статус системы и датчиков | всем зарегистрированным |
/pause |
остановить статусные сообщения | всем зарегистрированным |
/continue |
возобновить статусные сообщения | всем зарегистрированным |
/register |
запрос на регистрацию | незарегистрированным |
| Роль | Как получить | Что доступно |
|---|---|---|
| 👑 Владелец | первым вводит кодовое слово с портала настройки | всё + OTA-обновление; не может быть понижен или удалён |
| 🎭 Администратор | назначается через «Пользователи → Повышение» | управление, настройка, пользователи, перезагрузка |
| 👤 Пользователь | отправляет /register, админ подтверждает |
управление поливом, статус, отчёты |
Пункты с пометкой 👑 видят только администраторы и владелец.
- 👑 Перезагрузка
- 👑 Пользователи → Список · Повышение · Понижение · Удаление
- Управление
- Статус
- Отчёты
- Графики → за вчера · за сегодня · за декаду · за период · за дату
- Файл за вчера · Файл текущий · Файл за дату
- 👑 Настройка
/status показывает полную картину одним сообщением:
| Блок | Содержимое |
|---|---|
| 📅 Дата и время | текущее время системы (NTP + RTC) |
| 🌙/☀️ Погода | день или ночь, идёт ли дождь |
| 🌱 По каждому каналу | название культуры, влажность %, порог %, состояние клапана, режим работы (владельцу дополнительно — сырое значение АЦП) |
| 💧 Расход воды | литры за текущую сессию и накопленный итог |
| 🧽 Фильтр | текущая скорость потока, эталон, порог тревоги, состояние (норма/засор) |
| 💪 Насос давления | работает сейчас или нет и почему (пусковой режим / порог клапанов / дренаж), текущая настройка |
| 💾 Память | свободная память контроллера |
🚿 Настроить автополив канала
Управление → Режим работы→ выбрать клапан →🤖 АВТО(или🏠 А.П.для парника — поливает и в дождь)Управление → Пороги срабатывания→ выбрать клапан → ввести порог влажности в %. Клапан откроется при влажности ниже «порог − дельта» и закроется выше «порог + дельта» — как это работаетУправление → Названия→ дать каналу имя культуры («🍅 Томаты»)
🔧 Откалибровать датчик влажности
Настройка → Калибровка→ выбрать датчик- Опустить датчик в воду →
➡️ ДАЛЕЕ(это 100 % влажности) - Вытереть насухо →
➡️ ДАЛЕЕ(это 0 %) - Установить датчик в почву →
✅ ЗАВЕРШИТЬ
Если известны точные значения АЦП — Настройка → Ручная калибровка, ввести пару мин,макс.
🔍 Найти датчик, если неизвестен его номер
Управление → Поиск датчика: замер в воде, затем насухо — бот назовёт номер датчика с наибольшей разницей показаний.
💧 Посмотреть расход воды
Управление → Расход воды — литры за текущую сессию полива и накопленный итог, там же кнопка стирания данных. Текущая скорость потока — в Статусе.
🧽 Пришла тревога «засорился фильтр»
- Перекройте воду и прочистите фильтр на магистрали
Настройка → Фильтр прочищен— система заново замерит скорость «чистого» потока
Подробнее о механизме — Контроль засора фильтра.
💪 Настроить насос повышения давления
Настройка → Насос давления:
- число 1–8 — держать насос включённым, пока открыто столько клапанов и больше;
- 9 — не держать, только пусковые 30 секунд при каждом открытии клапана.
Текущее состояние насоса и причина — в Статусе. Диаграмма работы.
📈 Получить графики и файлы измерений
Отчёты → Графики — график влажности по каналам за вчера/сегодня/декаду/период/дату.
Отчёты → Файл... — бот пришлёт CSV-файл с измерениями (формат).
🔕 Отключить уведомления на время
Команда /pause, вернуть — /continue (действует до перезагрузки устройства).
👥 Добавить нового пользователя
- Новый человек пишет боту
/register - Администраторам приходит запрос со ссылкой-командой — админ нажимает её, человек зарегистрирован как «пользователь»
- При необходимости повысить:
Пользователи → Повышение
📤 Обновить прошивку по воздуху
Владелец отправляет в чат файл DripIrrigation.ino.bin — устройство обновится и перезагрузится. Подробнее.
Общая картина: раз в минуту выполняется цикл полива, а фоновые задачи (бот, насос, контроль потока, дренаж, связь) работают непрерывно.
Раз в минуту система опрашивает все 8 датчиков (медиана из 9 замеров АЦП — устойчиво к помехам) и для каждого канала в режиме «авто» сравнивает влажность с порогом. Гистерезис (зона ±Δ вокруг порога) исключает дребезг — клапан не щёлкает туда-сюда при колебаниях показаний:
Со временем реальный диапазон датчика уходит за границы, заданные при калибровке: почва после ливня оказывается влажнее «воды» из стакана, а в засуху — суше «сухого» замера. Тогда проценты упираются в 0 или 100 и перестают что-либо показывать.
Система расширяет границы сама: если показание вышло за границу, она отодвигается до этого значения с запасом в дельту калибровки. Границы только расширяются, сужения нет — сузить можно лишь перекалибровкой.
Два предохранителя:
- Разовые выбросы игнорируются. Граница двигается, только если превышение держится 3 минутных замера подряд. Один сбойный отсчёт АЦП (наводка, плохой контакт) обнуляет счётчик и ничего не портит. Внутри окна подтверждения берётся самое мягкое из превышений, чтобы выброс не утянул границу. Отключается настройкой «Авто-калибровка без задержки».
- Во время калибровки функция выключена. Пока открыт диалог калибровки или поиска датчика, датчик держат в воде или на воздухе — такие показания нельзя принимать за рабочие, иначе система «выучит» калибровочные экстремумы как норму.
Новые границы сохраняются на SD-карту автоматически.
Платы (RTC, SD-карта, расширитель клапанов PCF8574) инициализируются неблокирующе: если узел не отвечает, система всё равно завершает загрузку и поднимает бота. Неисправность приходит в чат с пояснением последствий — не нужно ехать к устройству и подключаться кабелем, чтобы понять, что случилось.
Пока неисправность не устранена:
- полив остановлен — работать с неисправным железом опасно;
- насос, дренаж и залив бака выключены напрямую по пинам (не через возможно мёртвый PCF8574);
- интерфейс бота свёрнут до отчёта и единственной кнопки «Перезагрузка» — починив контакт, систему можно поднять прямо из чата.
Ночью и в дождь полив останавливается, если это запрещено в настройках. Исключения: каналы «всегда ВКЛ» и режим «парник» продолжают полив под дождём (но не ночью). При наступлении ночи подаётся сигнал заполнения ёмкости — за ночь вода прогреется к утреннему поливу.
При открытии любого клапана насос включается минимум на 30 секунд для стабилизации давления. Дальше — по настройке: либо выключается, либо продолжает работать, пока открыто N и более клапанов:
Пролив дренажа также идёт с включённым насосом. Фактическое состояние насоса и причина всегда видны в Статусе.
Если полив не шёл более 5 часов, при открытии первого клапана автоматически запускается пролив дренажа на 12 секунд — сброс накопившейся ржавчины из труб, чтобы не засорялись форсунки. Ручной запуск: Управление → Пролив дренажа.
На общей магистрали стоит импульсный датчик потока (YF-S201). Система считает расход за сессию полива и накопленный итог, а также непрерывно следит за скоростью потока:
Ключевые детали алгоритма:
- после открытия клапана трубы наполняются — поток кратковременно завышен, поэтому система дожидается стабилизации и только потом замеряет;
- эталон «чистого» фильтра запоминается автоматически (разовые выбросы отфильтровываются — новое значение должно продержаться несколько минут);
- замеры при работающем пусковом насосе и заливке бака не учитываются;
- тревога подтверждается несколькими окнами замера подряд и повторяется не чаще раза в сутки.
/configuration.dat — конфигурация системы (бинарная)
/ГГГГ/ММ/ДД.csv — журнал измерений за день
Каждую минуту в CSV дописывается по строке на канал:
| Колонка | Описание |
|---|---|
UnixTime |
метка времени UNIX |
DateTime |
дата и время в читаемом виде |
Index |
номер канала (1–8) |
Title |
название культуры |
Humidity |
влажность, % |
Valve |
состояние клапана: 1 — открыт, 0 — закрыт |
Border |
порог срабатывания, % |
Night |
ночь: 1/0 |
Rain |
дождь: 1/0 |
Файлы за прошлые годы можно удалить из бота: Настройка → Удаление файлов.
Сбрасывает состояние меню и выводит стартовое меню
Полный статус системы — расшифровка блоков
Останавливает сообщения о событиях на устройстве (действует до перезагрузки)
Возобновляет сообщения о событиях
Перезапускает устройство (с подтверждением)
- Список — зарегистрированные пользователи (идентификаторы и роли)
- Повышение — Пользователь → Администратор
- Понижение — Администратор → Пользователь (владельца понизить нельзя)
- Удаление — удаление пользователя (владельца удалить нельзя)
- Режим работы — режим каждого клапана: ✅ постоянно включен · ⛔ постоянно выключен · 🤖 автоматический по влажности · 🏠 парник (авто, работает и при дожде); кнопка «Установить для всех»
- Названия — имя выращиваемой культуры для каждого канала
- Пороги срабатывания — порог влажности каждого клапана в %
- Расход воды — литры за сессию и накопленный итог; стирание данных
- Пролив дренажа — ручной запуск пролива (12 секунд)
- Поиск датчика — определить номер датчика по замерам в воде и насухо
- Графики
- Файл за вчера — CSV-файл с измерениями за вчера
- Файл текущий — CSV-файл за сегодня
- Файл за дату — CSV-файл за выбранный день
- Работа ночью — разрешить/запретить полив ночью
- Работа под дождём — разрешить/запретить полив в дождь
- Дельта влажности — половина гистерезиса вокруг порога, % (0–100, по умолчанию 5)
- Дельта калибровки — запас у границ калибровки датчиков, ед. АЦП (0–2048, по умолчанию 15). Используется и как запас при авто-калибровке границ
- Авто-калибровка без задержки — двигать границу сразу по первому замеру за ней. По умолчанию выключено: граница двигается, только если превышение держится 3 замера подряд (3 мин) — так одиночный выброс АЦП не портит калибровку. Включайте, только если нужна мгновенная реакция
- Насос давления — держать насос при ≥ N открытых клапанах (1–8); 9 — только пусковые 30 с
- Порог фильтра — % от скорости «чистого» фильтра, ниже которого тревога (10–90, по умолчанию 50)
- Фильтр прочищен — сброс эталона после чистки, система замерит его заново
- Таймаут Telegram — через сколько секунд без связи считать её потерянной (120–3600, по умолчанию 180). Увеличьте, если приходит много сообщений о кратковременных обрывах связи
- Калибровка — пошаговая калибровка датчика: замер в воде, затем насухо
- Ручная калибровка — ввод граничных значений АЦП парой
мин,макс - Сброс настроек — возврат к заводским установкам
- Удаление файлов — удаление архивов измерений за прошлые годы
- Возьмите готовый файл со страницы релизов (собирается автоматически в GitHub Actions) — или соберите сами (
Скетч → Экспорт бинарного файлав Arduino IDE):DripIrrigation.ino.bin— обычный (~1.3 МБ);DripIrrigation.ino.bin.gz— сжатый (~0.8 МБ), удобнее по мобильному интернету — устройство распакует его само.
- Отправьте файл в чат боту от имени владельца
- Устройство скачает файл, обновится и перезагрузится; после старта придёт сообщение «🚀 Система запущена! Прошивка 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-лицензией; уведомления об авторстве в них сохранены.