Датчик влажности почвы: подключение к ESP32 и Arduino

Аналоговый датчик влажности

Щуп с двумя дорожками и плата с компаратором: чем влажнее почва, тем ниже напряжение на аналоговом выходе. Годится для автополива и напоминалки «пора поливать».

Как работает

Резистивный датчик измеряет сопротивление между двумя дорожками щупа: влажная почва проводит лучше. Плата модуля превращает его в напряжение на AO и сравнивает с порогом, который задаёт подстроечник: результат — цифровой выход DO.

На модуле с компаратором LM393 напряжение на AO падает, когда почва мокнет, а DO в сухой почве высокий. Абсолютные числа у каждого экземпляра свои, поэтому замеры «в воздухе» и «в воде» снимают сами и переводят их в проценты через map().

Выводы

ВыводНазначение
AOаналоговый выход: ниже напряжение — влажнее
DOцифровой выход компаратора, порог задаёт подстроечник
VCCпитание модуля
GNDобщий провод

Подключение к ESP32

Датчик влажности почвыESP32
AOGPIO34
VCC3V3
GNDGND

Схема из примера «Датчик влажности почвы: когда пора поливать».

Датчик влажности почвы: когда пора поливать

Открыть пример целиком
Код скетча
// Датчик влажности почвы: из сырых отсчётов — в проценты.
//
// У модуля с компаратором LM393 напряжение на AO тем ниже, чем влажнее
// почва. Два числа ниже — это замеры вашего экземпляра: в сухом воздухе
// и в стакане с водой. У каждого датчика они свои, поэтому их снимают
// сами, а не берут из примера.

const int SOIL = 34;
const int LED = 2;

const int RAW_DRY = 4095;   // в воздухе
const int RAW_WET = 0;      // в воде

const int WATER_BELOW = 30; // ниже этого процента пора поливать

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
}

void loop() {
  int raw = analogRead(SOIL);
  int percent = map(raw, RAW_DRY, RAW_WET, 0, 100);
  percent = constrain(percent, 0, 100);

  digitalWrite(LED, percent < WATER_BELOW);

  Serial.printf("сырое значение: %d, влажность: %d %%%s\n",
                raw, percent, percent < WATER_BELOW ? " — пора поливать" : "");
  delay(500);
}

Подключение к Arduino Uno

Датчик влажности почвыArduino Uno
AOA0
VCC5V
GNDGND

Схема из примера «Arduino Uno: датчик влажности почвы».

Arduino Uno: датчик влажности почвы

Открыть пример целиком
Код скетча
// Влажность почвы: из отсчётов АЦП - в проценты.
//
// Напряжение на AO тем ниже, чем почва влажнее. Два числа ниже - замеры
// вашего датчика в сухом воздухе и в стакане с водой; у каждого
// экземпляра они свои.

const int SOIL = A0;
const int LED = 8;

const int RAW_DRY = 1023;   // в воздухе
const int RAW_WET = 0;      // в воде
const int WATER_BELOW = 30; // ниже этого процента пора поливать

void setup() {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop() {
  int raw = analogRead(SOIL);
  int percent = map(raw, RAW_DRY, RAW_WET, 0, 100);
  percent = constrain(percent, 0, 100);

  digitalWrite(LED, percent < WATER_BELOW);

  Serial.print("сырое значение: ");
  Serial.print(raw);
  Serial.print(", влажность: ");
  Serial.print(percent);
  Serial.println(percent < WATER_BELOW ? "% — пора поливать" : "%");
  delay(500);
}

В железе

Электроды резистивного щупа разрушаются от постоянного тока: дорожки покрываются коррозией за недели. Питайте модуль с цифрового вывода и включайте его только на время замера. Погружать щуп можно только до границы дорожек: плата с электроникой должна оставаться сухой. Ёмкостные датчики (с пометкой capacitive) не корродируют, но обычно имеют только аналоговый выход.

Частые ошибки

Другие детали