1920smart socket: различия между версиями

Материал из УМКИwiki
Перейти к навигации Перейти к поиску
(Новая страница: «<syntaxhighlight lang="C++"> // // 08/03/2020 включаем и выключаем свет и помпу для микрозелени по расписани…»)
 
Нет описания правки
 
(не показано 6 промежуточных версий этого же участника)
Строка 1: Строка 1:
<syntaxhighlight lang="C++">
<syntaxhighlight lang="C++">
//
//
// 08/03/2020 включаем и выключаем свет и помпу для микрозелени по расписанию,  umkiedu@gmail.com
// 29/04/2021 включаем и выключаем свет и помпу для микрозелени по расписанию,  umkiedu@gmail.com
//  чтоб небыло плесени сделать продувку вентилятором
//  чтоб небыло плесени сделать продувку вентилятором
//  свет можно включать в режиме заката - рассвета, если есть дополнительные реле
//  свет можно включать в режиме заката - рассвета, если есть дополнительные реле
//  добавлен замер датчика освещенности, влажности, температуры - воздуха  AMT 1001 R=10kOm
#include <SoftwareSerial.h>
#include "amt1001_ino.h"
SoftwareSerial BTSerial(6, 7); // RX, TX


unsigned long time_den = 61200000;// время светлого дня (17 часов)
unsigned long time_den = 61200000;// время светлого дня (17 часов)
unsigned long time_noch = 25200000; // время сна (7 часов);
unsigned long time_noch = 25200000; // длительность сна (7 часов);
unsigned long time_rasvet1 = 3000; // 60000; // время рассвета
unsigned long time_poliv1 = 7200000; // время между поливами (120 мин)
 
unsigned long time_poliv2 =  60000; // длительность полива (1 мин)
unsigned long time_zakat1 = 2000 ; //60000; // время заката
unsigned long time_zamer = 20000; // длительность  между замерами (20 сек)


unsigned long time_poliv1 = 7200000; // время между поливами (120 min)
unsigned long currentTime, DelayNigth, DelayPoliv, DelayZamer;
unsigned long time_poliv2 = 30000; // время полива (0.5 min)
int dinamikPin = 12;// пин пищалки
unsigned long currentTime, DelayNigth, DelayRassvet, DelayZakat, DelayPoliv;


const int relay1 = 11;  // реле1 на pin D11
const int relay1 = 11;  // реле1 на pin D11
const int relay2 = 10;  // реле2  на pin D10
const int relay2 = 10;  // реле2  на pin D10
const int tempPin = A6; // analog pin
const int humPin = A7; // humidity
uint16_t step;
uint8_t temphumi[3];  //  массив из трех байт для вывод данных в график


int nStateNigth = 0; // статус ночь-0 день 1
int nStateNigth = 0; // статус ночь-0 день 1
int nStateRassvet = 0; // статус рассвет начат -0 , окончен - 1
int nStateZakat = 0; // статус закат начат -0 , окончен - 1
int nStatePoliv = 0; // статус полив начат -0 , окончен - 1
int nStatePoliv = 0; // статус полив начат -0 , окончен - 1
void DayNigth();
int nStateZamer = 0; // статус замер окончен -0 , температура - 1, влажность - 2
void Rassvet();
unsigned char inByte[4];
void Zakat();
void DayNigth(); // День-ночь
void Poliv();
void Poliv();   // полив помпой
 
void Priem();   // прием данных из BT
void Knopka();   // Обработка данных по кнопке
void Zamer();    // Замер тмпературы и влажности воздуха


void setup()  {
void setup()  {
 
  BTSerial.begin(9600); // инициализируем  порт блютус
   Serial.begin(9600);
   Serial.begin(9600);   // инициализируем  порт сериал - шнур USB
   pinMode(relay1, OUTPUT);
   pinMode(relay1, OUTPUT);
   pinMode(relay2, OUTPUT);
   pinMode(relay2, OUTPUT);


   digitalWrite(relay1, HIGH);
   digitalWrite(relay1, LOW);
   digitalWrite(relay2, HIGH);
   digitalWrite(relay2, LOW);


   currentTime = millis();
   currentTime = millis();
   // установить начальные состояния процессов
   // установить начальные состояния процессов
   nStateNigth = 0;
   nStateNigth = 0;
  nStateRassvet = 0;
  nStateZakat = 0;
   nStatePoliv = 0;
   nStatePoliv = 0;


   DelayNigth  = currentTime;
   DelayNigth  = currentTime;
  DelayRassvet  = currentTime;
  DelayZakat  = currentTime;
   DelayPoliv = currentTime;
   DelayPoliv = currentTime;
   DelayNigth += time_den;  // тек. время задержки процессу ДеньНочь
   DelayNigth += time_den;  // тек. время с задержкой на светлое время
  BTSerial.println(time_den / 3600000); // Выводим время светлого дня (17 часов)
  BTSerial.println(time_noch / 3600000); // Выводим длительность сна (7 часов);
  BTSerial.println(time_poliv1 / 60000); // Выводимвремя между поливами (120 мин)
  BTSerial.println(time_poliv2 / 60000); // Выводим длительность полива (1 мин)


}
}
Строка 54: Строка 62:
// циклим процессы  - конечные автоматы
// циклим процессы  - конечные автоматы
void loop()  {
void loop()  {
   currentTime = millis();
   currentTime = millis();
   DayNigth();  // процесс ДеньНочь
   DayNigth();  // процесс ДеньНочь
  Rassvet();  // процесс Рассвет
  Zakat();    // процесс Закат
   Poliv();    // процесс Полива помпой
   Poliv();    // процесс Полива помпой
  Priem();    // Автомат приема и обработки данных с пульта
  Knopka(); // обрабатываем кнопки прямого упроавляние релюшками
  Zamer();    // Замер тмпературы и влажности воздуха
}
}


Строка 71: Строка 81:
       if (currentTime >= DelayNigth) {
       if (currentTime >= DelayNigth) {
         nStateNigth = 1;
         nStateNigth = 1;
        nStateRassvet = 0;
         DelayNigth  = currentTime + time_noch; // переключаем на состояние ночь
         DelayNigth  = currentTime + time_noch; // переключаем на состояние ночь
        digitalWrite(relay1, LOW);  // Включаем свет
       }
       }
       break;
       break;
Строка 78: Строка 88:
     case 1:
     case 1:
       if (currentTime >= DelayNigth) {
       if (currentTime >= DelayNigth) {
         nStateNigth = 0;
         nStateNigth = 2;
        nStateZakat = 0;
         DelayNigth  = currentTime + time_den; // переключаем на состояние день
         DelayNigth  = currentTime + time_den; // переключаем на состояние день
        digitalWrite(relay1, HIGH); // выключааем свет
      }
      break;
    case 2:
      if (currentTime >= DelayNigth) {
        nStateNigth = 0;  // сбрасываем состояние ночи в  статус день
        Serial.println("sbros den  r1 ");
       }
       }
       break;
       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;
    }
   }
   }
}
}
Строка 135: Строка 107:
void Poliv()
void Poliv()
{
{
   switch (nStatePoliv) {
   switch (nStatePoliv) {
     case 0:
     case 0:
Строка 142: Строка 113:
         digitalWrite(relay2, LOW); // включаем помпу на время полива
         digitalWrite(relay2, LOW); // включаем помпу на время полива
         DelayPoliv = currentTime + time_poliv2; //период сколько работает помпа
         DelayPoliv = currentTime + time_poliv2; //период сколько работает помпа
       }
       }
       break;
       break;
Строка 149: Строка 121:
         digitalWrite(relay2, HIGH); // выключаем помпу и ждем по времени
         digitalWrite(relay2, HIGH); // выключаем помпу и ждем по времени
         DelayPoliv = currentTime + time_poliv1; // период через который помпа включается для полива
         DelayPoliv = currentTime + time_poliv1; // период через который помпа включается для полива
       }
       }
       break;
       break;
Строка 154: Строка 127:
       if (currentTime >= DelayPoliv) {
       if (currentTime >= DelayPoliv) {
         nStatePoliv = 0;  // сбрасываем состояние порлива в начальный статус
         nStatePoliv = 0;  // сбрасываем состояние порлива в начальный статус
        Serial.println("sbros poliv  r2 ");
       }
       }
       break;
       break;
Строка 160: Строка 134:
}
}


void Priem() // выполняем циклически опрос порта и отправляем все байты с блютуса в шнур
{
  int  i, count; //i - это элемент массива команды из 4 байт
  count = BTSerial.available();
  if (count < 4) count = 0;
  else {
    for (i = 0; i < 4; i++) {
      inByte[i] = BTSerial.read();
      delay(10);
      Serial.print(inByte[i], DEC); // вывод в COM порт побайтоно в шестнадцатиричной системе
      Serial.print(" "); // ставим пробел между байтами, чтобы удобно было смотреть монитор порта
    }
    Serial.println();
    time_den =  3600000 * inByte[0]; ; // время светлого дня ( часов)
    time_noch =  3600000 * inByte[1]; // время сна ( часов);
    time_poliv1 =  60000 * inByte[2]; // время между поливами (min)
    time_poliv2 =  60000 * inByte[3]; // время полива (min)
    tone(dinamikPin, 1000, 500); // Play midi
  }
}
void Knopka() //  обрабатываем нажатие кнопки
{
  switch (inByte[3]) {
    case 221:
      digitalWrite(relay2, LOW); // включаем помпу по пульту
      inByte[3] = 0;
      Serial.print("q221  ");
      break;
    case 222:
      digitalWrite(relay2, HIGH); // выключаем помпу по пульту
      inByte[3] = 0;
      Serial.print("q222  ");
      break;
    case 211:
      digitalWrite(relay1, LOW); // включаем свет по пульту
      inByte[3] = 0;
      Serial.print("q211  ");
      break;
    case 212:
      digitalWrite(relay1, HIGH); // выключаем свет по пульту
      inByte[3] = 0;
      Serial.print("q212  ");
      break;
  }
}
void Zamer()    // Замер тмпературы и влажности воздуха
{
  switch (nStateZamer) {
    case 0:
      if (currentTime >= DelayZamer) {
        nStateZamer = 1;
        // Get Temperature
        step = analogRead(tempPin);
        temphumi[1] = amt1001_gettemperature(step); //  вычисляем температуру в С
        DelayZamer = currentTime + time_zamer; //период сколько работает помпа
      }
      break;
    case 1:
      if (currentTime >= DelayZamer) {
        nStateZamer = 2;
        // Get Humidity
        step = analogRead(humPin);
        double volt = (double)step * (5.0 / 1023.0);
        temphumi[2] = amt1001_gethumidity(volt); //  вычисляем влажность в %
        DelayZamer = currentTime + time_zamer; // период через который помпа включается для полива
      }
    case 2:
      if (currentTime >= DelayZamer) {
        nStateZamer = 0;  // сбрасываем состояние порлива в начальный статус
        temphumi[0] = 0x7f;
        Serial.print(temphumi[1]);
        Serial.print(" ");
        Serial.println( temphumi[2]);
        BTSerial.write(temphumi[0]);
        BTSerial.write(temphumi[1]);
        BTSerial.write(temphumi[2]);
      }
      break;
  }


</syntaxhighlight>
</syntaxhighlight>

Текущая версия от 19:43, 29 апреля 2021

//
// 29/04/2021 включаем и выключаем свет и помпу для микрозелени по расписанию,  umkiedu@gmail.com
//  чтоб небыло плесени сделать продувку вентилятором
//  свет можно включать в режиме заката - рассвета, если есть дополнительные реле
//  добавлен замер датчика освещенности, влажности, температуры - воздуха  AMT 1001 R=10kOm

#include <SoftwareSerial.h>
#include "amt1001_ino.h"
SoftwareSerial BTSerial(6, 7); // RX, TX

unsigned long time_den = 61200000;// время светлого дня (17 часов)
unsigned long time_noch = 25200000; // длительность сна (7 часов);
unsigned long time_poliv1 = 7200000; // время между поливами (120 мин)
unsigned long time_poliv2 =  60000; // длительность полива (1 мин)
unsigned long time_zamer =  20000; // длительность  между замерами (20 сек)

unsigned long currentTime, DelayNigth, DelayPoliv, DelayZamer;
int dinamikPin = 12;// пин пищалки

const int relay1 = 11;  // реле1 на pin D11
const int relay2 = 10;  // реле2  на pin D10
const int tempPin = A6; // analog pin
const int humPin = A7; // humidity
uint16_t step;
uint8_t temphumi[3];  //  массив из трех байт для вывод данных в график

int nStateNigth = 0; // статус ночь-0 день 1
int nStatePoliv = 0; // статус полив начат -0 , окончен - 1
int nStateZamer = 0; // статус замер окончен -0 , температура - 1, влажность - 2
unsigned char inByte[4];
void DayNigth(); // День-ночь
void Poliv();    // полив помпой
void Priem();    // прием данных из BT
void Knopka();   // Обработка данных по кнопке
void Zamer();    // Замер тмпературы и влажности воздуха

void setup()  {
  BTSerial.begin(9600); // инициализируем  порт блютус
  Serial.begin(9600);   // инициализируем  порт сериал - шнур USB
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);

  digitalWrite(relay1, LOW);
  digitalWrite(relay2, LOW);

  currentTime = millis();
  // установить начальные состояния процессов
  nStateNigth = 0;
  nStatePoliv = 0;

  DelayNigth  = currentTime;
  DelayPoliv = currentTime;
  DelayNigth += time_den;   // тек. время с задержкой на светлое время
  BTSerial.println(time_den / 3600000); // Выводим время светлого дня (17 часов)
  BTSerial.println(time_noch / 3600000); // Выводим длительность сна (7 часов);
  BTSerial.println(time_poliv1 / 60000); // Выводимвремя между поливами (120 мин)
  BTSerial.println(time_poliv2 / 60000); // Выводим длительность полива (1 мин)

}

// циклим процессы  - конечные автоматы
void loop()  {

  currentTime = millis();
  DayNigth();  // процесс ДеньНочь
  Poliv();     // процесс Полива помпой
  Priem();    // Автомат приема и обработки данных с пульта
  Knopka(); // обрабатываем кнопки прямого упроавляние релюшками
  Zamer();    // Замер тмпературы и влажности воздуха
}


// процесс ДеньНочь
void DayNigth()
{

  switch (nStateNigth) {
    // состояние День
    case 0:
      if (currentTime >= DelayNigth) {
        nStateNigth = 1;
        DelayNigth  = currentTime + time_noch; // переключаем на состояние ночь
        digitalWrite(relay1, LOW);  // Включаем свет
      }
      break;
    // состояние Ночь
    case 1:
      if (currentTime >= DelayNigth) {
        nStateNigth = 2;
        DelayNigth  = currentTime + time_den; // переключаем на состояние день
        digitalWrite(relay1, HIGH); // выключааем свет
      }
      break;
    case 2:
      if (currentTime >= DelayNigth) {
        nStateNigth = 0;  // сбрасываем состояние ночи в  статус день
        Serial.println("sbros den  r1 ");
      }
      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;  // сбрасываем состояние порлива в начальный статус
        Serial.println("sbros poliv  r2 ");
      }
      break;
  }

}

void Priem() // выполняем циклически опрос порта и отправляем все байты с блютуса в шнур
{
  int  i, count; //i - это элемент массива команды из 4 байт
  count = BTSerial.available();
  if (count < 4) count = 0;
  else {
    for (i = 0; i < 4; i++) {
      inByte[i] = BTSerial.read();
      delay(10);
      Serial.print(inByte[i], DEC); // вывод в COM порт побайтоно в шестнадцатиричной системе
      Serial.print(" "); // ставим пробел между байтами, чтобы удобно было смотреть монитор порта
    }
    Serial.println();
    time_den =  3600000 * inByte[0]; ; // время светлого дня ( часов)
    time_noch =  3600000 * inByte[1]; // время сна ( часов);
    time_poliv1 =  60000 * inByte[2]; // время между поливами (min)
    time_poliv2 =   60000 * inByte[3]; // время полива (min)
    tone(dinamikPin, 1000, 500); // Play midi
  }

}
void Knopka() //  обрабатываем нажатие кнопки
{
  switch (inByte[3]) {
    case 221:
      digitalWrite(relay2, LOW); // включаем помпу по пульту
      inByte[3] = 0;
      Serial.print("q221  ");
      break;
    case 222:
      digitalWrite(relay2, HIGH); // выключаем помпу по пульту
      inByte[3] = 0;
      Serial.print("q222  ");
      break;
    case 211:

      digitalWrite(relay1, LOW); // включаем свет по пульту
      inByte[3] = 0;
      Serial.print("q211  ");
      break;
    case 212:
      digitalWrite(relay1, HIGH); // выключаем свет по пульту
      inByte[3] = 0;
      Serial.print("q212  ");
      break;
  }
}

void Zamer()    // Замер тмпературы и влажности воздуха
{
  switch (nStateZamer) {
    case 0:
      if (currentTime >= DelayZamer) {
        nStateZamer = 1;
        // Get Temperature
        step = analogRead(tempPin);
        temphumi[1] = amt1001_gettemperature(step); //  вычисляем температуру в С
        DelayZamer = currentTime + time_zamer; //период сколько работает помпа
      }
      break;

    case 1:
      if (currentTime >= DelayZamer) {
        nStateZamer = 2;
        // Get Humidity
        step = analogRead(humPin);
        double volt = (double)step * (5.0 / 1023.0);
        temphumi[2] = amt1001_gethumidity(volt); //  вычисляем влажность в %
        DelayZamer = currentTime + time_zamer; // период через который помпа включается для полива
      }

    case 2:
      if (currentTime >= DelayZamer) {
        nStateZamer = 0;  // сбрасываем состояние порлива в начальный статус
        temphumi[0] = 0x7f;
        Serial.print(temphumi[1]);
        Serial.print(" ");
        Serial.println( temphumi[2]);
        BTSerial.write(temphumi[0]);
        BTSerial.write(temphumi[1]);
        BTSerial.write(temphumi[2]);
      }
      break;
  }