Датчик влажности почвы YL-69 и Arduino: подключение, калибровка, автополив
YL-69 — вилка с двумя дорожками и плата с компаратором LM393. Чем влажнее земля между дорожками, тем меньше сопротивление и тем выше значение на аналоговом выходе. Цифровой выход срабатывает по порогу с подстроечника — удобно для реле насоса без всякого кода.
Датчик стоит копейки и есть в каждом наборе, но у него один известный недостаток: дорожки зонда под постоянным током разъедает электролизом за несколько недель. Для проекта на сезон — подавать питание только на время замера или взять ёмкостный датчик.
Схема подключения
Распиновка
| Провод | Куда и зачем |
|---|---|
| VCC | 3,3–5 В. |
| GND | Земля. |
| DO | Цифровой выход компаратора, порог с подстроечника. |
| AO | Аналоговый выход на A0–A5. |
| Два контакта к зонду | Соединяются с вилкой двумя проводами из комплекта, полярность не важна. |
Характеристики
- Компаратор
- LM393
- Питание
- 3,3–5 В
- Ток
- около 5 мА при замере
- Выходы
- аналоговый и цифровой
- Зонд
- 70 × 20 мм, две дорожки
- Плата
- типовая, как у датчика дождя
Калибровка в проценты
Значение analogRead ничего не значит само по себе. Запишите два числа: датчик в воздухе — это «ноль процентов», датчик в стакане воды — «сто». В скетче ниже они называются DRY и WET; поставьте свои, и map растянет всё между ними в проценты.
Для реального горшка полезнее две другие точки: земля через день после полива и земля, которую пора поливать. Тогда порог для насоса ставится в процентах осмысленно.
Библиотека
не нужна— analogRead и map — вся математика.
Готовый скетч
// YL-69: питание с вывода 7 только на время замера, чтобы зонд не гнил
const int POWER_PIN = 7;
const int SENSOR_PIN = A0;
// Ваши значения после калибровки: в воздухе и в воде
const int DRY = 1010;
const int WET = 350;
int readMoisture() {
digitalWrite(POWER_PIN, HIGH);
delay(100); // датчику нужно стабилизироваться
int raw = analogRead(SENSOR_PIN);
digitalWrite(POWER_PIN, LOW);
int percent = map(raw, DRY, WET, 0, 100);
return constrain(percent, 0, 100);
}
void setup() {
Serial.begin(9600);
pinMode(POWER_PIN, OUTPUT);
digitalWrite(POWER_PIN, LOW);
}
void loop() {
int moisture = readMoisture();
Serial.print("Влажность почвы: ");
Serial.print(moisture);
Serial.println(" %");
if (moisture < 30) {
Serial.println("Пора поливать");
}
delay(60000UL); // раз в минуту
}Скетч собирается arduino-cli под Arduino UNO
Вывод 7 здесь вместо 5V: пять миллиампер датчика он тянет, а зонд под током находится сотую долю времени.
Частые ошибки
Показания уплыли за две недели
Зонд окислился: дорожки потемнели, сопротивление выросло. Это судьба резистивного датчика под постоянным током. Питание только на время замера продлевает жизнь в разы; ёмкостный датчик — навсегда.
В воде показывает не 100 %
Калибровка: значение в воде другое из-за минерализации, длины проводов, напряжения. Перемерьте DRY и WET на своём датчике.
Цифровой выход всегда единица
Порог на подстроечнике выкручен. Крутите, пока светодиод DO не начнёт переключаться при переходе зонда из воздуха в землю.
Разные горшки — разные цифры
Сопротивление зависит от почвы и глубины. Калибруйте каждый датчик в своём горшке и не сравнивайте абсолютные значения.
Что понадобится
- Датчик влажности почвы YL-69 (FC-28) с платой
- Arduino UNO
- Провода «папа-мама»
- Для автополива — модуль реле и помпа на 5 В