1920smart socket
Перейти к навигации
Перейти к поиску
//
// 08/03/2020 включаем и выключаем свет и помпу для микрозелени по расписанию, umkiedu@gmail.com
// чтоб небыло плесени сделать продувку вентилятором
// свет можно включать в режиме заката - рассвета, если есть дополнительные реле
unsigned long time_den = 61200000;// время светлого дня (17 часов)
unsigned long time_noch = 25200000; // время сна (7 часов);
unsigned long time_rasvet1 = 3000; // 60000; // время рассвета
unsigned long time_zakat1 = 2000 ; //60000; // время заката
unsigned long time_poliv1 = 7200000; // время между поливами (120 min)
unsigned long time_poliv2 = 30000; // время полива (0.5 min)
unsigned long currentTime, DelayNigth, DelayRassvet, DelayZakat, DelayPoliv;
const int relay1 = 11; // реле1 на pin D11
const int relay2 = 10; // реле2 на pin D10
int nStateNigth = 0; // статус ночь-0 день 1
int nStateRassvet = 0; // статус рассвет начат -0 , окончен - 1
int nStateZakat = 0; // статус закат начат -0 , окончен - 1
int nStatePoliv = 0; // статус полив начат -0 , окончен - 1
void DayNigth();
void Rassvet();
void Zakat();
void Poliv();
void setup() {
Serial.begin(9600);
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
digitalWrite(relay1, HIGH);
digitalWrite(relay2, HIGH);
currentTime = millis();
// установить начальные состояния процессов
nStateNigth = 0;
nStateRassvet = 0;
nStateZakat = 0;
nStatePoliv = 0;
DelayNigth = currentTime;
DelayRassvet = currentTime;
DelayZakat = currentTime;
DelayPoliv = currentTime;
DelayNigth += time_den; // тек. время задержки процессу ДеньНочь
}
// циклим процессы - конечные автоматы
void loop() {
currentTime = millis();
DayNigth(); // процесс ДеньНочь
Rassvet(); // процесс Рассвет
Zakat(); // процесс Закат
Poliv(); // процесс Полива помпой
}
// процесс ДеньНочь
void DayNigth()
{
switch (nStateNigth) {
// состояние День
case 0:
if (currentTime >= DelayNigth) {
nStateNigth = 1;
nStateRassvet = 0;
DelayNigth = currentTime + time_noch; // переключаем на состояние ночь
}
break;
// состояние Ночь
case 1:
if (currentTime >= DelayNigth) {
nStateNigth = 0;
nStateZakat = 0;
DelayNigth = currentTime + time_den; // переключаем на состояние день
}
break;
}
}
// процесс Рассвет
void Rassvet()
{
if (nStateNigth == 0) {
switch (nStateRassvet) {
case 0:
nStateRassvet = 1;
DelayRassvet = currentTime + time_rasvet1;
digitalWrite(relay1, LOW); // Включаем свет
break;
case 1:
if (currentTime >= DelayRassvet) {
if (nStateNigth == 1) {
nStateRassvet = 0;
}
}
break;
}
}
}
// процесс Закат
void Zakat()
{
if (nStateNigth == 1) {
switch (nStateZakat) {
case 0:
nStateZakat = 1;
digitalWrite(relay1, HIGH); // выключааем свет
DelayZakat = currentTime + time_zakat1;
break;
case 1:
if (currentTime >= DelayZakat) {
if (nStateNigth == 0) {
nStateZakat = 0;
}
}
break;
}
}
}
// процесс Полива помпой
void Poliv()
{
switch (nStatePoliv) {
case 0:
if (currentTime >= DelayPoliv) {
nStatePoliv = 1;
digitalWrite(relay2, LOW); // включаем помпу на время полива
DelayPoliv = currentTime + time_poliv2; //период сколько работает помпа
}
break;
case 1:
if (currentTime >= DelayPoliv) {
nStatePoliv = 2;
digitalWrite(relay2, HIGH); // выключаем помпу и ждем по времени
DelayPoliv = currentTime + time_poliv1; // период через который помпа включается для полива
}
break;
case 2:
if (currentTime >= DelayPoliv) {
nStatePoliv = 0; // сбрасываем состояние порлива в начальный статус
}
break;
}
}