Автополив теплицы на ESP32: датчик влажности почвы, помпа и реле
Что собираем
Теплица живёт по своему расписанию: вода нужна растениям каждый день, а хозяин бывает раз в неделю. Соберём систему, которая поливает сама: ёмкостный датчик влажности стоит в грядке, ESP32 раз в десять минут опрашивает его, и как только земля суше порога — на несколько секунд включает помпу через реле. Вода берётся из бочки, к растениям идёт шланг с капельницами. Интернет тут не нужен: работает автономно, а Wi-Fi с веб-страницей потом докручивается за вечер.
Комплектующие
Понадобятся четыре вещи. Контроллер — ESP32: 12-битный АЦП под датчик и запас выводов. Датчик — ёмкостный, а не резистивный: у резистивного за месяц электролиза разъедает измерительные полоски, ёмкостный живёт сезонами, мы разбирали это отдельно. Реле — типовой модуль на 5 В с реле Songle SRD-05VDC-SL-C. Помпа — погружной бесщёточный насос JT-500 на 12 вольт: недорого, тихий и с честным паспортом.
Характеристики по паспортам
| Узел | Параметры из паспорта |
|---|---|
| Помпа JT-500 | 12 В (рабочий диапазон 6–12 В), ток 1,2 А, 17 Вт, до 600 л/ч, подъём до 5 м, IP68, ABS, 106×38 мм, 162 г, вода не горячее +40 °C |
| Датчик влажности (типа SEN0193) | питание 3,3–5,5 В, выход 0–3,0 В, ток 5 мА, разъём PH2.0-3P, 98×23 мм, 15 г |
| Реле SRD-05VDC-SL-C | катушка 71,4 мА, 70 Ом ±10%, 0,36 Вт (High Sensitivity); контакты 10 А 250 ВAC / 10 А 30 ВDC, AgCdO; срабатывание ≤10 мс, отпускание ≤5 мс |
| ESP32 (для АЦП) | АЦП 12 бит, отсчёт 0–4095; GPIO34 — только вход; при включённом Wi-Fi драйвер забирает ADC2, поэтому датчик сажаем на ADC1 (GPIO32–39) |
Подключение
- Силовая часть. Плюс адаптера 12 В — на COM реле, NO реле — на коричневый провод помпы, синий провод — на минус адаптера. По паспорту JT-500 коричневый это «+», синий «−», жёлтый не используется; адаптер нужен на ток от 1,5–2 А. Для одной теплицы у этой помпы запас: 600 л/ч — это 10 литров в минуту, а порция полива — треть литра.
- Логика. IN реле — на GPIO26 (Uno: D7), VCC модуля реле — на 5 В, GND — общий между ESP32, реле и минусом адаптера. Без общей земли управляющий сигнал не сработает.
- Датчик. VCC — на 3,3 В, GND — общий, AOUT — на GPIO34 (Uno: A0). Втыкай в землю до линии с компонентами, у корней, пластиной поперёк грядки.
- Питание ESP32. От того же адаптера 12 В через понижающий DC-DC, выставленный на 5,0 В, в пин Vin — подойдёт модуль LM2596.
Код: порог, гистерезис, лимит полива
Включаем полив при 30% влажности, глушим при 45% — гистерезис не даёт помпе щёлкать на границе порога. Льём порциями по две секунды, между порциями читаем датчик. Константы WET_VALUE и DRY_VALUE замерь на своей земле: показание в стакане воды и в сухой земле.
// Автополив теплицы: опрос ёмкостного датчика, полив порциями через реле.
// ESP32: датчик AOUT -> GPIO34, реле IN -> GPIO26
// Uno: датчик -> A0, реле IN -> D7 (Serial 9600)
const int PIN_SOIL = 34; // Uno: A0 (GPIO34 — только вход)
const int PIN_RELAY = 26; // Uno: D7
int DRY_VALUE = 3200; // показание в сухой земле — замерь своё
int WET_VALUE = 1500; // показание в стакане воды
const int PUMP_ON = 30; // сушь: включаем полив ниже 30%
const int PUMP_OFF = 45; // мокро: прекращаем при 45% (гистерезис 15%)
const unsigned long MAX_RUN = 8000UL; // не дольше 8 с за один полив
const unsigned long CHECK_EVERY = 600000UL; // следующий опрос через 10 минут
void setup() {
Serial.begin(115200); // Uno: 9600
pinMode(PIN_RELAY, OUTPUT);
digitalWrite(PIN_RELAY, LOW); // у большинства модулей LOW = «выключено»
}
int moisturePercent() {
long raw = 0;
for (int i = 0; i < 16; i++) { // усредняем 16 отсчётов — датчик шумит
raw += analogRead(PIN_SOIL);
delay(5);
}
raw /= 16;
int pct = map(raw, WET_VALUE, DRY_VALUE, 100, 0);
return constrain(pct, 0, 100);
}
void loop() {
int pct = moisturePercent();
Serial.printf("Влажность: %d%%\n", pct); // Uno: Serial.print по частям
if (pct < PUMP_ON) { // земля пересохла — пора
unsigned long worked = 0;
while (pct < PUMP_OFF && worked < MAX_RUN) {
digitalWrite(PIN_RELAY, HIGH); // 2 секунды льём
delay(2000);
worked += 2000;
digitalWrite(PIN_RELAY, LOW); // пауза: датчик не в струе
delay(1000);
pct = moisturePercent();
}
}
delay(CHECK_EVERY);
}
Частые ошибки
- Сухой ход. Паспорт JT-500 прямо запрещает работать без воды: насос не самовсасывающий и должен стоять на дне бочки под уровнем воды. Висящая на шланге помпа над водой сгорает за минуты — мотор охлаждается водой. При низком уровне бочки добавь поплавковый выключатель в разрыв питания помпы.
- Питают помпу от платы. 1,2 А номинала против 0,5 А у USB-порта: ESP32 уходит в перезагрузку в момент пуска помпы. Только отдельный адаптер, земля общая.
- Датчик под струёй. Капля на датчике — и контроллер видит «болото» и выключается раньше времени. Ставь датчик в 10–15 см от точки полива, а порции по 2 секунды с паузами дают воде разойтись по земле.
- Датчик воткнут на ADC2. На ESP32 при работающем Wi-Fi драйвер занимает ADC2 (GPIO0, 2, 4, 12–15, 25–27) — analogRead с них отдаёт мусор. Датчику место на ADC1: GPIO32–39, причём GPIO34–39 работают только на вход.
- Рле сработало наоборот. Часть модулей активна уровнем LOW: помпа льёт, когда пин в нуле. Проверь свой модуль светодиодом и поменяй HIGH/LOW местами. Контакты бери NO — при старте контроллера, пока пин ещё «плавает», помпа не включится.
- Нет гистерезиса. Один порог 35% даёт бесконечное щёлканье: включился — намочил датчик — выключился — подсох. Два порога, 30 и 45%, лечат это в коде.
Что докрутить
Счётчик воды считается без датчика потока: 2 секунды работы — около трети литра, копи секунды и получишь израсходованный объём. Второй шаг — часы DS3231 и полив только утром и вечером, третий — веб-страница с влажностью и историей, ESP32 для этого не потребует ничего докупать.
Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.