Дождеватор — автоматизируем работу садового дождевателя

  • Платформы: Arduino
  • Языки программирования: Arduino (C++)
  • Тэги: газон, дача, полив, автополив, дождеватель

Что это

Хороший газон требует постоянного ухода. Забудешь полить — трава засохнет и пожелтеет, не выключишь полив во время дождя — аккуратная лужайка превратится в хлюпающее болото.

Мы собрали систему, которая умеет поливать газоны по расписанию, контролирует влажность земли и не даёт промокнуть вашим детям и домашним животным. График полива сверяется с часами реального времени, влажность контролируется аналоговым сенсором, а за появлением людей в зоне полива следит пироэлектрический сенсор.

Проект удобно модернизировать не разбирая герметичный корпус устройства — Arduino Uno WiFi легко перепрошивается по беспроводной сети.

Видеообзор

Что понадобится

Как собрать

  1. Установите Power Shield сверху на Arduino Uno WiFi.
  2. Добавьте к полученному бутерброду Troyka Slot Shield.
  3. Чтобы сделать устройство умным, добавьте мини-реле и часы реального времени сверху на Troyka Slot Shield к 8 и I²C пинам соответственно. В итоге получился бутерброд как на схеме.
  4. Подключите к управляющей плате питание 12 вольт через внешний разъём.
  5. В продолжении скоммутируйте сервопривод крана с управляющей платой через реле:
    1. Красный и синий провод шарового крана подключите к нормально замкнутым — NC и нормально разомкнутым — NO контактам реле.
    2. Жёлтый провод подключите к общей земле — GND
    3. Общий вывод реле COM соедините с входным напряжением на плату Arduino Uno WiFi — Vin или V2 на Troyka Slot Shield. В зависимости от состояние реле — клапан будет открыт или закрыт.
  6. Добавьте к устройству через штырьковые соединители датчик влажности почвы и инфракрасный датчик движения к аналоговому пину A1 и A2 соответственно.  Датчик влажности почвы не даст устройству включиться после или вовремя дождя, а PIR-датчик не даст устройству окатить вас водой.
  7. Спрячьте управляющую электронику и блок питания в герметичный корпус.

Исходный код

automatic-watering.ino
// библиотека для работы I²C
#include <Wire.h>
// библиотека для работы с часами реального времени
#include "TroykaRTC.h"
// номер пина реле
#define RELAY_PIN         8
// номер пина PIR-датчика
#define PIR_PIN           A2
// номер пина датчика влажности почвы
#define MOISTUSE_PIN      A1
// максимальный порог влажности почвы
#define HUMIDITY_MAX      100
// время включения полива в часах и минутах
#define TIME_HOUR         20
#define TIME_MINUTES      30
// интервал полива
#define INTERVAL          20
// создаём объект для работы с часами реального времени
RTC clock;
 
// состояния системы
enum State
{
    OFF,
    ON,
};
 
// объявляем переменную state
State state;
// переменная для хранения времени в формате unixtime
long unixTime;
 
void setup()
{
  // система выключена
  state = OFF;
  // открываем последовательный порт
  Serial.begin(9600);
  // пин реле в режим выхода
  pinMode(RELAY_PIN, OUTPUT);
  // инициализация часов
  clock.begin();
  // метод установки времени и даты в модуль вручную
   clock.set(20,29,45,27,07,2005,THURSDAY);    
  // метод установки времени и даты автоматически при компиляции
//  clock.set(__TIMESTAMP__);
  // что бы время менялось при прошивки или сбросе питания
  // закомментируйте оба метода clock.set();
}
 
void loop()
{
  // если значения влажности почвы превышают порог
  if (analogRead(MOISTUSE_PIN) > HUMIDITY_MAX) {
    // выходим из loop
    return false;
  }
  // запрашиваем данные с часов
  clock.read();
  int hour = clock.getHour();
  int minute = clock.getMinute();
  // если система выключена
  if (state == OFF) {
    if (hour == TIME_HOUR && minute == TIME_MINUTES ) {
      // запоминаем текущее время
      unixTime = clock.getUnixTime();
      // включаем полив
      wateringOn();
    }
  }
  // если система включена
  if (state == ON) {
    if (!digitalRead(PIR_PIN)) {
      // если кто то оказался в зоне полива
      // выключаем полив
      wateringOff();
    } else if (clock.getUnixTime() - unixTime > INTERVAL) {
      // если прошёл заданный интервал времени для полива
      // выключаем полив
      wateringOff();
    }
  }
}
 
// функция включения полива
void wateringOn() {
  digitalWrite(RELAY_PIN, HIGH);
  state = ON;
}
 
// функция выключения полива
void wateringOff() {
  digitalWrite(RELAY_PIN, LOW);
  state = OFF;
}

Что дальше

Вы можете скомбинировать этот проект с системой капельного орошения огорода. Если же ваша плантация умещается на подоконнике — посмотрите как сделать простую систему полива для комнатных цветов.