#include <Wire.h> // Библиотека шины
#include <LiquidCrystal_I2C.h> // Библиотека дисплея
#include <dht11.h> // Библиотека датчика температуры и влажности воздуха
#include <OneWire.h> // Библиотека датчика температуры почвы
#include "Sodaq_DS3231.h" // Библиотека часов реального времени
LiquidCrystal_I2C lcd(0x3f,20,4); // Установка адреса и размерности дисплея
int VlazhnVozd; // Переменная влажности воздуха
int TempVozd; // Переменная температуры воздуха
int VlazhPoch = 0; // влажность почвы
dht11 DHT; // переменная типа DHT для датчика температуры и влажности воздуха
int chk; // Переменная проверки датчика температуры и влажности воздуха
byte i; // для датчика температуры почвы
byte DataVozd[12]; // Данные для датчика температуры почвы
byte AddrVozd[8] = {0x28, 0xFF, 0x32, 0xD1, 0x64, 0x15, 0x1, 0xB7}; // Адрес для датчика температуры почвы
int TempPochv; // Переменная температуры почвы
char weekDay[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
int FlagNaborVoda = 0; // Флажок, определяющий, что вода в этот час уже набиралась
int FlagPoliva = 0; // Флажок, определяющий, что полив в этот час уже был
unsigned long Vremya = 0; // Переменная для определения времени подсветки дисплея
int MotorTest = 0; // Переменная для включения теста моторов
int Konts; // переменная для определения концевика
// """Настройки"""
//DateTime dt(2016, 9, 29, 9, 10, 0, 4); // установка часов
int VremNaborVoda = 310 ; // длительность набора воды в поливочный бак (сек.)
int ChasNaborVoda = 10; // час, в который надо включить набор воды (часов)
int VremPoliva = 35; // длительность набора воды в поливочный бак, достаточное, чтобы вода перелилась и начался полив (сек.)
int ChasPoliva = 19; // час, в который надо поливать (часов)
int ChasPoliva_2 = 22; // час, в который надо поливать второй раз (часов) - не менее, чем через 2 часа после первого полива!
int VrOtkrTyl = 14; // время открытия окна по тылу (секунд)
int VrZakrTyl = 10; // время закрытия окна по тылу (секунд)
int VrOtkrFas = 18; // время открытия окна по фасаду (секунд)
int VrZakrFas = 13; // время закрытия окна по фасаду (секунд)
int TempOtkrOkon = 25; // температура открытия окон (градусов)
int TempZakrOkon = 20; // температура закрытия окон (градусов)
int TempPodPoch_on = 16; // температура включения подогрева почвы (градусов)
int TempPodPoch_off = 18; // температура отключения подогрева почвы (градусов)
int TempPodVozd_on = 16; // температура включения подогрева воздуха (градусов)
int TempPodVozd_off = 18; // температура отключения подогрева воздуха (градусов)
// """Переменные для пинов"
OneWire ds(2); // Устанока пина 2 для датчика температуры почвы
#define DHT11_PIN 3 // Установка пина 3 для датчика температуры и влажности воздуха
int const MotorTyl_1 = 4; // номер пина мотора открывания форточки тыла 1
int const MotorTyl_2 = 5; // номер пина мотора открывания форточки тыла 2
int const MotorFas_1 = 6; // номер пина мотора открывания форточки фасада 1
int const MotorFas_2 = 7; // номер пина мотора открывания форточки фасада 2
int const KnopkaLeft = 8; // Кнопка настроек влево
int const KnopkaEsc = 9; // Кнопка настроек выход
int const KnopkaEnter = 10; // Кнопка настроек ввод
int const KnopkaRight = 11; // Кнопка настроек вправо
int const KontsTylOtkr = 22; // номер пина концевого выключателя открывания форточки тыла
int const KontsTylZakr = 24; // номер пина концевого выключателя закрывания форточки тыла
int const SensorVoda = 26; // номер пина сенсора уровня воды в поливочном баке
int const KontsFasOtkr = 28; // номер пина концевого выключателя открывания форточки фасада
int const KontsFasZakr = 30; // номер пина концевого выключателя закрывания форточки фасада
int const OtklObogr = 32; // номер пина ручного выключателя автоматического обогрева (теплого пола и обогревателя воздуха)
int const OtkrOkon = 34; // номер пина ручного выключателя ОТКРЫТИЯ окон и отключения автоматического управления окнами
int const ZakrOkon = 36; // номер пина ручного выключателя ЗАКРЫТИЯ окон и отключения автоматического управления окнами
int const KnopkaNabor = 38; // номер пина для кнопки ручного набора воды в поливочный бак
int const KnopkaPoliv = 40; // номер пина кнопки включения полива
int const Poliv_x2 = 42; // номер пина переключателя полива (1 или 2 раза)
int const Podsvetka = 44; // номер пина кнопки включения подсветки дисплея
int const Rele_1 = 46; // номер пина реле №1
int const ReleNasos_2 = 48; // номер пина реле №2 включения насоса
int const ReleTeplPol_3 = 50; // номер пина реле №3 включения теплого пола
int const ReleObogr_4 = 52; // номер пина реле №4 включения обогревателя воздуха
int const VlazhPochPin = 14; // пин датчика влажности почвы
int FuncOkon (int Motor) // Функция управления моторами
{
if (Motor==MotorTyl_1) { Konts=KontsTylOtkr; } // Задаем какой концевик должен сработать
if (Motor==MotorTyl_2) { Konts=KontsTylZakr; }
if (Motor==MotorFas_1) { Konts=KontsFasOtkr; }
if (Motor==MotorFas_2) { Konts=KontsFasZakr; }
digitalWrite(Motor,1);
int n = 0;
while ( n<(VrOtkrTyl*10)) // Стеклоподъемник работает не более отведенного времени (защита от несработки концевика)
{
delay (100);
++n;
if (digitalRead (Konts) == 1) // Если концевик сработал
{
break;
}
}
digitalWrite(Motor,0); // Останавливаем мотор
}
void setup() {
// """НАЗНАЧЕНИЕ ПИНОВ"""
pinMode (MotorTyl_1, OUTPUT); // пин мотора открывания форточки тыла 1 - выход
pinMode (MotorTyl_2, OUTPUT); // пин мотора открывания форточки тыла 2 - выход
pinMode (MotorFas_1, OUTPUT); // пин мотора открывания форточки фасада 1 - выход
pinMode (MotorFas_2, OUTPUT); // пин мотора открывания форточки фасада 2 - выход
pinMode (KnopkaLeft, INPUT); // Кнопка настроек влево
pinMode (KnopkaEsc, INPUT); // Кнопка настроек выход
pinMode (KnopkaEnter, INPUT); // Кнопка настроек ввод
pinMode (KnopkaRight, INPUT); // Кнопка настроек вправо
pinMode (KontsTylOtkr, INPUT); // пин концевого выключателя открывания форточки тыла - вход
pinMode (KontsTylZakr, INPUT); // пин концевого выключателя закрывания форточки тыла - вход
pinMode (SensorVoda, INPUT); // пин сенсора уровня воды в поливочном баке - вход
pinMode (KontsFasOtkr, INPUT); // пин концевого выключателя открывания форточки фасада - вход
pinMode (KontsFasZakr, INPUT); // пин концевого выключателя закрывания форточки фасада - вход
pinMode (OtklObogr, INPUT); // пин ручного выключателя автоматического обогрева (теплого пола и обогревателя воздуха) - вход
pinMode (OtkrOkon, INPUT); // пин ручного выключателя ОТКРЫТИЯ окон и отключения автоматического управления окнами - вход
pinMode (ZakrOkon, INPUT); // пин ручного выключателя ЗАКРЫТИЯ окон и отключения автоматического управления окнами - вход
pinMode (KnopkaNabor, INPUT); // пин для кнопки ручного набора воды в поливочный бак - вход
pinMode (KnopkaPoliv, INPUT); // пин кнопки включения полива - вход
pinMode (Poliv_x2, INPUT); // пин переключателя полива (1 или 2 раза) - вход
pinMode (Podsvetka, INPUT); // пин кнопки включения подсветки дисплея - вход
pinMode (Rele_1, OUTPUT); // пин реле №1 - выход
pinMode (ReleNasos_2, OUTPUT); // пин реле №2 включения насоса - выход
pinMode (ReleTeplPol_3, OUTPUT); // пин реле №3 включения теплого пола - выход
pinMode (ReleObogr_4, OUTPUT); // пин реле №4 включения обогревателя воздуха - выход
digitalWrite (Rele_1,1); // Резервное реле отключено
digitalWrite (ReleNasos_2,1); // Насос отключен
digitalWrite (ReleTeplPol_3,1); // Подогрев почвы отключен
digitalWrite (ReleObogr_4,1); // Обогреватель воздуха отключен
digitalWrite (MotorTyl_1, 1); // Пины управления моторами отключены
digitalWrite (MotorTyl_2, 1);
digitalWrite (MotorFas_1, 1);
digitalWrite (MotorFas_2, 1);
// """ДИСПЛЕЙ"""
lcd.init(); // Инициализация дисплея
lcd.backlight(); // Подсветка дисплея
// данные самодельных символов для дисплея:
byte lcd_ch[8] = {0x00,0x00,0x11,0x11,0x0F,0x01,0x01,0x00};
byte lcd_z[8] = {0x00,0x00,0x0E,0x11,0x06,0x11,0x0E,0x00};
byte lcd_d[8] = {0x00,0x00,0x06,0x0A,0x0A,0x0A,0x1F,0x00};
byte lcd_v[8] = {0x00,0x00,0x1E,0x11,0x1E,0x11,0x1E,0x00};
byte lcd_gradus[8] = {0x00,0x10,0x06,0x09,0x08,0x09,0x06,0x00};
byte lcd_l[8] = {0x00,0x00,0x07,0x09,0x09,0x09,0x19,0x00};
byte lcd_g[8] = {0x00,0x00,0x15,0x15,0x0E,0x15,0x15,0x00};
byte lcd_p[8] = {0x1F,0x11,0x11,0x11,0x11,0x11,0x11,0x00};
// Создание самодельных символов для дисплея
lcd.createChar(0, lcd_ch); // буква ч
lcd.createChar(1, lcd_z); // буква з
lcd.createChar(2, lcd_d); // буква д
lcd.createChar(3, lcd_v); // буква в
lcd.createChar(4, lcd_gradus); // градус
lcd.createChar(5, lcd_l); // буква л
lcd.createChar(6, lcd_g); // буква ж
lcd.createChar(7, lcd_p); // буква п
// Вывод на дисплей неизменяемых символов:
lcd.setCursor(0, 0);
lcd.print("Bo");
lcd.write(byte(1));
lcd.write(byte(2));
lcd.print("yx:");
lcd.setCursor(0, 1);
lcd.print("t=");
lcd.setCursor(4, 1);
lcd.write(byte(4));
lcd.setCursor(6, 1);
lcd.write(byte(3));
lcd.write(byte(5));
lcd.print("a");
lcd.write(byte(6));
lcd.print(".=");
lcd.setCursor(15, 1);
lcd.print("%");
lcd.setCursor(0, 2);
lcd.write(byte(7));
lcd.print("o");
lcd.write(byte(0));
lcd.write(byte(3));
lcd.print("a:");
lcd.setCursor(13, 2);
lcd.write(byte(7));
lcd.print("o");
lcd.write(byte(2));
lcd.print(":");
lcd.setCursor(0, 3);
lcd.print("t=");
lcd.setCursor(4, 3);
lcd.write(byte(4));
lcd.setCursor(6, 3);
lcd.write(byte(3));
lcd.write(byte(5));
lcd.print("a");
lcd.write(byte(6));
lcd.print(".=");
lcd.setCursor(15, 3);
lcd.print("%");
Wire.begin();
rtc.begin();
//rtc.setDateTime(dt); //установка часов
//Serial.begin(9600);
}
void loop()
{
ds.reset(); // Очищаем датчик температуры почвы
ds.select(AddrVozd); // выбираем датчик температуры почвы
ds.write(0x44); // Запускаем на датчике температуры почвы процесс измерения и устанавливаем питание от внешнего источника
chk = DHT.read(DHT11_PIN); // Считываем данные с датчика температуры и влажности воздуха
switch (chk) // Проверка данных на ошибки. Если они есть, присваиваем значения 99.
{
case DHTLIB_OK:
break;
default: TempVozd = 99;
VlazhnVozd = 99;
break;
}
//if (TempVozd != 99) // Если с данными все в порядке, присваиваем переменным значения.
// {
VlazhnVozd = DHT.humidity,1;
TempVozd = DHT.temperature,1;
// }
//delay(3000); // ЭТО ВРЕМЕННО!!!!
ds.reset(); // Очищаем датчик почвы
ds.select(AddrVozd); // выбираем датчик почвы
ds.write(0xBE); // Считываем данные с датчика почвы
for ( i = 0; i < 9; i++) // Записываем данные с датчика почвы
{
DataVozd[i] = ds.read();
}
int16_t raw = (DataVozd[1] << 8) | DataVozd[0]; // Извлекаем данные о температуре почвы
raw = raw & ~7; // Определяем точность для температуры почвы 0,5 градусов
TempPochv = (float)raw / 16.0; // Пересчитываем в градусы Цельсия
VlazhPoch = analogRead(VlazhPochPin); // считывание данных с датчика влажности почвы
VlazhPoch = (1000-VlazhPoch)/8; // вычисление влажности почвы
DateTime now = rtc.now(); //получение даты - времени
// Выводим данные на дисплей
lcd.setCursor(14,0);
int timehour = now.hour();
if (timehour < 10)
{
lcd.print("0");
lcd.print(timehour);
}
else
{
lcd.print(timehour);
}
lcd.print(":");
lcd.setCursor(17,0);
int timemin = now.minute();
if (timemin < 10)
{
lcd.print("0");
lcd.print(timemin);
}
else
{
lcd.print(timemin);
}
//lcd.print(now.minute(), DEC);
lcd.setCursor(2,1); // установка курсора
lcd.print(TempVozd);
lcd.setCursor(2,3);
lcd.print(TempPochv);
lcd.setCursor(13,1);
lcd.print(VlazhnVozd);
lcd.setCursor(13,3);
lcd.print(VlazhPoch);
// ***Управление насосом:***
// 1. Набор воды (возможен только при неполном баке):
// 1.1 Вручную:
// 1.1.1 Набор воды вручную:
if (digitalRead(SensorVoda)==0 && digitalRead(KnopkaNabor)==1) // Если бак неполон и кнопка набора воды нажата
{
NaborVoda (); // Процедура набора воды
}
// 1.2 Автоматически (по времени):
if (FlagNaborVoda == 0 && digitalRead (SensorVoda) == 0)
{
if (timehour == ChasNaborVoda)
{
NaborVoda (); // Процедура набора воды
FlagNaborVoda = 1; // Ставим флажок, что воду больше пока набирать не надо
}
}
if (timehour == (ChasNaborVoda + 1))
{
FlagNaborVoda = 0; // Прошло время, можно набирать снова
}
// 2.Полив
if (timehour == ChasPoliva && FlagPoliva == 0)
{
Poliv (); // Процедура полива
FlagPoliva = 1; // Установим флажок, что больше пока поливать не надо
}
// 2.1 Полив вручную:
if (digitalRead (SensorVoda) == 1 && digitalRead (KnopkaPoliv) == 1) // Если бак полон и кнопка полива нажата
{
//Serial.println (digitalRead(SensorVoda));
//Serial.println (digitalRead(KnopkaPoliv));
Poliv (); // Процедура полива
}
if (timehour == (ChasPoliva + 1))
{
FlagPoliva = 0; // Можно опять поливать
}
// 3. Двойной полив:
// 3.1 Набираем воду:
if (digitalRead (Poliv_x2) == 1 && timehour == (ChasPoliva + 1))
{
if (FlagNaborVoda == 0 && digitalRead (SensorVoda) == 0)
{
NaborVoda (); // Процедура набора воды
FlagNaborVoda = 1; // Ставим флажок, что воду больше пока набирать не надо
}
}
if (timehour == (ChasPoliva + 2))
{
FlagNaborVoda = 0; // Прошло время, можно набирать снова
}
// 3.2 Поливаем:
if (timehour == ChasPoliva_2 && FlagPoliva == 0)
{
Poliv (); // Процедура полива
FlagPoliva = 1; // Установим флажок, что больше пока поливать не надо
}
if (timehour == (ChasPoliva_2 + 1))
{
FlagPoliva = 0; // Можно опять поливать
}
// 4. Форточки:
// 4.1 Автоматическое открытие - закрытие:
if (digitalRead(OtkrOkon) == 0 && digitalRead(ZakrOkon) == 0) // Если отключено ручное открытие-закрытие окон
{
lcd.setCursor(10,0); // установка курсора
lcd.print("A");
if (TempVozd == TempOtkrOkon && digitalRead(KontsTylOtkr) == 0)
{
FuncOkon(MotorTyl_1);
}
if (TempVozd == TempOtkrOkon && digitalRead(KontsFasOtkr) == 0)
{
FuncOkon(MotorFas_1);
}
if (TempVozd == TempZakrOkon && digitalRead(KontsTylZakr) == 0)
{
FuncOkon(MotorTyl_2);
}
if (TempVozd == TempZakrOkon && digitalRead(KontsFasZakr) == 0)
{
FuncOkon(MotorFas_2);
}
}
// 4.2 Ручное открытие окон и отключение автоматического открытия-закрытия:
if (digitalRead(OtkrOkon) == 1) // Если включено ручное открытие окон
{
lcd.setCursor(10,0); // установка курсора
lcd.print("P");
if (digitalRead(KontsTylOtkr) == 0)
{
FuncOkon(MotorTyl_1);
}
if (digitalRead(KontsFasOtkr) == 0)
{
FuncOkon(MotorFas_1);
}
}
if (digitalRead(ZakrOkon) == 1) // Если включено ручное закрытие окон
{
lcd.setCursor(10,0); // установка курсора
lcd.print("P");
if (digitalRead(KontsTylZakr) == 0)
{
FuncOkon(MotorTyl_2);
}
if (digitalRead(KontsFasZakr) == 0)
{
FuncOkon(MotorFas_2);
}
}
// 5.Подогрев почвы и воздуха:
if ( digitalRead (OtklObogr) == 1 ) // Если автоматика отключена
{
digitalWrite (ReleTeplPol_3, 1); // Выключаем реле теплого пола
digitalWrite (ReleObogr_4, 1); // Выключаем реле обогревателя воздуха
lcd.setCursor(10,2); // Отображаем Р на дисплее, символизируещее ручное управление, отключение автоматики
lcd.print("P");
lcd.setCursor(17,2); // Отображаем на дисплее отключение подогрева пола
lcd.print("OFF");
}
else // Если автоматика не отключена
{
lcd.setCursor(10,2); // Отображаем А на дисплее
lcd.print("A");
if ( TempPochv <= TempPodPoch_on) // Если температура почвы меньше заданной
{
digitalWrite (ReleTeplPol_3, 0); // Включаем реле теплого пола
lcd.setCursor(17,2); // Отображаем это на дисплее
lcd.print("ON ");
}
if ( TempPochv >= TempPodPoch_off ) // Если температура почвы больше заданной
{
digitalWrite (ReleTeplPol_3, 1); // Выключаем реле теплого пола
lcd.setCursor(17,2); // Отображаем это на дисплее
lcd.print("OFF");
}
if ( TempVozd <= TempPodVozd_on ) // Если температура почвы меньше заданной
{
digitalWrite (ReleObogr_4, 0); // Включаем реле обогревателя воздуха
}
if ( TempVozd >= TempPodVozd_off ) // Если температура почвы больше заданной
{
digitalWrite (ReleObogr_4, 1); // Выключаем реле обогревателя воздуха
}
}
// Кнопка включения подсветки дисплея
if ( (millis() - Vremya) > 15000 || millis() < Vremya)
{
lcd.noBacklight(); // Подсветка дисплея отключается
}
if ( digitalRead(Podsvetka) == 1)
{
lcd.backlight(); // Подсветка дисплея
Vremya = millis();
}
}
void NaborVoda () // Процедура набора воды
{
digitalWrite (ReleNasos_2,0); // Включаем насос
int n = 0;
while ( n<VremNaborVoda) // Насос работает не более отведенного времени (защита от несработки датчика уровня)
{
delay (1000);
++n;
if (digitalRead (SensorVoda) == 1) // Если датчик уровня воды сработал
{
break;
}
}
digitalWrite (ReleNasos_2,1); // Насос отключить
}
void Poliv () // Процедура полива
{
digitalWrite (ReleNasos_2,0); // Включаем насос
delay (VremPoliva*1000);
digitalWrite (ReleNasos_2,1); // Насос отключить
}
/*
void TestMotor ()
{
MotorTest = 1;
lcd.clear(); // Очистка дисплея
lcd.backlight(); // Подсветка дисплея
lcd.setCursor(5, 0); // Вывод на дисплей неизменяемых символов:
lcd.print("Motors test");
lcd.setCursor(0, 1);
lcd.print("Motors select:");
lcd.setCursor(0, 2);
lcd.print("Motors status:");
lcd.setCursor(0, 3);
lcd.print("TO:");
lcd.setCursor(5, 3);
lcd.print("TC:");
lcd.setCursor(10, 3);
lcd.print("FO:");
lcd.setCursor(15, 3);
lcd.print("FC:");
while ( MotorTest == 1)
{
if (digitalRead(OtkrOkon) == 0 && digitalRead(ZakrOkon) == 0) // Если переключатель в среднем положении
{
lcd.setCursor(15, 1);
lcd.print("OFF ");
}
if (digitalRead(KnopkaNabor) == 0 && digitalRead(KnopkaPoliv) == 0) // Если ни одна из кнопок не нажата
{
lcd.setCursor(15, 2);
lcd.print("STOP ");
}
lcd.setCursor(3, 3);
lcd.print(digitalRead(KontsTylOtkr));
lcd.setCursor(8, 3);
lcd.print(digitalRead(KontsTylZakr));
lcd.setCursor(13, 3);
lcd.print(digitalRead(KontsFasOtkr));
lcd.setCursor(18, 3);
lcd.print(digitalRead(KontsFasZakr));
if (digitalRead(OtkrOkon) == 1) // Включено окно тыла
{
lcd.setCursor(15, 1);
lcd.print("Tyl ");
lcd.print(digitalRead(KontsTylOtkr));
lcd.setCursor(8, 3);
lcd.print(digitalRead(KontsTylZakr));
lcd.setCursor(13, 3);
lcd.print(digitalRead(KontsFasOtkr));
lcd.setCursor(18, 3);
lcd.print(digitalRead(KontsFasZakr));
if (digitalRead(KnopkaPoliv) == 1 && digitalRead(KontsTylOtkr) == 0)
{
digitalWrite (MotorTyl_1, 1);
lcd.setCursor(15, 2);
lcd.print("OPEN ");
lcd.setCursor(3, 3);
while (digitalRead(KnopkaPoliv) == 1)
{
if (digitalRead(KontsTylOtkr) == 1)
{
break;
}
delay (100);
}
digitalWrite (MotorTyl_1, 0);
}
if (digitalRead(KnopkaNabor) == 1 && digitalRead(KontsTylZakr) == 0)
{
digitalWrite (MotorTyl_2, 1);
lcd.setCursor(15, 2);
lcd.print("CLOSE");
while (digitalRead(KnopkaNabor) == 1)
{
if (digitalRead(KontsTylZakr) == 1)
{
break;
}
delay (100);
}
digitalWrite (MotorTyl_2, 0);
}
}
if (digitalRead(ZakrOkon) == 1) // Включено окно фасада
{
lcd.setCursor(15, 1);
lcd.print("Fasad");
lcd.setCursor(3, 3);
lcd.print(digitalRead(KontsTylOtkr));
lcd.setCursor(8, 3);
lcd.print(digitalRead(KontsTylZakr));
lcd.setCursor(13, 3);
lcd.print(digitalRead(KontsFasOtkr));
lcd.setCursor(18, 3);
lcd.print(digitalRead(KontsFasZakr));
if (digitalRead(KnopkaPoliv) == 1 && digitalRead(KontsFasOtkr) == 0)
{
lcd.setCursor(15, 2);
lcd.print("OPEN ");
digitalWrite (MotorFas_1, 1);
while (digitalRead(KnopkaPoliv) == 1)
{
if (digitalRead(KontsFasOtkr) == 1)
{
break;
}
delay (100);
}
digitalWrite (MotorFas_1, 0);
}
if (digitalRead(KnopkaNabor) == 1 && digitalRead(KontsFasZakr) == 0)
{
digitalWrite (MotorFas_2, 1);
lcd.setCursor(15, 2);
lcd.print("CLOSE");
while (digitalRead(KnopkaNabor) == 1)
{
if (digitalRead(KontsFasZakr) == 1)
{
break;
}
delay (100);
}
digitalWrite (MotorFas_2, 0);
}
}
}
*/
/* if (digitalRead(KnopkaNabor) == 1 && digitalRead(KnopkaPoliv) == 1) // Если нажать одновременно кнопки полива и набора воды
{
delay (5000); // и удерживать их более 5 сек
if (digitalRead(KnopkaNabor) == 1 && digitalRead(KnopkaPoliv) == 1) // Если по прошествии 5 сек кнопки все еще нажаты, включается тестовая программа
{
}
}*/