1920smart socket
Перейти к навигации
Перейти к поиску
//
// 24/03/2021 включаем и выключаем свет и помпу для микрозелени по расписанию, umkiedu@gmail.com
// чтоб небыло плесени сделать продувку вентилятором
// свет можно включать в режиме заката - рассвета, если есть дополнительные реле
// сделать замеры датчика освещенности, влажности, температуры - воздуха и раствора, а так же уровня раствора в баке
#include <SoftwareSerial.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 min)
unsigned long time_poliv2 = 60000; // длительность полива (1 min)
unsigned long currentTime, DelayNigth, DelayPoliv;
int dinamikPin = 12;// пин пищалки
const int relay1 = 11; // реле1 на pin D11
const int relay2 = 10; // реле2 на pin D10
int nStateNigth = 0; // статус ночь-0 день 1
int nStatePoliv = 0; // статус полив начат -0 , окончен - 1
unsigned char inByte[4];
void DayNigth(); // День-ночь
void Poliv(); // полив помпой
void Priem(); // прием данных из BT
void Knopka(); // Обработка данных по кнопке
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; // тек. время с задержкой на светлое время
}
// циклим процессы - конечные автоматы
void loop() {
currentTime = millis();
DayNigth(); // процесс ДеньНочь
Poliv(); // процесс Полива помпой
Priem(); // Автомат приема и обработки данных с пульта
Knopka(); // обрабатываем кнопки прямого упроавляние релюшками
}
// процесс ДеньНочь
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;
}
}