
Создаём систему автоматического полива на Arduino с датчиком влажности почвы, реле и водяной помпой. Полный код с объяснением, схема подключения и советы для школьного проекта.
Цветы в школьном кабинете или дома часто страдают от забывчивости хозяев. Одни растения заливают, другие засыхают. Система автоматического полива на Arduino решает эту проблему: датчик влажности измеряет состояние почвы, а микроконтроллер включает помпу ровно тогда, когда земля пересохла. Через заданное время помпа выключается, и система ждёт следующего цикла проверки.
Этот проект находится на пересечении электроники и биологии. Ученики осваивают работу с аналоговыми датчиками, управление нагрузкой через реле и написание логики принятия решений. Подходит для 7-10 классов. Результат — реально работающее устройство, которое можно оставить в классе на весь учебный год.

Рекомендуем ёмкостный датчик вместо резистивного: он не имеет открытых металлических контактов и не окисляется от постоянного контакта с влажной землёй. Резистивный датчик прослужит несколько недель, ёмкостный — годы.
Датчик влажности почвы:
Модуль реле:
Водяная помпа:
Светодиод-индикатор:
Важное правило: помпу нельзя питать напрямую от Arduino. Пин 5V на плате рассчитан на небольшой ток, а помпа потребляет 100-300 мА. Внешний источник питания обязателен. Не забудьте соединить GND Arduino и GND внешнего источника — без общей земли реле не сработает.
Датчик погружается в горшок с растением. Помпа опускается в ёмкость с водой. Трубка от помпы направляется в горшок.

```cpp
// Автоматический полив растений на Arduino
// Датчик влажности + реле + помпа
// Пин датчика влажности (аналоговый)
const int soilPin = A0;
// Пин управления реле
const int relayPin = 7;
// Пин светодиода-индикатора
const int ledPin = 8;
// Порог сухости (подбирается экспериментально)
// Ёмкостный датчик: ~300 = мокро, ~600 = сухо
// Резистивный датчик: ~200 = мокро, ~800 = сухо
const int dryThreshold = 600;
// Длительность полива (мс). 4 секунды — для маленького горшка
const unsigned long wateringDuration = 4000;
// Интервал между проверками (мс). 60 секунд
const unsigned long checkInterval = 60000;
// Минимальная пауза после полива для впитывания (мс)
const unsigned long soakTime = 30000;
unsigned long lastCheckTime = 0;
bool justWatered = false;
unsigned long waterEndTime = 0;
void setup() {
pinMode(relayPin, OUTPUT);
pinMode(ledPin, OUTPUT);
// Всё выключено при старте
digitalWrite(relayPin, LOW);
digitalWrite(ledPin, LOW);
Serial.begin(9600);
Serial.println("=== Система автополива ===");
Serial.print("Порог сухости: ");
Serial.println(dryThreshold);
Serial.print("Время полива: ");
Serial.print(wateringDuration / 1000);
Serial.println(" сек");
}
void loop() {
unsigned long now = millis();
// Если только что поливали — ждём, пока вода впитается
if (justWatered) {
if (now - waterEndTime >= soakTime) {
justWatered = false;
Serial.println("Пауза впитывания завершена.");
}
return;
}
// Проверяем почву с заданным интервалом
if (now - lastCheckTime >= checkInterval) {
lastCheckTime = now;
// Считываем датчик влажности
int moisture = analogRead(soilPin);
Serial.print("Влажность: ");
Serial.print(moisture);
if (moisture >= dryThreshold) {
Serial.println(" — СУХО. Включаю полив!");
waterPlant();
} else {
Serial.println(" — норма.");
digitalWrite(ledPin, LOW);
}
}
}
// Функция полива
void waterPlant() {
// Включаем индикатор
digitalWrite(ledPin, HIGH);
// Включаем помпу через реле
digitalWrite(relayPin, HIGH);
Serial.println("Помпа: ВКЛ");
// Поливаем заданное время
delay(wateringDuration);
// Выключаем помпу
digitalWrite(relayPin, LOW);
digitalWrite(ledPin, LOW);
Serial.println("Помпа: ВЫКЛ");
// Запоминаем время окончания для паузы впитывания
justWatered = true;
waterEndTime = millis();
Serial.println("Ожидание впитывания воды...");
}
`
Аналоговый датчик. Функция analogRead() возвращает число от 0 до 1023. Влажная почва хорошо проводит электричество — значение низкое. Сухая почва — плохой проводник, значение высокое. Порог dryThreshold = 600 — отправная точка, которую нужно подобрать для конкретного датчика и типа почвы.
Калибровка. Перед установкой откройте монитор порта. Воткните датчик в мокрую землю — запишите значение (например, 280). Воткните в сухую — запишите (например, 750). Выберите порог посередине — в данном случае около 500-550.
Реле как переключатель. Реле — электромеханический ключ. Когда Arduino подаёт HIGH на пин D7, внутри реле замыкается контакт, и ток от внешнего источника поступает на помпу. Это позволяет слабому сигналу Arduino (5V, 20 мА) управлять мощной нагрузкой.
Пауза впитывания. После полива система ждёт 30 секунд, прежде чем снова проверить почву. Без этой паузы вода не успеет дойти до датчика, и система запустит повторный полив — растение будет залито.
Защита от перелива. Длительность полива ограничена переменной wateringDuration. Даже если датчик выйдет из строя, помпа проработает максимум 4 секунды за один цикл.
Проект отлично подходит для межпредметного занятия: информатика (код), физика (электрические цепи) и биология (потребности растений в воде). Предложите ученикам вести журнал наблюдений: записывать значения влажности до и после полива, строить графики высыхания почвы. Разные группы могут поливать разные растения и сравнить результаты.
Для школьной выставки добавьте LCD-дисплей 16x2 — он покажет текущую влажность и статус системы без компьютера. Продвинутые ученики могут заменить Arduino Uno на ESP32 и отправлять уведомления на смартфон через Wi-Fi, превратив проект в полноценное IoT-устройство.
В Alashed Hardware можно собрать и протестировать схему в виртуальном симуляторе, не рискуя реальными компонентами. CodeStudio позволяет писать и компилировать Arduino-код в браузере, а учитель видит работу каждого ученика в реальном времени и может подсказать, не подходя к каждому компьютеру.
Подключите школу к пилоту. Генерируйте КМЖ за 2 минуты, ведите CodeStudio уроки, заказывайте оборудование — всё в одном месте.