// библиотека для работы I²C #include // библиотека для работы с часами реального времени #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; }