Перейти к основному содержимому

Автоматический полив комнатного растения

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

Реальная система автоматического полива в цветочном горшке

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

Опубликованная схема Arduino Nano, датчика влажности, реле и помпы

Схема из исходного проекта показывает назначение выводов 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 Nano1ATmega328P, 5 В
Ёмкостный датчик влажности почвы1Capacitive Soil Moisture Sensor v1.2, аналоговый выход AOUT
Релейный модуль 5 В1один канал, активный LOW, вход IN
Погружная помпа1DC 5 В, ток не более возможности источника
USB-источник 5 В для Arduino1сертифицированный готовый блок или power bank
Источник 5 В, не менее 2 А, для помпы1отдельный готовый USB-блок
Диод 1N58191защита от выброса мотора
Силиконовая трубка1подходит к штуцеру помпы
Резервуар для воды1устойчивый, с крышкой
Макетная плата и провода1 наборсигнальная часть
Стяжки или держатель трубкинесколькофиксация у горшка

Нужны мультиметр, отвёртка и мерный стакан. Если у помпы нет проводов или разъёма, пайку выполняйте со взрослым.

Безопасность рядом с водой

  1. Используйте только помпу 5 В постоянного тока. Не применяйте сетевую помпу 220 В.
  2. Не вскрывайте USB-блоки питания.
  3. Arduino, реле, соединения и адаптеры должны находиться выше уровня воды и вдали от горшка.
  4. На кабелях сделайте «капельную петлю»: нижняя точка провода должна быть ниже платы, чтобы вода не стекала к электронике.
  5. Перед перестановкой трубки, датчика или горшка отключайте оба источника питания.
  6. Резервуар ставьте ниже горшка. Иначе после отключения помпы вода может продолжить течь самотёком.
  7. Первый запуск выполняйте над раковиной или поддоном.

Механическая сборка

  1. Наденьте трубку на выход помпы.
  2. Опустите помпу в резервуар и выведите трубку через крышку.
  3. Закрепите конец трубки над почвой, а не у стебля. Он не должен выскочить при запуске.
  4. Установите датчик в грунт примерно на две трети чувствительной части.
  5. Не погружайте в землю верхнюю кромку платы с электронными компонентами.
  6. Разместите Arduino и реле на отдельной сухой подставке.
  7. Подпишите два USB-источника: логика и помпа.

Схема сигнальной части

ОткудаКуда
Arduino 5Vдатчик VCC
Arduino GNDдатчик GND
датчик AOUTArduino 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);
}
  1. Подготовьте образец того же сухого грунта, который находится в горшке.
  2. Установите датчик на рабочую глубину, подождите минуту и запишите десять значений.
  3. Их среднее — DRY_VALUE.
  4. Полностью увлажните второй образец грунта и дайте лишней воде стечь.
  5. На той же глубине запишите десять значений. Их среднее — WET_VALUE.
  6. Обычно сухое значение выше влажного. Если у вас наоборот, функция преобразования всё равно работает, если числа записаны в правильные переменные.

Не калибруйте «сухое» состояние в воздухе: воздух и сухой грунт дают разные результаты.

Программа

Замените примерные 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");
}
}

Первый запуск

  1. Отключите питание помпы и включите только Arduino.
  2. Откройте монитор порта на 9600 бод. Проверьте, что процент увеличивается во влажной почве.
  3. Убедитесь, что при старте реле не включает помпу.
  4. Поместите трубку в мерный стакан, подключите питание помпы и выполните один сухой тест.
  5. Измерьте поданный объём. Измените WATERING_MS так, чтобы один импульс давал небольшую порцию.
  6. Закрепите трубку в горшке и поставьте поддон.
  7. Первые сутки не оставляйте систему без наблюдения. Сравните показания до полива, через 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 и повторите калибровку в грунте

Практика

  1. Измерьте объём воды за 0,5; 1 и 2 секунды. Сделайте по три опыта.
  2. Запишите влажность сразу после полива, через 10, 30 и 60 минут.
  3. Переставьте датчик ближе и дальше от трубки и сравните показания.

Проверьте себя

  • Почему помпу нельзя питать от Arduino?
  • Зачем используется контакт NO?
  • Почему сухое значение измеряют в грунте, а не в воздухе?
  • Для чего нужна минимальная получасовая пауза?
  • Как положение резервуара может вызвать самотёк?

Словарь статьи

  • Ёмкостный датчик — датчик, оценивающий влажность по изменению электрической ёмкости рядом с грунтом.
  • Реле — управляемый электрический переключатель.
  • COM — общий контакт реле.
  • NO — контакт, разомкнутый при выключенном реле.
  • Обратный диод — диод, подавляющий выброс напряжения при остановке мотора.
  • Сифон — самотёк жидкости по трубке после запуска потока.

Связанные темы

Источники