Ёмкостный датчик влажности почвы v1.2: почему резистивный датчик сгнивает за месяц
Если у вас когда-то сгнил резистивный датчик влажности почвы — вы не одиноки. Разберёмся, почему это происходит, чем лучше ёмкостный датчик v1.2 и как правильно подключить его к Arduino и ESP32. Модуль также продаётся под артикулом DFRobot SEN0193 — его паспорт (datasheet) я и использую ниже.
Почему резистивный датчик умирает
Классический «датчик влажности почвы» с двумя голыми штырьками работает как омметр: он пропускает ток между электродами и мерит сопротивление грунта. Проблема в физике, а не в качестве изготовления. Постоянный ток между электродами запускает электролиз: ионы пере��осятся от одного штырька к другому, металл разрушается, на электродах растут окислы. Добавьте сюда обычную коррозию голого металла во влажной земле.
Результат знаком каждому, кто ставил такой датчик в горшок: через месяц показания плывут, через два-три датчик либо всегда «сухо», либо всегда «мокро», а на штырьках виден тёмный налёт.
Ёмкостный датчик устроен иначе: его электроды спрятаны под паяльной маской стеклотекстолита и ток через почву не проводят — они работают как обкладка конденсатора. Измеряется ёмкость, а не сопротивление, поэтому электролиза на электродах нет. В паспорте SEN0193 производитель прямо пишет, что модуль «изготовлен из коррозионностойкого материала, что даёт отличный срок службы».
Как это работает внутри
Сердце платы v1.2 — таймер TLC555 (в клонах встречается и NE555, но принципиально это ничего не меняет). Электроды на нижней стороне платы образуют одну обкладку конденсатора; среда между ними — воздух, сухой грунт или влажный грунт с корнями. Чем влажнее земля, тем выше её диэлектрическая проницаемость: у воды она около 80, у сухого грунта — 4–7. Ёмкость растёт, частота генератора TLC555 меняется, а детектор пиков и операционный усилитель превращают её в постоянное напряжение на пине AOUT. Для вас это самый обычный аналоговый датчик: три провода и один вход АЦП, никакие библиотеки не нужны.
Главное направление сигнала: чем ВЛАЖНЕЕ почва, тем НИЖЕ напряжение на AOUT. Это обратная полярность относительно привычных резистивных датчиков, и именно на ней ломается перенос старого кода на новый модуль.
Характеристики из паспорта SEN0193
| Параметр | Значение |
|---|---|
| Напряжение питания | 3,3–5,5 В (стабилизатор на плате) |
| Ток потребления | 5 мА |
| Аналоговый выход | 0–3,0 В |
| Интерфейс | PH2.0-3P (VCC, GND, AOUT) |
| Размер | 98 × 23 мм (3,86 × 0,905 дюйма) |
| Вес | 15 г |
| Совместимость | любой микроконтроллер с АЦП; Raspberry Pi — только через ��нешний АЦП |
Типичный разброс при 5 В питания: около 2,5–2,8 В в сухом воздухе и около 1,2–1,4 В в стакане воды. Точные цифры у каждого экземпляра свои, поэтому калибровка обязательна — см. ниже.
Подключение к Arduino (Uno / Nano)
Схема тривиальна:
Датчик AOUT → A0 Датчик VCC → 5V Датчик GND → GND
// Ёмкостный датчик влажности почвы v1.2, Arduino Uno
const int sensorPin = A0;
int airValue; // показание АЦП в сухом воздухе
int waterValue; // показание АЦП в стакане воды
void setup() {
Serial.begin(9600);
// Калибровка. Сначала датчик лежит в сухом воздухе:
delay(5000);
airValue = analogRead(sensorPin);
Serial.print("Air: "); Serial.println(airValue);
// Затем опускаем до белой черты в стакан с водой:
delay(5000);
waterValue = analogRead(sensorPin);
Serial.print("Water: "); Serial.println(waterValue);
}
void loop() {
int raw = analogRead(sensorPin);
// Чем влажнее земля, тем ниже raw — переворачиваем шкалу:
int percent = map(raw, waterValue, airValue, 100, 0);
percent = constrain(percent, 0, 100);
Serial.print("ADC: "); Serial.print(raw);
Serial.print(" Vlaga: "); Serial.print(percent); Serial.println("%");
delay(1000);
}
map(raw, waterValue, airValue, 100, 0) — ключевой момент: сырые показания АЦП падают при увлажнении, поэтому шкалу переворачиваем вручную. Каждый датчик калибруется отдельно: у китайских экземпляров разброс «сухого» значения достигает нескольких сотен, и калибровка по чужим цифрам даст бессмысленные проценты.
Подключение к ESP32
Датчик AOUT → GPIO34 Датчик VCC → 3.3V Датчик GND → GND
const int sensorPin = 34;
int airValue = 3200; // свои значения после калибровки
int waterValue = 1500;
void setup() {
Serial.begin(115200);
analogReadResolution(12); // 0..4095
}
void loop() {
int raw = analogRead(sensorPin);
int percent = map(raw, waterValue, airValue, 100, 0);
percent = constrain(percent, 0, 100);
Serial.printf("ADC: %d Vlaga: %d%%\n", raw, percent);
delay(2000);
}
Два тонких момента. Первый: подключайтесь к GPIO32–39 (ADC1). Каналы ADC2 на ESP32 при активном Wi-Fi читаются нестабильно — если планируете слать данные по Wi-Fi, держитесь ADC1. Второй: на входе ESP32 допускается не больше 3,3 В, поэтому VCC берём от 3,3 В, хотя модуль работает и от 5 В. При 5 В сухой выход доходит до ~2,8–3,0 В — то есть на самом пределе входного лимита, без запаса. Лучше не рисковать.
Частые ошибки
- Питание от цифрового пина. Ток всего 5 мА, и в батарейных проектах датчик советуют выключать через GPIO. Новички забывают выставить пин в
OUTPUTи HIGH до чтения: модуль выдаёт мусор и выглядит «сломанным». Если делаете так — настройте пин заранее и дайте модулю 100–200 мс на запуск стабилизатора. - Погружение выше белой черты. Белая линия на плате — граница рабочей части. Выше неё стоят электроника и разъём: вода замкнёт цепи и убьёт плату. Датчик должен сидеть в грунте до белой черты, не глубже.
- Длинный провод без фильтрации. Аналоговый сигнал на 2–3 метрах провода ловит наводки от помпы и светодиодных лент. Возле контроллера поставьте конденсатор 0,1 мкФ между AOUT и GND и усредняйте в коде (медиана или среднее из 10 отсчётов).
- Ожидание мгновенной реакции. Вода распределяется в грунте за минуты. Полили горшок — датчик покажет рост через 1–5 минут; это нормально. Быструю проверку делайте стаканом воды, а не лейкой.
- Чужая калибровка. Значения 260/520 из примера DFRobot верны только для их экземпляра при 5 В. У вас будут другие — калибруйте каждый датчик самостоятельно двумя точками: воздух и вода.
Что дальше: от датчика к автополиву
Следующий шаг — автополив: помпа, реле и правило «поливать при влажности ниже 30 %». Как подключить реле-модуль к Arduino и ESP32, разбирал в обзоре реле-модуля, а чтобы полив работал даже при пропадании интернета, к проекту добавляется модуль часов реального времени DS3231. Ёмкостный датчик в таком проекте обязателен: резистивный за первый сезон сгниёт, и автоматика останется без достоверных данных.
Вывод
Модуль v1.2 за 150–250 рублей закрывает вечную боль самодельного автополива. Это простой аналоговый датчик на три провода: без библиотек, без протоколов и без гниющих электродов — он меряет ёмкость, а не ток через металл в почве. Откалибруйте его двумя точками (воздух и вода), не топите выше белой черты — и он переживёт и цветок на окне, и теплицу на даче.
Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.