Автоматический полив комнатного растения
Устройство измеряет влажность почвы ёмкостным датчиком. Когда почва становится суше заданного порога, Arduino включает пяти-вольтовую помпу на две секунды. После полива программа ждёт не менее 30 минут, чтобы вода успела распределиться и система не залила растение.

Фото работающей сборки: GadhaGod, Arduino Project Hub.

Схема из исходного проекта показывает назначение выводов A4 и D12. В нашей сборке помпа получает питание от отдельного источника 5 В; точное соединение приведено ниже.
Что получится
Система обслуживает один горшок и использует только безопасное низкое напряжение 5 В. В монитор порта выводятся:
raw=517 moisture=34% pump=OFF
Watering for 2000 ms
raw=462 moisture=52% pump=OFF
Числа DRY_VALUE и WET_VALUE обязательно определяются для своего датчика и грунта. Готового универсального порога не существует.
Детали
| Деталь | Количество | Точная конфигурация |
|---|---|---|
| Arduino Nano | 1 | ATmega328P, 5 В |
| Ёмкостный датчик влажности почвы | 1 | Capacitive Soil Moisture Sensor v1.2, аналоговый выход AOUT |
| Релейный модуль 5 В | 1 | один канал, активный LOW, вход IN |
| Погружная помпа | 1 | DC 5 В, ток не более возможности источника |
| USB-источник 5 В для Arduino | 1 | сертифицированный готовый блок или power bank |
| Источник 5 В, не менее 2 А, для помпы | 1 | отдельный готовый USB-блок |
| Диод 1N5819 | 1 | защита от выброса мотора |
| Силиконовая трубка | 1 | подходит к штуцеру помпы |
| Резервуар для воды | 1 | устойчивый, с крышкой |
| Макетная плата и провода | 1 набор | сигнальная часть |
| Стяжки или держатель трубки | несколько | фиксация у горшка |
Нужны мультиметр, отвёртка и мерный стакан. Если у помпы нет проводов или разъёма, пайку выполняйте со взрослым.
Безопасность рядом с водой
- Используйте только помпу 5 В постоянного тока. Не применяйте сетевую помпу 220 В.
- Не вскрывайте USB-блоки питания.
- Arduino, реле, соединения и адаптеры должны находиться выше уровня воды и вдали от горшка.
- На кабелях сделайте «капельную петлю»: нижняя точка провода должна быть ниже платы, чтобы вода не стекала к электронике.
- Перед перестановкой трубки, датчика или горшка отключайте оба источника питания.
- Резервуар ставьте ниже горшка. Иначе после отключения помпы вода может продолжить течь самотёком.
- Первый запуск выполняйте над раковиной или поддоном.
Механическая сборка
- Наденьте трубку на выход помпы.
- Опустите помпу в резервуар и выведите трубку через крышку.
- Закрепите конец трубки над почвой, а не у стебля. Он не должен выскочить при запуске.
- Установите датчик в грунт примерно на две трети чувствительной части.
- Не погружайте в землю верхнюю кромку платы с электронными компонентами.
- Разместите Arduino и реле на отдельной сухой подставке.
- Подпишите два USB-источника: логика и помпа.
Схема сигнальной части
| Откуда | Куда |
|---|---|
| Arduino 5V | датчик VCC |
| Arduino GND | датчик GND |
| датчик AOUT | Arduino A4 |
| Arduino 5V | реле VCC |
| Arduino GND | реле GND |
| Arduino D12 | реле IN |
Цифровой выход DOUT датчика не подключайте: программа использует непрерывное аналоговое значение AOUT.
Схема помпы
Контакты COM, NO и NC реле электрически отделены от входа IN.
| Откуда | Куда |
|---|---|
| плюс отдельного источника помпы 5 В | реле COM |
| реле NO | плюс помпы |
| минус помпы | минус отдельного источника |
| катод диода 1N5819, сторона с полосой | плюс помпы |
| анод диода 1N5819 | минус помпы |
Используется контакт NO — normally open, «нормально разомкнут». Пока Arduino выключена, цепь помпы разомкнута.
У двух источников 5 В не надо соединять плюсы. Контакты реле коммутируют отдельную цепь помпы.
Проверка реле и помпы
Пока не устанавливайте трубку в горшок. Направьте её в мерный стакан и загрузите тест:
const byte RELAY_PIN = 12;
const byte RELAY_ON = LOW;
const byte RELAY_OFF = HIGH;
void setup() {
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, RELAY_OFF);
delay(3000);
digitalWrite(RELAY_PIN, RELAY_ON);
delay(1000);
digitalWrite(RELAY_PIN, RELAY_OFF);
}
void loop() {
}
После включения должна быть пауза три секунды, затем помпа работает одну секунду и останавливается. Если реле действует наоборот, поменяйте местами значения RELAY_ON и RELAY_OFF.
Измерьте объём воды в стакане. Если одна секунда даёт слишком много воды для горшка, в основной программе уменьшите WATERING_MS.
Калибровка датчика
Загрузите программу:
const byte SENSOR_PIN = A4;
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println(analogRead(SENSOR_PIN));
delay(500);
}
- Подготовьте образец того же сухого грунта, который находится в горшке.
- Установите датчик на рабочую глубину, подождите минуту и запишите десять значений.
- Их среднее — DRY_VALUE.
- Полностью увлажните второй образец грунта и дайте лишней воде стечь.
- На той же глубине запишите десять значений. Их среднее — WET_VALUE.
- Обычно сухое значение выше влажного. Если у вас наоборот, функция преобразования всё равно работает, если числа записаны в правильные переменные.
Не калибруйте «сухое» состояние в воздухе: воздух и сухой грунт дают разные результаты.
Программа
Замените примерные DRY_VALUE и WET_VALUE своими результатами. Для первого испытания используйте воду и пустой горшок или растение, небольшой дополнительный полив которому не повредит.
const byte SENSOR_PIN = A4;
const byte RELAY_PIN = 12;
const byte RELAY_ON = LOW;
const byte RELAY_OFF = HIGH;
const int DRY_VALUE = 620; // заменить результатом калибровки
const int WET_VALUE = 320; // заменить результатом калибровки
const int START_WATERING_PERCENT = 35;
const unsigned long WATERING_MS = 2000;
const unsigned long MEASUREMENT_PERIOD_MS = 5000;
const unsigned long MIN_PAUSE_MS = 30UL * 60UL * 1000UL;
unsigned long lastMeasurementAt = 0;
unsigned long lastWateringAt = 0;
bool wateredAtLeastOnce = false;
int readMoisturePercent() {
long sum = 0;
for (byte i = 0; i < 10; i++) {
sum += analogRead(SENSOR_PIN);
delay(10);
}
int raw = sum / 10;
int percent = map(raw, DRY_VALUE, WET_VALUE, 0, 100);
percent = constrain(percent, 0, 100);
Serial.print("raw=");
Serial.print(raw);
Serial.print(" moisture=");
Serial.print(percent);
Serial.print("%");
return percent;
}
void waterOnce() {
Serial.print(" Watering for ");
Serial.print(WATERING_MS);
Serial.println(" ms");
digitalWrite(RELAY_PIN, RELAY_ON);
delay(WATERING_MS);
digitalWrite(RELAY_PIN, RELAY_OFF);
lastWateringAt = millis();
wateredAtLeastOnce = true;
}
void setup() {
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, RELAY_OFF);
Serial.begin(9600);
Serial.println("Automatic watering ready");
}
void loop() {
unsigned long now = millis();
if (now - lastMeasurementAt < MEASUREMENT_PERIOD_MS) return;
lastMeasurementAt = now;
int moisture = readMoisturePercent();
bool pauseFinished =
!wateredAtLeastOnce || now - lastWateringAt >= MIN_PAUSE_MS;
if (moisture <= START_WATERING_PERCENT && pauseFinished) {
waterOnce();
} else {
Serial.println(" pump=OFF");
}
}
Первый запуск
- Отключите питание помпы и включите только Arduino.
- Откройте монитор порта на 9600 бод. Проверьте, что процент увеличивается во влажной почве.
- Убедитесь, что при старте реле не включает помпу.
- Поместите трубку в мерный стакан, подключите питание помпы и выполните один сухой тест.
- Измерьте поданный объём. Измените WATERING_MS так, чтобы один импульс давал небольшую порцию.
- Закрепите трубку в горшке и поставьте поддон.
- Первые сутки не оставляйте систему без наблюдения. Сравните показания до полива, через 10 минут и через час.
Настройка для растения
Порог 35 % — стартовое учебное значение, а не агрономическая норма. Подходящий диапазон зависит от растения, грунта, глубины датчика и размера горшка.
Меняйте только один параметр за раз:
- START_WATERING_PERCENT — насколько сухой должна стать почва;
- WATERING_MS — размер одной порции;
- MIN_PAUSE_MS — минимальный интервал между порциями.
Начинайте с короткого полива и длинной паузы. Увеличивать порцию следует только после наблюдения за тем, как вода распределяется в конкретном горшке.
Диагностика
| Симптом | Что проверить |
|---|---|
| Значение всегда 0 или 1023 | питание датчика, AOUT на A4, целостность провода |
| Процент уменьшается во влажной почве | DRY_VALUE и WET_VALUE записаны не в те переменные |
| Реле включено сразу после сброса | активный уровень конкретного модуля и начальный RELAY_OFF |
| Реле щёлкает, помпа молчит | отдельное питание помпы, COM и NO, полярность и наличие воды |
| Arduino перезагружается при пуске | помпа случайно питается от Arduino; разделите источники |
| Вода течёт после отключения | резервуар стоит выше горшка; опустите его и разорвите сифон |
| Система поливает слишком часто | увеличьте MIN_PAUSE_MS и повторите калибровку в грунте |
Практика
- Измерьте объём воды за 0,5; 1 и 2 секунды. Сделайте по три опыта.
- Запишите влажность сразу после полива, через 10, 30 и 60 минут.
- Переставьте датчик ближе и дальше от трубки и сравните показания.
Проверьте себя
- Почему помпу нельзя питать от Arduino?
- Зачем используется контакт NO?
- Почему сухое значение измеряют в грунте, а не в воздухе?
- Для чего нужна минимальная получасовая пауза?
- Как положение резервуара может вызвать самотёк?
Словарь статьи
- Ёмкостный датчик — датчик, оценивающий влажность по изменению электрической ёмкости рядом с грунтом.
- Реле — управляемый электрический переключатель.
- COM — общий контакт реле.
- NO — контакт, разомкнутый при выключенном реле.
- Обратный диод — диод, подавляющий выброс напряжения при остановке мотора.
- Сифон — самотёк жидкости по трубке после запуска потока.
Связанные темы
Источники
- Arduino Project Hub: Fully Automatic Plant Watering System — исходная сборка, фотография и схема.
- Arduino Project Hub: Automated Irrigation System — дополнительный пример с ёмкостным датчиком, реле и помпой.
- DFRobot Wiki: Capacitive Soil Moisture Sensor — подключение и калибровка датчика.
- Arduino Language Reference: analogRead — чтение аналогового входа.