Датчик влажности почвы: подключение к ESP32 и Arduino
Аналоговый датчик влажности
Щуп с двумя дорожками и плата с компаратором: чем влажнее почва, тем ниже напряжение на аналоговом выходе. Годится для автополива и напоминалки «пора поливать».
Резистивный датчик измеряет сопротивление между двумя дорожками щупа: влажная почва проводит лучше. Плата модуля превращает его в напряжение на AO и сравнивает с порогом, который задаёт подстроечник: результат — цифровой выход DO.
На модуле с компаратором LM393 напряжение на AO падает, когда почва мокнет, а DO в сухой почве высокий. Абсолютные числа у каждого экземпляра свои, поэтому замеры «в воздухе» и «в воде» снимают сами и переводят их в проценты через map().
Выводы
Вывод
Назначение
AO
аналоговый выход: ниже напряжение — влажнее
DO
цифровой выход компаратора, порог задаёт подстроечник
// Датчик влажности почвы: из сырых отсчётов — в проценты.
//
// У модуля с компаратором 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);
}
// Влажность почвы: из отсчётов АЦП - в проценты.
//
// Напряжение на 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) не корродируют, но обычно имеют только аналоговый выход.
Частые ошибки
Постоянное питание щупа: электроды окисляются, показания уплывают, через месяцы датчик перестаёт работать.
Забыли, что шкала обратная: «большое число» — это сухо, а не мокро.
Замеры не откалиброваны: числа из чужого примера дают проценты, не имеющие отношения к вашему датчику.
Щуп погружён выше границы дорожек: вода попадает на плату и компаратор.