Август, теплица три на шесть из поликарбоната, томаты на второй кисти. Листья скрутились в трубочки, на нижней стороне завёлся паутинный клещ, бытовой гигрометр показал 35 % — в закрытой теплице при 32 °C воздух высох до состояния пустыни. Я собрал туман: насос, шланг, форсунка-распылитель через реле, датчик DHT22 с порогом ровно 60 %. К вечеру первого дня насос щёлкал каждые две-три минуты, а к третьему я понял, что построил вечный двигатель для реле.
Разгадка оказалась влажной: форсунка распыляет воду в метре от датчика, капли оседают на его решётке, показания взлетают к 80 %, потом сенсор высыхает — и проваливается обратно ниже порога. Термостат с одним порогом каждый раз принимал новое решение, а мокрый сенсор каждый раз был неправ по-своему. Та история стоит двух правил, которые мы здесь и построим: коридор вместо порога — прием из гаражного урока про гистерезис, и пауза после каждого сеанса.
Сразу договоримся о словах. DHT22 меряет влажность воздуха, а не почвы: для земли существует отдельный ёмкостный датчик, и там другая логика с другими порогами. Наш полив — туман в воздух: он поднимает влажность и заодно охлаждает, испарение съедает два-три градуса в жару, когда по индексу жары растениям и без того тяжело. Двойная выгода одним насосом.
Мокрый сенсор: почему показания врут после тумана
Ёмкостный сенсор влажности внутри DHT22 реагирует на увлажнение быстро, за секунды, а на высыхание медленно: плёнка воды на решётке держит завышенные показания минуты. У моего экземпляра после выключения тумана показания возвращаются к реальному воздуху за 60–90 секунд в тёплой теплице и до двух-трёх минут в прохладной. Всё это время датчик отвечает «влажно» по инерции, хотя воздух вокруг уже сухой.
Обратная сторона — быстрое увлажнение: после старта насоса показания взлетают раньше, чем влага реально разошлась по объёму. У форсунки влажно, у дальнего конца теплицы сухо, а датчик сидит где-то посередине и телеграфирует усреднённое. Поэтому решения принимаются не по одному опросу, а по коридору: ниже 60 % включаем, выше 75 % выключаем, и между границами насос не трогаем, сколько бы ни прыгал сенсор.
Ширина коридора здесь не изящество, а выживание: 15 % влажности — это заведомо больше, чем качели мокрого сенсора и погрешность DHT22 вместе взятые. Частота опроса при этом остаётся честной, раз в две секунды: ускорять опрос ради «быстрее среагируем» бессмысленно — интервал опроса ограничен самим сенсором, а не скетчем.
| Показание DHT22 | Диагноз | Действие |
|---|---|---|
| h 35–45 % днём, листья скручены | сухой воздух, клещ доволен | сеансы тумана; светодиод сухости горит |
| h 85–95 % ночью, капли на плёнке | конденсат: плёнка холоднее точки росы | утром проветрить; ночью туман не включать |
| t выше 30 °C, h около 55 % | жара плюс сухость | туман охладит на 2–3 градуса и поднимет влажность |
| h 80 % при t 22 °C после полива почвы | перелив почвы или задохнувшаяся вентиляция | проверить дренаж, приоткрыть дверь |
Таймеры на millis: лимит сеанса и пауза
Два таймера делают насос безопасным. Лимит сеанса — 30 секунд: если за полминуты непрерывного тумана влажность не вышла из коридора, значит кончилась вода, забилась форсунка или соскочил шланг, и молотить насос вхолостую не нужно — скетч выключает его сам и печатает limit=1. У моей форсунки 60 миллилитров в минуту, сеанс укладывается в 30 миллилитров: бочка на двести литров превращается в сотни сеансов, а лимит ловит пустую бочку раньше, чем насос сварится на сухом ходу.
Пауза после сеанса — две минуты тишины, в течение которых включаться нельзя: сенсор высыхает, воздух выравнивается, и следующее решение принимается по настоящему воздуху, а не по капле на решётке. Оба таймера построены на millis без единого delay: насос и датчик должны жить одновременно, а блокирующая пауза превратила бы скетч в оглупевший опросник — механика разобрана в уроке про millis вместо delay.
Светодиод на пине 12 — третий участник, самый дешёвый: горит, когда влажность ниже 60, то есть предупреждает раньше насоса. Между «светодиод загорелся» и «реле щёлкнуло» лежит пауза или лимит — то самое окно, за которое я успеваю посмотреть, не кончилась ли вода, пока беда ещё не случилась.
#include "DHT.h" #define DHTPIN 2#define DHTTYPE DHT22#define PUMP 7 // реле насоса тумана#define LED_DRY 12 // светодиод: воздух сухой #define H_ON 60.0#define H_OFF 75.0#define PUMP_MAX 30000 // сеанс не дольше 30 с#define REST_MS 120000 // пауза после сеанса — сенсор высыхает DHT dht(DHTPIN, DHTTYPE); int pump = 0;int resting = 0;unsigned long pumpStart = 0;unsigned long restStart = 0; void setup() { Serial.begin(9600); pinMode(PUMP, OUTPUT); pinMode(LED_DRY, OUTPUT); digitalWrite(PUMP, LOW); digitalWrite(LED_DRY, LOW); dht.begin(); Serial.println("start: fog 60-75");} void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); digitalWrite(LED_DRY, h < H_ON ? HIGH : LOW); if (pump == 0 && resting == 0 && h < H_ON) { pump = 1; pumpStart = millis(); } if (pump == 1) { if (h > H_OFF) { pump = 0; restStart = millis(); resting = 1; } else if (millis() - pumpStart > PUMP_MAX) { pump = 0; restStart = millis(); resting = 1; Serial.println("limit=1"); } } if (pump == 0 && resting == 1 && millis() - restStart > REST_MS) { resting = 0; } digitalWrite(PUMP, pump == 1 ? HIGH : LOW); Serial.print("h="); Serial.println(h); Serial.print("t="); Serial.println(t); Serial.print("pump="); Serial.println(pump); Serial.print("rest="); Serial.println(resting); delay(1000);}Состояний у автоматики три, и все лежат в четырёх переменных: pump — реле сейчас включено, resting — идёт пауза, pumpStart и restStart — метки, когда началось то или другое. Логика включения лаконична до скучности: воздух сухой, насос выключен, пауза кончилась — включаем. Всё остальное время скетч только проверяет таймеры и границы — ни одного delay на всю петлю.
Выключение срабатывает по двум причинам, и скетч различает их честно: влажность перевалила за 75 — обычное выключение по коридору; истёк лимит в 30 секунд — аварийное, с печатью limit=1. После любого выключения начинается пауза, и это принципиально: даже нормальный сеанс оставляет капли на сенсоре, пауза — единственный способ не принимать решения по мокрым показаниям. Печать h=, t=, pump=, rest= позволяет за минуту наблюдения понять, в какой фазе живёт теплица.
Ночь, дверь и то, что не поместилось в скетч
Полив по влажности воздуха — последняя линия обороны, а не первая. Ночью влажность растёт сама: растения дышат, земля испаряет, плёнка холодеет и собирает конденсат — без единого включения насоса у меня на утро 85–90 %. Это задача не для тумана, а для вентиляции: приоткрытая форточка на ночь делает больше, чем любой насос. А считать, где именно ляжет роса на плёнку, умеет урок про точку росы — по той же паре t и h, которую уже читает наш скетч.
Мой порядок действий в теплице такой: мульча держит почву, вентиляция держит верхнюю границу, туман держит нижнюю. Автоматика двери и форточки — следующий этап, там уже нужны привод и собственная логика. И честная оговорка про цифры: коридор 60–75 % — компромисс для смешанной теплицы; томаты предпочли бы верхнюю границу пониже, огурцы — повыше. Измерьте свою теплицу неделю и подвиньте границы — скетч для этого менять не придётся, только константы.
- Переведите коридор под огурцы — 65–85 % — и понаблюдайте частоту сеансов: коридор стал шире на пять процентов, щелчки реже. Наглядная цена ширины.
- Добавьте счёт сеансов: переменную, которая растёт на единицу при каждом включении насоса, и печать cycles= — за неделю по этому счёту видно, сухое выдалось лето или обычное.
- Пусть светодиод мигает, пока идёт пауза, и горит ровно, когда воздух сухой: два состояния одним диодом, как в уроке про ритмы индикации.
- 1. Почему насос с порогом ровно 60 % щёлкает каждые две-три минуты?
- 2. Зачем пауза две минуты после каждого выключения насоса?
- 3. Насос отработал лимит 30 секунд, а влажность так и не вышла из коридора. Что это значит?
- 4. Что именно меряет DHT22 в теплице?
- 5. Зачем светодиод сухости, если реле и насос уже автоматизированы?
- Коридор влажности 60–75 %: ширина 15 % перекрывает и погрешность сенсора, и качели мокрого сенсора после тумана.
- Пауза две минуты после каждого сеанса — сенсор высыхает, и решения принимаются по воздуху, а не по капле.
- Лимит 30 секунд ловит холостой ход: limit=1 в мониторе — идите проверять бочку и форсунку.
- Оба таймера на millis, без delay: насос и датчик живут одновременно.
- Светодиод сухости на пине 12 предупреждает раньше реле; DHT22 меряет воздух, а не почву, и в теплице живёт под колпачком.
Три урока подряд сложились в одну систему отсчёта: гараж дал коридор, инкубатор — предохранители, теплица — таймеры и уважение к мокрому сенсору. Дальше по этой тропе лежат почвенный датчик и автоматика форточек, а если подключение самого датчика вдруг было пропущено, вернитесь к первому уроку раздела — там распиновка, подтяжка и первые данные.
И про привычку напоследок: любые пороги здесь — стартовая разметка. Моя теплица каждый август корректирует коридор на пару процентов: то жара, то рассада выросла и дышит иначе. Прибор, который пересчитывают под сезон правкой одной строки констант, — нормальный прибор; прибор, который каждый сезон пересобирают, — повод пересмотреть конструкцию.
Частые вопросы по теме урока
- Почему насос с порогом ровно 60 % щёлкает каждые две-три минуты?
- Сенсор увлажняется за секунды и высыхает минуты — вокруг одного порога это вечные качели. Лечится коридором 60–75 и паузой после сеанса, а не заменой насоса. Показания мокрого сенсора качаются: туман поднимает их, высыхание роняет обратно через порог
- Зачем пауза две минуты после каждого выключения насоса?
- После тумана показания возвращаются к реальности за 60–90 секунд, в прохладной теплице дольше. Пауза гарантирует, что следующее решение будет принято по воздуху, а не по мокрому сенсору. Чтобы сенсор высох и воздух выровнялся — иначе решения принимаются по капле на решётке
- Насос отработал лимит 30 секунд, а влажность так и не вышла из коридора. Что это значит?
- Лимит и стоит того, чтобы ловить холостой ход: печать limit=1 — сигнал пойти проверить бочку и форсунку руками, пока насос не сварился. Кончилась вода, забилась форсунка или соскочил шланг — насос работает вхолостую
- Что именно меряет DHT22 в теплице?
- DHT22 — датчик климата воздуха. Для почвы существует отдельный ёмкостный датчик, и логика полива там другая: пороги по земле, дренаж и объём, а не туман по воздуху. Влажность воздуха на высоте установки сенсора
- Зачем светодиод сухости, если реле и насос уже автоматизированы?
- Светодиод — самый дешёвый предсказатель: между его зажиганием и щелчком реле всегда есть окно, за которое можно заметить пустую бочку. Индикация и автоматика отвечают на разные вопросы. Он предупреждает заранее: воздух сухой, но до включения насоса есть окно — пауза или лимит, время проверить воду