Как подключить и настроить датчик влажности почвы для Arduino

Иван Корнев·05.05.2026·5 мин

Для подключения датчика влажности почвы к Arduino необходимо соединить выводы питания (VCC, GND) и сигнальный вывод (AO или DO) с соответствующими пинами микроконтроллера. Ключевой момент — использование транзистора или цифрового пина для подачи питания на сенсор только в момент измерения, что предотвращает быструю коррозию металлических щупов. Точные данные получают через аналоговый вход (A0) после предварительной калибровки значений «сухо» и «мокро» в конкретном типе грунта.

Выбор типа сенсора: резистивный или емкостной?

На рынке преобладают два типа датчиков, и выбор зависит от бюджета и долговечности проекта.

Резистивные датчики (модели FC-28, YL-69, HL-69) Самые дешевые и популярные варианты. Принцип работы основан на измерении электропроводности почвы: чем больше воды, тем лучше ток проходит между двумя металлическими зондами.

  • Плюсы: Низкая цена, простота подключения.
  • Минусы: Металлические части быстро окисляются и разрушаются под действием электролиза во влажной среде. Без импульсного питания выходят из строя за 1–3 месяца.

Емкостные датчики (Capacitive Soil Moisture Sensor v1.2, v2.0) Измеряют диэлектрическую проницаемость грунта, не пропуская через него постоянный ток. Зонд покрыт влагозащитным лаком, металл не контактирует с землей напрямую.

  • Плюсы: Высокая точность, отсутствие коррозии, долгий срок службы (годы).
  • Минусы: Стоимость выше (в 3–5 раз), требуют более тщательной калибровки.

Для учебных проектов и краткосрочных тестов подойдет резистивный FC-28. Для реального умного сада или теплицы настоятельно рекомендуется использовать емкостной датчик.

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

Главная ошибка новичков — подача постоянного напряжения 5V на резистивный датчик. Это вызывает реакцию электролиза, превращая воду в почве в агрессивную среду, которая «съедает» зонды за несколько дней.

Вариант 1: Импульсное питание (для резистивных датчиков)

Мы используем цифровой пин Arduino (например, D7) вместо вывода 5V. Пин подает напряжение только на время считывания данных.

Вывод датчикаПодключение к ArduinoНазначение
VCCЦифровой пин (напр., D7)Питание (управляемое)
GNDGNDЗемля
AO (Analog Out)Аналоговый пин (напр., A0)Сигнал уровня влажности
DO (Digital Out)Не используетсяПороговое значение (не нужно при использовании AO)

Вариант 2: Подключение емкостного датчика

Емкостные датчики менее чувствительны к постоянному питанию, но для экономии энергии в автономных проектах схему с управляемым питанием также стоит применить.

Вывод датчикаПодключение к ArduinoНазначение
VCC3.3V или 5V (или цифровой пин)Питание
GNDGNDЗемля
SIG / AOАналоговый пин (напр., A0)Сигнал

Никогда не оставляйте резистивный датчик под напряжением постоянно. Используйте функцию digitalWrite(VCC_PIN, HIGH) только перед замером и LOW сразу после него.

Правильная калибровка в грунте

Заводские значения бесполезны, так как плотность и состав почвы (торф, глина, песок) сильно влияют на проводимость. Калибровку нужно проводить в том грунте, где будет стоять растение.

Алгоритм калибровки:

  1. Загрузка скетча чтения: Загрузите простой код, который выводит «сырые» значения analogRead() в монитор порта.
  2. Точка «Сухо»: Поместите датчик в абсолютно сухой грунт (предварительно просушенный в духовке или на воздухе несколько дней). Запишите среднее значение. Обычно это диапазон 950–1023. Обозначим его VALUE_DRY.
  3. Точка «Мокро»: Полейте грунт до состояния «болота» или опустите датчик в воду (если инструкция к конкретной модели это допускает). Для полевых условий лучше использовать максимально насыщенный водой грунт. Запишите значение. Обычно это 450–600 для резистивных и 200–400 для емкостных. Обозначим его VALUE_WET.

Эти две константы будут использоваться в коде для перевода сырых данных в проценты.

Пример кода: Мониторинг с расчетом процентов

Этот скетч реализует импульсное питание, считывает аналоговый сигнал и конвертирует его в понятные проценты влажности (0% — сухо, 100% — мокро).

// Пины подключения
const int POWER_PIN = 7; // Пин питания датчика
const int SENSOR_PIN = A0; // Аналоговый пин сигнала

// Константы калибровки (ЗАМЕНИТЕ НА СВОИ ЗНАЧЕНИЯ)
const int VALUE_DRY = 1000;  // Значение в сухом грунте
const int VALUE_WET = 550;   // Значение в мокром грунте

void setup() {
  Serial.begin(9600);
  
  // Инициализируем пин питания как выход и сразу выключаем
  pinMode(POWER_PIN, OUTPUT);
  digitalWrite(POWER_PIN, LOW);
}

void loop() {
  // 1. Включаем питание датчика
  digitalWrite(POWER_PIN, HIGH);
  
  // 2. Ждем стабилизации сигнала (для резистивных достаточно 10-50 мс)
  delay(50); 
  
  // 3. Считываем данные
  int sensorValue = analogRead(SENSOR_PIN);
  
  // 4. Выключаем питание для сохранения ресурса датчика
  digitalWrite(POWER_PIN, LOW);
  
  // 5. Преобразуем в проценты
  // map меняет диапазон [VALUE_WET...VALUE_DRY] на [100...0]
  int moisturePercent = map(sensorValue, VALUE_WET, VALUE_DRY, 100, 0);
  
  // Ограничиваем значения, чтобы не выйти за рамки 0-100
  moisturePercent = constrain(moisturePercent, 0, 100);
  
  // 6. Вывод результатов
  Serial.print("Сырое значение: ");
  Serial.print(sensorValue);
  Serial.print(" | Влажность: ");
  Serial.print(moisturePercent);
  Serial.println("%");
  
  // Логика управления (пример)
  if (moisturePercent < 30) {
    Serial.println(">> Требуется полив!");
  }
  
  // Пауза между измерениями (например, 1 час для экономии энергии)
  delay(3600000); 
}

Организация автоматического полива

Для создания полноценной системы автополива к схеме добавляется модуль реле, управляющий насосом.

Логика работы:

  • Если влажность падает ниже порога (например, 30%) — включаем реле насоса.
  • Поливаем фиксированное время (например, 5 секунд) или до достижения порога отключения (например, 80%).
  • Важно добавить гистерезис (разницу между включением и выключением), чтобы насос не «трещал» включениями/выключениями на граничном значении.

Пример логики с гистерезисом

const int PUMP_RELAY_PIN = 8;
const int THRESHOLD_LOW = 30;  // Включить полив при < 30%
const int THRESHOLD_HIGH = 80; // Выключить полив при > 80%

void controlPump(int moisture) {
  static bool isWatering = false;

  if (!isWatering && moisture < THRESHOLD_LOW) {
    digitalWrite(PUMP_RELAY_PIN, HIGH); // Включить насос (зависит от типа реле)
    isWatering = true;
    Serial.println("Насос ВКЛЮЧЕН");
  } 
  else if (isWatering && moisture >= THRESHOLD_HIGH) {
    digitalWrite(PUMP_RELAY_PIN, LOW); // Выключить насос
    isWatering = false;
    Serial.println("Насос ВЫКЛЮЧЕН");
  }
}

Частые ошибки и проблемы

  1. Показания скачут или равны 0/1023.

    • Проверьте качество контакта проводов с зондами датчика (часто плохая пайка на дешевых моделях).
    • Убедитесь, что земля (GND) Arduino и блока питания общая, если используете внешний источник для насоса.
  2. Датчик показывает 100% влажности в сухом воздухе.

    • Замыкание контактов зонда грязью или остатками припоя. Очистите зонды спиртом.
    • Неверная калибровка: перепутаны местами VALUE_DRY и VALUE_WET в функции map().
  3. Быстрое разрушение зондов.

    • Вы забыли отключать питание между измерениями. Резистивные датчики живут долго только при работе в импульсном режиме (скважность 1:1000 и выше).

FAQ

Можно ли использовать один датчик для нескольких растений? Нет. Каждый горшок имеет свой микроклимат и объем земли. Датчик измеряет влажность только в непосредственной близости от своих щупов (радиус 2–3 см).

Почему значения в мониторе порта не меняются? Если вы используете резистивный датчик, попробуйте слегка пошевелить его в земле или полить. Если значения застыли на максимуме или минимуме, проверьте целостность проводов и правильность выбора пина в коде.

Как увеличить точность измерений? Делайте не одно измерение, а серию из 10–20 чтений с интервалом в 1 мс, затем вычисляйте среднее арифметическое. Это сгладит случайные электрические помехи.