Главная → Готовые проекты

Автополив теплицы на ESP32: датчик влажности почвы, помпа и реле

28 сентября 2026 · Готовые проекты

Что собираем

Теплица живёт по своему расписанию: вода нужна растениям каждый день, а хозяин бывает раз в неделю. Соберём систему, которая поливает сама: ёмкостный датчик влажности стоит в грядке, 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)

Подключение

  1. Силовая часть. Плюс адаптера 12 В — на COM реле, NO реле — на коричневый провод помпы, синий провод — на минус адаптера. По паспорту JT-500 коричневый это «+», синий «−», жёлтый не используется; адаптер нужен на ток от 1,5–2 А. Для одной теплицы у этой помпы запас: 600 л/ч — это 10 литров в минуту, а порция полива — треть литра.
  2. Логика. IN реле — на GPIO26 (Uno: D7), VCC модуля реле — на 5 В, GND — общий между ESP32, реле и минусом адаптера. Без общей земли управляющий сигнал не сработает.
  3. Датчик. VCC — на 3,3 В, GND — общий, AOUT — на GPIO34 (Uno: A0). Втыкай в землю до линии с компонентами, у корней, пластиной поперёк грядки.
  4. Питание 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);
}

Частые ошибки

  1. Сухой ход. Паспорт JT-500 прямо запрещает работать без воды: насос не самовсасывающий и должен стоять на дне бочки под уровнем воды. Висящая на шланге помпа над водой сгорает за минуты — мотор охлаждается водой. При низком уровне бочки добавь поплавковый выключатель в разрыв питания помпы.
  2. Питают помпу от платы. 1,2 А номинала против 0,5 А у USB-порта: ESP32 уходит в перезагрузку в момент пуска помпы. Только отдельный адаптер, земля общая.
  3. Датчик под струёй. Капля на датчике — и контроллер видит «болото» и выключается раньше времени. Ставь датчик в 10–15 см от точки полива, а порции по 2 секунды с паузами дают воде разойтись по земле.
  4. Датчик воткнут на ADC2. На ESP32 при работающем Wi-Fi драйвер занимает ADC2 (GPIO0, 2, 4, 12–15, 25–27) — analogRead с них отдаёт мусор. Датчику место на ADC1: GPIO32–39, причём GPIO34–39 работают только на вход.
  5. Рле сработало наоборот. Часть модулей активна уровнем LOW: помпа льёт, когда пин в нуле. Проверь свой модуль светодиодом и поменяй HIGH/LOW местами. Контакты бери NO — при старте контроллера, пока пин ещё «плавает», помпа не включится.
  6. Нет гистерезиса. Один порог 35% даёт бесконечное щёлканье: включился — намочил датчик — выключился — подсох. Два порога, 30 и 45%, лечат это в коде.

Что докрутить

Счётчик воды считается без датчика потока: 2 секунды работы — около трети литра, копи секунды и получишь израсходованный объём. Второй шаг — часы DS3231 и полив только утром и вечером, третий — веб-страница с влажностью и историей, ESP32 для этого не потребует ничего докупать.

Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.

Читайте дальше

Питание

Понижающий DC-DC LM2596 и повышающий MT3608: обзор и подключение

Зачем два модуля Питание в самоделке почти никогда не совпадает с тем, что даёт источник. У литиевого аккумулятора 3,7 В, а сервоприводу…

Читать обзор →
Связь

nRF24L01+: радиосвязь между платами без Wi-Fi

Когда датчик надо вынести на улицу, в теплицу или в подвал, тянуть провод неудобно, а Wi-Fi там либо не добивает, либо съедает…

Читать обзор →
Датчики

Гироскоп-акселерометр MPU-6050: обзор и подключение

Что это за модуль MPU-6050 — первый массовый IMU-чип, который объединил в одном корпусе трёхосевой гироскоп и трёхосевой акселерометр плюс цифровой термометр.…

Читать обзор →