ESP32 DevKit v1 · pinport
готово
⋮

Автополив и фитолампа на ESP32 с веб-админкой

То же устройство, что на Arduino Nano — фитолампа 230 В по расписанию и два насоса 12 В со своим периодом полива, — но с веб-админкой в прошивке: состояние, расписание, «полить сейчас» и часы по времени браузера прямо со страницы. Экран LCD и ручка энкодера остались; настройки хранятся в NVS.

Что на схеме

Плата ESP32 DevKit v1, к ней подключены:

  • Реле — rl1
  • Реле — rl2
  • Реле — rl3
  • Ввод 230 В — in
  • Автоматический выключатель — qf1
  • Выключатель одноклавишный — sw1
  • Светильник 230 В — la1, тип: импульсный
  • Блок питания 12 В — ps
  • Тумблер — sw2
  • Тумблер — sw3
  • Мотор 12 В — m1
  • Мотор 12 В — m2
  • LCD 16x2 (I2C) — lcd1
  • Часы реального времени DS3231 (I2C) — rtc1
  • Датчик HTU21D: температура и влажность (I2C) — ht1, влажность 45 %, температура 23.5 °C
  • Энкодер KY-040 (ручка с кнопкой) — enc1

Задействованы выводы платы: 3V3, GND, D21, D22, D18, D19, D5, D25, D26, D27. Всего соединений на схеме: 43.

Веб-админка

Страница лежит в самой прошивке — откройте её кнопкой «Веб-интерфейс» над схемой (на железе — по адресу, который показывает последний экран LCD). Она раз в две секунды забирает /api/state и показывает:

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

Ниже — форма расписания: время включения и выключения лампы, у каждого насоса секунды, период, «осталось дней» и час. «Сохранить» пишет всё в NVS сразу. Кнопка «Часы по этому компьютеру» ставит DS3231 по времени браузера — на железе это самый простой способ завести часы.

Всё, что делает страница, — пять адресов, их можно дёргать и без неё (из Home Assistant, curl, скрипта):

  • GET /api/state — состояние в JSON;
  • POST /api/settings — поля формы: lampOn=07:00, lampOff=21:00, s1, period1, left1, hour1 и то же для насоса 2;
  • POST /api/water — p=1 полить, p=1&stop=1 остановить;
  • POST /api/time — epoch=…, секунды местного времени.

Пароль на страницу — константа ADMIN_PASSWORD (логин admin); пустая строка — без пароля. Если своя сеть не подключилась за 15 секунд, плата поднимает точку доступа Greenhouse (пароль greenhouse), и страница открывается по адресу 192.168.4.1.

Экран и ручка

Всё как у версии на Arduino Nano. Верхняя строка — часы, температура, влажность; нижняя листается поворотом:

  • L 07:00-21:00 ON — фитолампа;
  • 1 100s 3d(2) 20h — насос P1: качать 100 секунд, раз в 3 дня, осталось 2 дня (0 — сегодня), в 20:00;
  • 2 60s 2d(1) 08h — насос P2;
  • адрес страницы.

Нажатие — правка: мигает поле, поворот меняет его, следующее нажатие — следующее поле, после последнего настройки сохраняются. Долгое нажатие во время правки — отмена; на экране насоса — полить сейчас или остановить. Правка, начатая на странице, вытесняет правку с ручки — сохраняется то, что нажали последним.

В модели ручкой удобнее управлять с пульта в правом нижнем углу схемы: щёлкните по нему — стрелки ← → поворачивают, пробел нажимает.

Как считается полив

«Осталось дней» уменьшается при смене суток; номер последних суток хранится в NVS вместе с настройками, поэтому сутки, пропущенные выключенным прибором, тоже засчитываются. Когда счётчик дошёл до нуля и наступил час полива, реле насоса включается на заданное число секунд, а счётчик снова становится равен периоду. Прибор, включённый позже часа полива, польёт сразу, а не пропустит день.

Силовая часть

Фитолампа — от сети через автомат qf1, выключатель канала sw1 и реле rl1. Насосы — от блока 12 В через свои выключатели (sw2, sw3) и реле (rl2, rl3). Выключатели стоят последовательно с контактами реле: выключенный канал не заработает, что бы ни решила прошивка. Цепи 230 В и 12 В считаются раздельно, у каждой свой разбор на вкладке «Силовая часть».

Свободные реле модуля — на выводах 32, 33 и 14. Третий насос — третий вывод в RELAY_PUMP и строка в DEFAULT_PUMPS: экран, страница, настройки и полив подхватят его сами.

Чем модель отличается от устройства

  • Питание. Модули I2C и реле в модели запитаны от 3V3. На железе LCD 1602 и модуль реле обычно просят 5 В: питайте их от VIN (5 В от USB или понижающего преобразователя), а входы IN реле и шина I2C 3,3 В им подходят — у модулей свои подтяжки и оптроны.
  • Уровень включения реле. В модели — высокий. Модули с оптронами часто включаются низким — поменяйте RELAY_ON.
  • Автомат qf1 в модели добавлен: линию 230 В без защиты не стоит оставлять и в устройстве.
  • HTU21D в модели отвечает сразу; на железе измерение занимает до 50 мс, и скетч это время ждёт.

Библиотеки

Пример собирается с библиотеками:

  • WiFi
  • WebServer
  • Preferences
  • LiquidCrystal I2C
  • RTClib
  • Adafruit BusIO

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

Как это устроено в коде

Основное, чем пользуется скетч:

  • WebServer — веб-сервер прямо на плате: страницы и обработчики адресов
  • Preferences — хранение настроек во flash, переживает перезапуск
  • RTClib — работа с часами реального времени
  • LiquidCrystal_I2C — текстовый экран 16×2 по двум проводам
  • DS3231 — точные часы с собственным термокомпенсированным генератором
  • digitalRead() — читает уровень на выводе
  • delay() — пауза, на время которой ядро занято ожиданием
  • constrain() — зажимает значение в границах
  • millis() — миллисекунды с запуска: на них строят работу без остановки
  • Serial.printf() — печатает в монитор порта с форматированием
  • Serial.println() — печатает строку в монитор порта
  • digitalWrite() — выставляет на выводе высокий или низкий уровень

В скетче 572 строки; свои функции: loadSettings(), saveSettings(), onEncoder(), htuRead(), readClimate(), lampShouldBeOn(), startPump(), stopPump(); подключено заголовков: 6. Сам скетч открыт на соседней вкладке — его можно менять и запускать заново.

Что попробовать изменить

  1. Нажмите «Запустить»: сценарий дождётся сети, поставит часы на 19:59:40, переведёт ручкой насос P1 на «полить сегодня» — в 20:00 насос на схеме закрутится.
  2. Откройте «Веб-интерфейс»: время, климат, лампа и оба насоса с обратным отсчётом полива. Нажмите «Полить сейчас» у насоса P2 — на схеме закрутится второй мотор.
  3. Поменяйте в форме время выключения лампы на ближайшее и нажмите «Сохранить» — лампа погаснет, а экран LCD покажет новое расписание.
  4. Нажмите «Часы по этому компьютеру»: DS3231 встанет на время вашего браузера — так часы заводят и на железе.
  5. Поставьте пароль в ADMIN_PASSWORD и запустите снова: страница спросит логин admin и пароль.

Смотрите также

← Все примеры галереи

Схема
Проект из галереи — запускать можно, менять нельзя.

      
Сборка ещё не запускалась.

    Печатайте в Serial числа — они станут графиком. Serial.println(t); — один ряд, Serial.printf("t:%.1f h:%.1f\n", t, h); — два с подписями. Формат тот же, что понимает плоттер Arduino IDE.