Введение
Почвенный модуль (датчик влажности почвы) — новый для этого расширенного цикла модуль, естественно дополняющий уже разобранный фоторезисторный модуль для построения системы мониторинга условий выращивания растений — освещённость и влажность почвы вместе дают значительно более полную картину, чем любой из параметров по отдельности.
Концепция
Почвенный модуль определяет влажность почвы через измерение электрического сопротивления между двумя металлическими зондами, погружёнными в грунт — сухая почва имеет высокое сопротивление (хуже проводит ток между зондами), влажная — низкое; большинство модулей этого типа дают как аналоговый выход (пропорциональный фактической влажности) и цифровой выход (простой порог «сухо/влажно» по сравнению с настраиваемым потенциометром на самом модуле). В сочетании с фоторезистором можно построить систему, реагирующую и на освещённость, и на влажность одновременно — например, автоматический полив, активируемый только при недостаточной влажности, и дополнительная подсветка, активируемая при недостаточном естественном освещении.
Пример кода
// Считывание аналогового и цифрового выхода почвенного модуля
const int SOIL_ANALOG_PIN = A0;
const int SOIL_DIGITAL_PIN = 2;
const int LIGHT_SENSOR_PIN = A1; // фоторезисторный модуль
void setup() {
Serial.begin(9600);
pinMode(SOIL_DIGITAL_PIN, INPUT);
}
void loop() {
int soilRaw = analogRead(SOIL_ANALOG_PIN);
bool soilDryDigital = digitalRead(SOIL_DIGITAL_PIN); // HIGH обычно означает "сухо" (порог не достигнут)
int lightRaw = analogRead(LIGHT_SENSOR_PIN);
// Калибровка: типичные сырые значения варьируются между конкретными экземплярами модулей —
// эти границы нужно откалибровать для конкретного датчика, опустив его в сухую/влажную почву
int soilMoisturePercent = map(soilRaw, 1023, 300, 0, 100); // 1023 (сухо) -> 0%, 300 (влажно) -> 100%
soilMoisturePercent = constrain(soilMoisturePercent, 0, 100);
Serial.print("SOIL:");
Serial.print(soilMoisturePercent);
Serial.print(",LIGHT:");
Serial.print(lightRaw);
Serial.println();
delay(2000);
}
// Логика автоматического полива на основе влажности почвы — управление реле насоса
const int PUMP_RELAY_PIN = 7; // релейный модуль, аналогично статье 300
const int MOISTURE_THRESHOLD = 30; // процент, ниже которого активируется полив
void checkAndWaterIfNeeded(int soilMoisturePercent) {
static unsigned long lastWateringTime = 0;
const unsigned long MIN_WATERING_INTERVAL = 3600000UL; // не чаще раза в час — защита от перелива
if (soilMoisturePercent < MOISTURE_THRESHOLD &&
millis() - lastWateringTime > MIN_WATERING_INTERVAL) {
digitalWrite(PUMP_RELAY_PIN, HIGH);
delay(3000); // короткий, ограниченный по времени полив
digitalWrite(PUMP_RELAY_PIN, LOW);
lastWateringTime = millis();
}
}
Пояснения к коду
map(soilRaw, 1023, 300, 0, 100) показывает типичную калибровку аналогового почвенного датчика — конкретные граничные значения (1023 для полностью сухого состояния, 300 для влажного) варьируются между конкретными физическими экземплярами модулей даже одной модели, и эти значения нужно определить эмпирически для конкретного используемого датчика (поместив его в заведомо сухую почву и в воду, и записав соответствующие показания), а не использовать общие, «типичные» значения без проверки. checkAndWaterIfNeeded() показывает важную защитную меру — MIN_WATERING_INTERVAL, предотвращающую повторный полив слишком часто, даже если влажность почвы остаётся ниже порога (например, из-за того, что влага ещё не успела равномерно распределиться по грунту после предыдущего полива) — без этой защиты система рисковала бы переливом растения.
Подводные камни
- Долговременное воздействие влаги на металлические зонды почвенного датчика без защиты от коррозии — большинство дешёвых модулей этого типа склонны к коррозии открытых металлических контактов при долгом контакте с влажной почвой, что со временем искажает показания (увеличивающееся сопротивление контакта само по себе, независимо от реальной влажности почвы); для долговременного использования стоит рассмотреть более устойчивые к коррозии зонды (с гальваническим покрытием) или периодическую очистку/калибровку датчика.
- Отсутствие индивидуальной калибровки для каждого конкретного экземпляра почвенного модуля, при использовании общих, «стандартных» пороговых значений из примеров в интернете — разброс характеристик между разными физическими экземплярами даже одной модели датчика может быть значительным, и калибровка (определение реальных пороговых значений для «сухо» и «влажно» конкретного датчика в конкретной почве) — необходимый шаг для получения сколько-нибудь точных, осмысленных показаний влажности.
- Игнорирование защиты от перелива (как явно показано в примере через
MIN_WATERING_INTERVAL) при автоматизации полива — без какой-либо защиты от слишком частого срабатывания (например, из-за временного локального пересыхания участка почвы возле конкретного зонда, не отражающего реальную общую влажность) автоматическая система полива рискует залить растение значительно сильнее, чем требуется, что для многих растений значительно опаснее недостатка воды. - Размещение фоторезисторного датчика освещённости в месте, не репрезентативном для реальных условий растения (например, в тени самого корпуса проекта, или под прямым искусственным освещением проекта, искажающим показания относительно реального естественного освещения растения) — физическое размещение датчика освещённости относительно самого растения критично для получения значимых, действительно отражающих условия выращивания показаний.