1920smart socket: различия между версиями
Перейти к навигации
Перейти к поиску
Woronin (обсуждение | вклад) Нет описания правки |
Woronin (обсуждение | вклад) Нет описания правки |
||
Строка 1: | Строка 1: | ||
<syntaxhighlight lang="C++"> | <syntaxhighlight lang="C++"> | ||
// | // | ||
// | // 10/03/2021 включаем и выключаем свет и помпу для микрозелени по расписанию, umkiedu@gmail.com | ||
// чтоб небыло плесени сделать продувку вентилятором | // чтоб небыло плесени сделать продувку вентилятором | ||
// свет можно включать в режиме заката - рассвета, если есть дополнительные реле | // свет можно включать в режиме заката - рассвета, если есть дополнительные реле | ||
#include <SoftwareSerial.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_poliv1 = 7200000; // время между поливами (120 min) | |||
unsigned long time_poliv2 = 60000; // время полива (1 min) | |||
unsigned long time_rasvet1 = 3000; // 60000; // время рассвета | unsigned long time_rasvet1 = 3000; // 60000; // время рассвета | ||
unsigned long time_zakat1 = 2000 ; //60000; // время заката | unsigned long time_zakat1 = 2000 ; //60000; // время заката | ||
unsigned long currentTime, DelayNigth, DelayRassvet, DelayZakat, DelayPoliv; | unsigned long currentTime, DelayNigth, DelayRassvet, DelayZakat, DelayPoliv; | ||
int dinamikPin = 12;// пин пищалки | |||
const int relay1 = 11; // реле1 на pin D11 | const int relay1 = 11; // реле1 на pin D11 | ||
Строка 22: | Строка 26: | ||
int nStateZakat = 0; // статус закат начат -0 , окончен - 1 | int nStateZakat = 0; // статус закат начат -0 , окончен - 1 | ||
int nStatePoliv = 0; // статус полив начат -0 , окончен - 1 | int nStatePoliv = 0; // статус полив начат -0 , окончен - 1 | ||
unsigned char inByte[4]; | |||
int bf1[] = {0, 49}; | |||
int bf2[] = {0, 50}; | |||
int bf3[] = {0, 51}; | |||
int bf4[] = {0, 52}; | |||
void DayNigth(); | void DayNigth(); | ||
void Rassvet(); | void Rassvet(); | ||
void Zakat(); | void Zakat(); | ||
void Poliv(); | void Poliv(); | ||
void Priem(); | |||
void Knopka(); // обрабатываем нажатие кнопки | |||
void midi() ; // писк | |||
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); | ||
Строка 54: | Строка 65: | ||
// циклим процессы - конечные автоматы | // циклим процессы - конечные автоматы | ||
void loop() { | void loop() { | ||
currentTime = millis(); | currentTime = millis(); | ||
DayNigth(); // процесс ДеньНочь | DayNigth(); // процесс ДеньНочь | ||
Строка 59: | Строка 71: | ||
Zakat(); // процесс Закат | Zakat(); // процесс Закат | ||
Poliv(); // процесс Полива помпой | Poliv(); // процесс Полива помпой | ||
Priem(); // Автомат приема и обработки данных с пульта | |||
Knopka(); // обрабатываем нажатие кнопки | |||
} | } | ||
Строка 135: | Строка 149: | ||
void Poliv() | void Poliv() | ||
{ | { | ||
switch (nStatePoliv) { | switch (nStatePoliv) { | ||
case 0: | case 0: | ||
Строка 142: | Строка 155: | ||
digitalWrite(relay2, LOW); // включаем помпу на время полива | digitalWrite(relay2, LOW); // включаем помпу на время полива | ||
DelayPoliv = currentTime + time_poliv2; //период сколько работает помпа | DelayPoliv = currentTime + time_poliv2; //период сколько работает помпа | ||
} | } | ||
break; | break; | ||
Строка 149: | Строка 163: | ||
digitalWrite(relay2, HIGH); // выключаем помпу и ждем по времени | digitalWrite(relay2, HIGH); // выключаем помпу и ждем по времени | ||
DelayPoliv = currentTime + time_poliv1; // период через который помпа включается для полива | DelayPoliv = currentTime + time_poliv1; // период через который помпа включается для полива | ||
} | } | ||
break; | break; | ||
Строка 156: | Строка 171: | ||
} | } | ||
break; | break; | ||
case 3: | |||
if (inByte[1] == 1) { | |||
digitalWrite(relay2, LOW); // включаем помпу по пульту | |||
} | |||
break; | |||
case 4: | |||
if (inByte[1] == 0x32) { | |||
digitalWrite(relay2, HIGH); // выключаем помпу по пульту | |||
Serial.print("qqq "); | |||
} | |||
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(); | |||
} | } | ||
} | |||
void Knopka() // обрабатываем нажатие кнопки | |||
{ | |||
if (inByte[3] == 221) { | |||
digitalWrite(relay2, LOW); // включаем помпу по пульту | |||
Serial.print("q111 "); | |||
} | |||
else if (inByte[3] == 222) { | |||
digitalWrite(relay2, HIGH); // выключаем помпу по пульту | |||
Serial.print("q112 "); | |||
} else if (inByte[3] == 212) { | |||
digitalWrite(relay1, LOW); // включаем свет по пульту | |||
Serial.print("q121 "); | |||
} | |||
else if (inByte[3] == 211) { | |||
digitalWrite(relay1, HIGH); // выключаем свет по пульту | |||
Serial.print("q122 "); | |||
} | |||
else { | |||
time_den = 10000 * inByte[0] ; // 3600000* inByte[0]; ;// время светлого дня ( часов) | |||
time_noch = 10000 * inByte[1]; // 3600000* inByte[1]; // время сна ( часов); | |||
time_poliv1 = 10000 * inByte[2]; // 60000 * inByte[2]; // время между поливами (min) | |||
time_poliv2 = 10000 * inByte[3]; // 60000 * inByte[3]; // время полива (min) | |||
// midi(); // Play midi | |||
} | |||
} | } | ||
void midi() { | |||
tone(dinamikPin, 1000, 500); | |||
delay(500); | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> |
Версия от 00:25, 22 марта 2021
//
// 10/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 time_rasvet1 = 3000; // 60000; // время рассвета
unsigned long time_zakat1 = 2000 ; //60000; // время заката
unsigned long currentTime, DelayNigth, DelayRassvet, DelayZakat, DelayPoliv;
int dinamikPin = 12;// пин пищалки
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
unsigned char inByte[4];
int bf1[] = {0, 49};
int bf2[] = {0, 50};
int bf3[] = {0, 51};
int bf4[] = {0, 52};
void DayNigth();
void Rassvet();
void Zakat();
void Poliv();
void Priem();
void Knopka(); // обрабатываем нажатие кнопки
void midi() ; // писк
void setup() {
BTSerial.begin(9600); // инициализируем порт блютус
Serial.begin(9600); // инициализируем порт сериал - шнур USB
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(); // процесс Полива помпой
Priem(); // Автомат приема и обработки данных с пульта
Knopka(); // обрабатываем нажатие кнопки
}
// процесс ДеньНочь
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;
case 3:
if (inByte[1] == 1) {
digitalWrite(relay2, LOW); // включаем помпу по пульту
}
break;
case 4:
if (inByte[1] == 0x32) {
digitalWrite(relay2, HIGH); // выключаем помпу по пульту
Serial.print("qqq ");
}
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();
}
}
void Knopka() // обрабатываем нажатие кнопки
{
if (inByte[3] == 221) {
digitalWrite(relay2, LOW); // включаем помпу по пульту
Serial.print("q111 ");
}
else if (inByte[3] == 222) {
digitalWrite(relay2, HIGH); // выключаем помпу по пульту
Serial.print("q112 ");
} else if (inByte[3] == 212) {
digitalWrite(relay1, LOW); // включаем свет по пульту
Serial.print("q121 ");
}
else if (inByte[3] == 211) {
digitalWrite(relay1, HIGH); // выключаем свет по пульту
Serial.print("q122 ");
}
else {
time_den = 10000 * inByte[0] ; // 3600000* inByte[0]; ;// время светлого дня ( часов)
time_noch = 10000 * inByte[1]; // 3600000* inByte[1]; // время сна ( часов);
time_poliv1 = 10000 * inByte[2]; // 60000 * inByte[2]; // время между поливами (min)
time_poliv2 = 10000 * inByte[3]; // 60000 * inByte[3]; // время полива (min)
// midi(); // Play midi
}
}
void midi() {
tone(dinamikPin, 1000, 500);
delay(500);
}