Автополивщик растений на Arduino

irrigator_6_final.jpg

Что это такое?

В этой статье мы расскажем о том, как собрать устройство для автоматического полива с контролем влажности почвы — ирригатор. Необходимость полива будем определять по показаниям датчика влажности почвы. Одновременно можно будет поливать несколько растений.

Что для этого необходимо?

Как это собрать?

  1. Подключаем дисплей к контакту 3 тройка-шилда. При подключении всех тройка-модулей следите за тем, чтобы чёрный провод соединялся с контактом GND. irrigator_1_quaddisp.jpg
  2. Теперь подключаем силовой ключ к контакту 4. irrigator_2_mosfet.jpg
  3. У помпы нет контактов на концах проводов, поэтому приходится пользоваться клеммником. Если вы умеете паять, правильней было бы припаять к проводам штырьковые контакты. irrigator_3_pumpsupply.jpg
  4. Полностью подключённое питание помпы выглядит так: irrigator_4_pumpsupplyfull.jpg
  5. Теперь подключаем сенсор влажности почвы. irrigator_5_soilsensor.jpg
  6. При помощи Arduino IDE программируем Arduino Uno скетчем irrigator.ino.
  7. Втыкаем сенсор влажности в землю.
  8. Втыкаем конец трубки с водой в землю. Если горшок с землёй весит менее 2 кг, рекомендуется отдельно закрепить трубку, чтобы она не перевернула растение.
  9. Опускаем помпу в ёмкость с водой.
  10. Подключаем питание.

Калибровка

Показания датчика влажности сильно зависят от кислотности почвы. Поэтому перед началом пользования ирригатором требуется провести простую процедуру калибровки.

  1. Запишите показания на дисплее при воткнутом в сухой горшок сенсоре. Это — минимум влажности.
  2. Полейте цветок и дождитесь пока вода полностью впитается в землю и показания сенсора установятся на одном уровне. Запишите их. Это — максимум влажности.
  3. В скетче исправьте значения константы HUMIDY_MIN на значение минимальной влажности и HUMIDY_MAX на значение максимальной влажности. Заново прошейте Arduino Uno.

Масштабирование решения

Мы описали решение для одного растения. Но обычно требуется поливать несколько растений. Помимо очевидного решения — подключения к Arduino нескольких помп и датчиков влажности — существует более простое и дешёвое. Достаточно в трубке, которая идёт в комплекте с помпой проделать шилом дырочки на расстоянии около 30 см и воткнуть в эти дырочки куски стержней от обычных шариковых ручек. Выглядеть это будет так:

Горшки с цветами дома часто стоят в ряд на подоконнике. Вам достаточно просто положить трубку на горшки так, чтобы отверстия в ней приходились по одному на горшок. Теперь наше устройство может поливать сразу несколько горшков. Однако в таком случае принимать решение о необходимости полива можно только по одному горшку. Однако обычно горшки примерно одинаковые по размерам и, соответственно, сохнут с примерно равной скоростью. Можно так же комбинировать два решения, разделяя все горшки на группы примерно равных по размерам.

Исходный код

irrigator.ino
// Подключаем библиотеку для работы с дисплеем
#include "QuadDisplay.h"
// даём разумное для пина, к которому подключен дисплей
#define DISPLAY_PIN     3
// даём разумное для пина, к которому подключена помпа
#define POMP_PIN        4
// даём разумное для пина, к которому подключён датчик влажности почвы
#define HUMIDITY_PIN    A0
// минимальный порог влажности почвы
#define HUMIDITY_MIN    200
// максимальный порог влажности почвы
#define HUMIDITY_MAX    700
// интревал между проверкой на полив расстения
#define INTERVAL        60000 * 3   
// переменная для хранения показания влажности почвы
unsigned int humidity = 0;
 
// переменная для хранения времени
unsigned long waitTime = 0;
 
void setup(void)
{
  pinMode(DISPLAY_PIN, OUTPUT);
  pinMode(POMP_PIN, OUTPUT);
  // выводим 0 на дисплей
  displayInt(DISPLAY_PIN, 0);
}
 
void loop(void)
{
  // считываем текущее показания датчика влажности почвы
  int humidityNow = analogRead(HUMIDITY_PIN);
  // если показания текущей владности почвы
  // не равняется предыдщуему запросу 
  if (humidityNow != humidity) {
    // сохраняем текущие показания влажности
    humidity= humidityNow;
    // и выводим показания влажности на дисплей
    displayInt(DISPLAY_PIN, humidityNow);
  }
  // если прошёл заданный интервал времени
  // и значения датчика влажности меньше допустимой границы
  if ((waitTime == 0 || millis() - waitTime > INTERVAL) && humidity < HUMIDITY_MIN ) {
    // включаем помпу
    digitalWrite(POMP_PIN, HIGH);
    // ждём 2 секунды
    delay(2000);
    // выключаем помпу
    digitalWrite(POMP_PIN, LOW);
    // приравниваем переменной waitTime
    // значение текущего времени плюс 3 минуты 
    waitTime = millis();
  }
}

Демонстрация работы устройства

Что ещё можно сделать?

  1. Несмотря на золочение, контакты сенсора влажности со временем корродируют. Быстрее всего корродирование происходит при подключённом питании. Срок жизни сенсора можно значительно увеличить, если подключить питание к нему через силовой ключ. Когда надо получить данные — включаем питание сенсора, снимаем показания и тут же выключаем питание.
  2. Если оставить наш ирригатор работающим на длительный срок без присмотра, вода в резервуаре может закончиться. При работе без воды помпа быстро выходит из строя. Решением проблемы может быть автоматическое определение опустошения резервуара. Сенсор подбирается исходя из типа резервуара. Если он не глубок, то подойдёт ещё один датчик влажности. Когда же высоты его не хватает, можно воспользоваться УЗ-дальномером, сделать поплавок с датчиком наклона или просто опустить на дно два провода.
  3. Устройство, работающее от батареек, будет значительно безопасней питающегося от сети. Идеальным вариантом было бы питание ирригатора от батареек. Но Arduino Uno, как известно, даже в режиме сна потребляет более 10 мА. Выходом может являться использование Arduino Mini, способный в режиме сна снижать потребляемый ток до сотен мкА.
  4. Существует много правил полива домашних растений, как, например: не стоит поливать зимой вечером. Можно добавить сенсоров света или часы реального времени и скорректировать программу так, чтобы она старалась поливать в нужное время.