ELECTRONICS

Датчик влажности почвы YL-69 и Arduino: подключение, калибровка, автополив

Датчики влажности почвы и водыСкетч проверен компиляцией

YL-69 — вилка с двумя дорожками и плата с компаратором LM393. Чем влажнее земля между дорожками, тем меньше сопротивление и тем выше значение на аналоговом выходе. Цифровой выход срабатывает по порогу с подстроечника — удобно для реле насоса без всякого кода.

Датчик стоит копейки и есть в каждом наборе, но у него один известный недостаток: дорожки зонда под постоянным током разъедает электролизом за несколько недель. Для проекта на сезон — подавать питание только на время замера или взять ёмкостный датчик.

Схема подключения

土壤湿度检测+103103103103PWR-LED+DO-LED+VCCGNDDOAO
Наведите на провод или нажмите на него — расскажу, зачем он нужен.

Распиновка

ПроводКуда и зачем
VCC3,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 не начнёт переключаться при переходе зонда из воздуха в землю.

Разные горшки — разные цифры

Сопротивление зависит от почвы и глубины. Калибруйте каждый датчик в своём горшке и не сравнивайте абсолютные значения.

Что понадобится