Общие сведения
Датчик влажности почвы с нержавеющими щупами — две иглы в литой пластиковой головке на проводе длиной 1 метр. Пригодится для автополива в горшке, на грядке или в теплице. Иглы уходят в землю, а плата с электроникой остаётся в сухом месте — метра провода хватает, чтобы плата стояла рядом с горшком, а не в земле.
Своей платы и микросхем у датчика нет — это два электрода на двужильном проводе с двухконтактным разъёмом на конце. Показывает он не «влажность в процентах», а проводимость почвы между иглами; для полива хватает двух отметок на своей земле — «сухо» и «полито».
Датчик пассивный: нет вывода Signal (S), цифрового выхода и подстроечника. Число появляется только в вашей схеме — делитель напряжения плюс аналоговый вход, см. «Подключение».
Характеристики
- Тип датчика: кондуктометрический (резистивный), два электрода
- Материал щупов: нержавеющая сталь
- Провод: двужильный, длина 1 м
- Разъём на конце провода: двухконтактный, с защёлкой
- Выход датчика: пассивный, сопротивление между щупами
Напряжение и ток задаёт ваша схема — у самого датчика их нет.
Подключение
Иглы в земле — переменный резистор. Добавляем один постоянный резистор — получается делитель напряжения, и с его середины аналоговый вход Arduino снимает число. Усилитель не нужен: напряжение на входе сразу в вольтах.
Понадобятся Arduino Uno R3, резистор 4,7 кОм из набора резисторов, керамический конденсатор 0,1 мкФ (не обязателен), макетная плата и провода «папа-папа» — паять ничего не нужно. На постоянную установку жилы лучше посадить на винтовой клеммник.
Собираем делитель
- Полярности у жил нет. Игла со стороны питания съедается быстрее — раз в сезон меняйте жилы местами.
- Первую жилу — на цифровой вывод 7: он подаёт питание на щуп только на момент замера. Годится любой, кроме 0, 1 и 13.
- Вторую жилу — в свободный ряд макетной платы. Это средняя точка: из неё резистор 4,7 кОм на GND и провод на A0 (A4 и A5 отданы шине I2C).
- Между A0 и GND у самой платы — конденсатор 0,1 мкФ, только керамика: электролит не успеет зарядиться за паузу в скетче.
- Резистор и конденсатор — у платы, не у щупа. На GND жилы не сажают: обе сигнальные.
Число N = 1023 × R / (R + сопротивление земли): земля мокрее — число больше. С 4,7 кОм замкнутые водой иглы дают 1023, сухая земля со 100 кОм — 46, обрыв провода — 0; свои числа будут другими, на то и калибровка. Зеркально (резистор к питанию, щуп на GND) не собирайте: число перевернётся, а обрыв станет выглядеть как 1023.
Питание на щуп — только с цифрового вывода платы. Отдельный источник нельзя: средняя точка делителя идёт прямо на аналоговый вход, которому по даташиту можно не больше питания платы плюс 0,5 В — 12 В от насоса выжгут вход. У 3,3-вольтовой платы щуп питается её же 3,3 В.
Жилы ведите до платы парой, подальше от проводов насоса: наводку ловит даже метр провода. Не хватило длины — в списке «Модификация» вверху страницы есть тот же датчик с проводом 5 м, или нарастите обе жилы силиконовым проводом и загерметизируйте скрутки.
Почему 4,7 кОм
Коридор — от 1 до 10 кОм. Снизу ограничивает ток вывода при замкнутых водой иглах: 1,1 мА при 4,7 кОм, 5 мА при 1 кОм, предел по даташиту 40 мА — 100 и 10 Ом из набора не ставьте. Сверху — АЦП: ATmega328P (мозг Uno и Nano) просит источник до 10 кОм, а вход «видит» землю параллельно резистору, так что до 10 кОм вы укладываетесь при любой влажности; ближе всего к потолку в наборе как раз 4,7 кОм. На политой земле число упёрлось в 1023 — возьмите 2,2 или 1 кОм. На сухой лежит у нуля — можно попробовать 22 кОм, но только с конденсатором 0,1 мкФ и с delay(25) вместо delay(10) в скетче.
Насос: силовой ключ
Насосу нужны амперы, с вывода платы его не включить. Между платой и насосом ставят силовой ключ N-канал: по его карточке — до 30 В и 10 А постоянного тока. Ключ нижний: плюс насоса — от блока питания напрямую, минус — через ключ, а минус блока питания и GND платы соедините, иначе ключ не откроется. Управляет ключом вывод 8: HIGH — насос включён.
- Резистор 10 кОм с вывода 8 на GND: около секунды после включения вывод висит в воздухе, и только резистор держит насос выключенным. Перед пуском нажмите RESET несколько раз: насос не должен дёргаться.
- Параллельно мотору или катушке клапана — защитный диод, катодом к плюсу. Питание насоса своё, не 5 В платы и не USB.
- Ставите вместо ключа релейный модуль — сверьтесь с его описанием: у многих активный уровень обратный, и тогда HIGH и LOW в скетче надо поменять местами.
- Воду из бочки или канистры подаст мембранный насос; бак ставьте ниже горшка, иначе вода пойдёт самотёком через остановленный насос.
Обрыв провода у пассивного датчика выглядит как очень сухая земля, и автоматика включит насос. Поэтому в скетче полива число ниже 20 считается обрывом: горит светодиод платы, полива нет. Чтобы отличать обрыв наверняка, припаяйте резистор 100 кОм параллельно жилам у самой головки щупа под герметичную термоусадку (не у разъёма: оттуда он скроет обрыв кабеля): целый датчик даже в воздухе покажет не меньше 46, ноль — только обрыв. Отметки после этого снимите заново.
Скетч 1: показания в монитор порта
Залейте скетч, откройте монитор порта и запишите два числа: на сухой земле и после полива, когда вода разойдётся. Это ваши отметки «сухо» и «полито».
const uint8_t pinPower = 7; // Вывод, которым подаём питание на щуп
const uint8_t pinSensor = A0; // Вход, к которому подключена средняя точка делителя
int readSoil(){ // Замер: подали питание, прочитали, сняли питание
uint32_t sum = 0, cnt = 0;
pinMode(pinPower, OUTPUT);
digitalWrite(pinPower, HIGH);
delay(10); // Даём напряжению на делителе устояться
uint32_t t = millis();
while(millis() - t < 20){ // Меряем ровно 20 мс - период сетевой наводки 50 Гц ...
sum += analogRead(pinSensor); // ... и наводка в сумме гасит сама себя
cnt++;
}
digitalWrite(pinPower, LOW);
pinMode(pinPower, INPUT); // Отключаем вывод совсем
return sum / cnt;
}
void setup(){
Serial.begin(9600);
pinMode(pinPower, INPUT);
}
void loop(){
Serial.println(readSoil()); // Чем земля мокрее, тем число больше
delay(2000);
}
Скетч 2: полив по своим отметкам
Подставьте свои levelDry и levelWet из первого скетча. Защиты две: число ниже levelBreak — обрыв, насос не включается; земля не намокла после всех порций — нет воды или слетел шланг, горит светодиод платы, полива нет до перезапуска.
const uint8_t pinPower = 7; // Вывод, которым подаём питание на щуп
const uint8_t pinSensor = A0; // Вход, к которому подключена средняя точка делителя
const uint8_t pinPump = 8; // Вход S силового ключа насоса (HIGH - включить)
const int levelDry = 300; // ВАШЕ число «сухо»
const int levelWet = 600; // ВАШЕ число «полито»
const uint32_t timePump = 5000; // Сколько миллисекунд льём за один раз
const uint8_t maxTry = 4; // Сколько порций подряд за один полив
const int levelBreak= 20; // Ниже - живой земли не бывает, это обрыв провода
bool fault = false; // Авария: насос не включаем
int readSoil(){ // Замер такой же, как в скетче 1
uint32_t sum = 0, cnt = 0;
pinMode(pinPower, OUTPUT);
digitalWrite(pinPower, HIGH);
delay(10);
uint32_t t = millis();
while(millis() - t < 20){
sum += analogRead(pinSensor);
cnt++;
}
digitalWrite(pinPower, LOW);
pinMode(pinPower, INPUT);
return sum / cnt;
}
void setup(){
Serial.begin(9600);
pinMode(pinPower, INPUT);
pinMode(pinPump, OUTPUT);
digitalWrite(pinPump, LOW); // Насос при старте выключен
pinMode(LED_BUILTIN, OUTPUT); // Светодиод платы горит при аварии
}
void loop(){
int soil = readSoil();
Serial.println(soil);
if(soil < levelBreak){ // Обрыв провода или разъёма
fault = true;
Serial.println(F("Датчик не отвечает: обрыв провода или разъём"));
}
if(soil > 1013){ // Почти максимум - щупы замкнуты или залит разъём
Serial.println(F("Щупы замкнуты или залит разъём: полива не будет"));
}
if(!fault && soil < levelDry){ // Аварии нет, а земля суше отметки «сухо» ...
uint8_t i = 0;
while(i != maxTry && readSoil() < levelWet){ // ... льём порциями до отметки «полито»
digitalWrite(pinPump, HIGH);
delay(timePump);
digitalWrite(pinPump, LOW);
delay(120000); // Ждём 2 минуты, чтобы вода дошла до щупа
i++;
}
if(readSoil() < levelWet){ // Вылили всё, а земля не намокла
fault = true;
Serial.println(F("Полив не помог: проверьте воду, насос и шланг"));
}
}
digitalWrite(LED_BUILTIN, fault);
delay(60000); // Проверяем землю раз в минуту
}
Подробнее о датчике
Ток между иглами несут ионы в почвенной влаге: соли, удобрения, минералы грунта. Больше воды в порах — ниже сопротивление. Чего от датчика ждать не стоит:
- Одинаковых чисел в разных горшках: песок, суглинок и торф дадут разное, воздушный зазор у иглы читается как «сухо».
- Независимости от удобрений: после подкормки показания уходят в «влажнее», после промывки грунта — в «суше».
- Чувствительности в пересушенной земле: «сухо» от «совсем сухо» датчик почти не отличает.
- Картины по всему горшку: меряется пятачок между иглами, на грядке ставят несколько точек.
Электролиз понемногу уносит металл с игл в почву, копится налёт, показания дрейфуют. У стальной иглы нет тонкого покрытия, которое протирается насквозь, как у щупа из печатной платы, но и она не вечная. Если открытые электроды в земле мешают, есть емкостной датчик влажности почвы: электроды у него закрыты и, по его карточке, не подвержены коррозии.
Калибровка и уход
- Отметки снимайте на той земле, где датчик будет жить, и заново — после смены грунта, подкормки, промывки земли и чистки игл.
- Иглы — в земле по всей длине, грунт вокруг обожмите; головку и разъём держите выше уровня полива.
- Налёт промойте, при нужде мягкой щёткой. На зиму датчик доставайте, сначала обесточив полив, и тяните за головку, а не за провод.
Комплектация
- 1x Датчик влажности почвы с нержавеющими щупами (провод 1 м);















