1920smart socket

Материал из УМКИwiki
Перейти к навигации Перейти к поиску
//
// 18/02/2021 включаем и выключаем свет и помпу для микрозелени по расписанию,  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;
  }

}