Датчик влажности почвы на Arduino: подключение и полив
Полив «через день по будильнику» ломается о реальность: солнечное окно сушит горшок за сутки, а пасмурная неделя топит корни. Первый ответ маркетплейса — резистивный щуп с двумя голыми «граблями»: через месяц в земле он окисляется, показания плывут, и поливалка начинает топить или сушить по настроению. Ёмкостный щуп (платы версии v1.2 на маркетплейсах полно под этим номером) лишён главного дефекта: измеряющая плата изолирована от грунта, ток по электродам не течёт, окисляться нечему.
Ниже — подключение на A0, калибровка двумя эталонами (сухой воздух и стакан воды), пороги полива с гистерезисом и скетч, который гоняет помпой через реле. Щуп «Датчик влажности почвы» уже лежит в палитре «Макетка» нашего симулятора: ползунок влажности от 0 до 100 %, и analogRead видит его так же, как реальный щуп.
Ёмкостный против резистивного: почему один ржавеет, а второй нет
Резистивный щуп меряет сопротивление грунта между двумя оголёнными электродами. Между ними течёт ток, а грунт с водой — электролит: электроды электролизуются и покрываются окислом, сопротивление растёт, и через пару месяцев «мокрый» горшок выглядит сухим. Показания к тому же зависят от удобрений и кислотности. Ёмкостный щуп меряет ёмкость: плата залита изолятором, гальванического контакта с грунтом нет, изнашивается только защитный слой. Модуль питается от 3,3-5,5 В, выход аналоговый — читается голым analogRead без единой библиотеки. Важная честная оговорка: направление шкалы зависит от модуля. У резистивных щупов сухо — значения высокие (разомкнутая цепь с подтяжкой), у ёмкостных встречаются обе полярности. В симуляторе шкала такая: сухо (0 %) даёт 850, вода (100 %) даёт 300. Снимите два эталона своим щупом — и пороги в скетче подставите свои.
Подключение: три провода и A0
- VCC — на 5 В (3,3 В тоже работает, шкала чуть уже), GND — на землю.
- AOUT — на любой аналоговый вход, A0-A5; дальше только analogRead.
- Не втыкайте щуп глубже электронного блока: мочить плату с компонентами нельзя, рабочая зона — заштрихованная часть штыря.
- Провод до платы делайте коротким: аналоговый вход на длинном проводе ловит помехи от помпы и подсветки.
Калибровка: два замера и здравый смысл
Калибровка ёмкостного щупа — это два числа, снятые вашим экземпляром: щуп в воздухе (эталон «сухо») и щуп в стакане воды (эталон «вода»). Всё между ними — грунт разной мокрости. Дальше здравый смысл: свежеполитый горшок стоит примерно на трети пути от воды к сухому, а «полить уже» — ближе к сухому краю. В симуляторе шкала зашита линейно: raw = 850 − влажность × 5,5, и таблица ниже показывает, какие числа ждать на каких ползунках.
| Замер | Влажность | analogRead в симуляторе | Что делает скетч |
|---|---|---|---|
| Щуп в воздухе | 0 % | 850 | калибровочная точка «сухо» |
| Сухой грунт | 15-25 % | 710-770 | выше порога — пора поливать |
| Свежеполитый горшок | 60-70 % | 465-520 | ниже порога — насос спит |
| Стакан воды | 100 % | 300 | калибровочная точка «вода» |
Пороги с гистерезисом: чтобы реле не трещало без остановки
Влага в горшке распределяется неровно, и показания дрожат на десяток-другой единиц, когда вода впитывается. Если писать «raw больше 650 — поливай», реле будет щёлкать туда-сюда у самой границы: включили — грунт намок — выключили — подсох — включили. Рабочая пара порогов выглядит так: полив включаем, когда raw выше 700 (сухо), а выключаем, когда он опустился ниже 650 (мокро). Зона в 50 единиц шире дрожи, реле щёлкает дважды за полив, а не пятьдесят раз в минуту. Тот же приём разобран в аквариумном термостате — там гистерезис спасает компрессор, тут — помпу.
Скетч: поливалка с гистерезисом
В симуляторе добавьте из палитры «Макетка» карточку «Датчик влажности почвы»: она привяжется к A0 по первому analogRead (авто-детект ищет в скетче analogRead и слова soil, moist или влажн). Двигайте ползунок: 0 % — raw 850, помпа включается; 60 % — raw 520, помпа выключается. Помпу на реальной плате вешайте только через реле-модуль: ножка Arduino отдаёт максимум 40 мА, мотору этого мало и опасно.
const byte PIN_SOIL = A0; // ёмкостный щупconst byte PIN_POMPA = 8; // реле помпыconst int SUHO = 700; // суше этого — поливаемconst int ZAPAS = 50; // гистерезис: мокрее SUHO - ZAPAS — стоп void setup() { pinMode(PIN_POMPA, OUTPUT); Serial.begin(9600);} void loop() { int raw = analogRead(PIN_SOIL); if (raw > SUHO) digitalWrite(PIN_POMPA, HIGH); // сухо — поливаем if (raw < SUHO - ZAPAS) digitalWrite(PIN_POMPA, LOW); // мокро — стоп Serial.print("raw="); Serial.print(raw); if (digitalRead(PIN_POMPA) == HIGH) Serial.println(" poliv ON"); else Serial.println(" poliv OFF"); delay(500);}Направление шкалы не влияет на логику: если ваш щуп в воде даёт большие значения, поменяйте сравнения местами или подставьте свои пороги — структура скетча та же. Дальше по проекту два пути: расписание и зоны — в уроке про автополив на RTC, реле и датчике почвы, а вся система с насосом и баком — в лендинге про автополив целиком. Порог с кнопки удобно крутить ручкой: у нас есть лендинг про энкодер KY-040.