1920smart socket: различия между версиями
Перейти к навигации
Перейти к поиску
Woronin (обсуждение | вклад) Нет описания правки |
Woronin (обсуждение | вклад) Нет описания правки |
||
(не показаны 3 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
<syntaxhighlight lang="C++"> | <syntaxhighlight lang="C++"> | ||
// | // | ||
// | // 29/04/2021 включаем и выключаем свет и помпу для микрозелени по расписанию, umkiedu@gmail.com | ||
// чтоб небыло плесени сделать продувку вентилятором | // чтоб небыло плесени сделать продувку вентилятором | ||
// свет можно включать в режиме заката - рассвета, если есть дополнительные реле | // свет можно включать в режиме заката - рассвета, если есть дополнительные реле | ||
// добавлен замер датчика освещенности, влажности, температуры - воздуха AMT 1001 R=10kOm | |||
#include <SoftwareSerial.h> | #include <SoftwareSerial.h> | ||
#include "amt1001_ino.h" | |||
SoftwareSerial BTSerial(6, 7); // RX, TX | SoftwareSerial BTSerial(6, 7); // RX, TX | ||
unsigned long time_den = 61200000;// время светлого дня (17 часов) | unsigned long time_den = 61200000;// время светлого дня (17 часов) | ||
unsigned long time_noch = 25200000; // | unsigned long time_noch = 25200000; // длительность сна (7 часов); | ||
unsigned long time_poliv1 = 7200000; // время между поливами (120 | unsigned long time_poliv1 = 7200000; // время между поливами (120 мин) | ||
unsigned long time_poliv2 = 60000; // | unsigned long time_poliv2 = 60000; // длительность полива (1 мин) | ||
unsigned long time_zamer = 20000; // длительность между замерами (20 сек) | |||
unsigned long currentTime, DelayNigth, DelayPoliv, DelayZamer; | |||
unsigned long currentTime, DelayNigth, | |||
int dinamikPin = 12;// пин пищалки | int dinamikPin = 12;// пин пищалки | ||
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 nStatePoliv = 0; // статус полив начат -0 , окончен - 1 | int nStatePoliv = 0; // статус полив начат -0 , окончен - 1 | ||
int nStateZamer = 0; // статус замер окончен -0 , температура - 1, влажность - 2 | |||
unsigned char inByte[4]; | unsigned char inByte[4]; | ||
void DayNigth(); // День-ночь | |||
void Poliv(); // полив помпой | |||
void Priem(); // прием данных из BT | |||
void Knopka(); // Обработка данных по кнопке | |||
void DayNigth(); | void Zamer(); // Замер тмпературы и влажности воздуха | ||
void Poliv(); | |||
void Priem(); | |||
void Knopka(); // | |||
void | |||
void setup() { | void setup() { | ||
Строка 45: | Строка 42: | ||
pinMode(relay2, OUTPUT); | pinMode(relay2, OUTPUT); | ||
digitalWrite(relay1, | digitalWrite(relay1, LOW); | ||
digitalWrite(relay2, | digitalWrite(relay2, LOW); | ||
currentTime = millis(); | currentTime = millis(); | ||
// установить начальные состояния процессов | // установить начальные состояния процессов | ||
nStateNigth = 0; | nStateNigth = 0; | ||
nStatePoliv = 0; | nStatePoliv = 0; | ||
DelayNigth = currentTime; | DelayNigth = 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 мин) | |||
} | } | ||
Строка 68: | Строка 65: | ||
currentTime = millis(); | currentTime = millis(); | ||
DayNigth(); // процесс ДеньНочь | DayNigth(); // процесс ДеньНочь | ||
Poliv(); // процесс Полива помпой | Poliv(); // процесс Полива помпой | ||
Priem(); // Автомат приема и обработки данных с пульта | Priem(); // Автомат приема и обработки данных с пульта | ||
Knopka(); | Knopka(); // обрабатываем кнопки прямого упроавляние релюшками | ||
Zamer(); // Замер тмпературы и влажности воздуха | |||
} | } | ||
Строка 85: | Строка 81: | ||
if (currentTime >= DelayNigth) { | if (currentTime >= DelayNigth) { | ||
nStateNigth = 1; | nStateNigth = 1; | ||
DelayNigth = currentTime + time_noch; // переключаем на состояние ночь | DelayNigth = currentTime + time_noch; // переключаем на состояние ночь | ||
digitalWrite(relay1, LOW); // Включаем свет | |||
} | } | ||
break; | break; | ||
Строка 92: | Строка 88: | ||
case 1: | case 1: | ||
if (currentTime >= DelayNigth) { | if (currentTime >= DelayNigth) { | ||
nStateNigth = | nStateNigth = 2; | ||
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; | ||
} | } | ||
} | } | ||
Строка 169: | Строка 127: | ||
if (currentTime >= DelayPoliv) { | if (currentTime >= DelayPoliv) { | ||
nStatePoliv = 0; // сбрасываем состояние порлива в начальный статус | nStatePoliv = 0; // сбрасываем состояние порлива в начальный статус | ||
Serial.println("sbros poliv r2 "); | |||
Serial. | |||
} | } | ||
break; | break; | ||
Строка 199: | Строка 147: | ||
} | } | ||
Serial.println(); | 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 | |||
} | } | ||
Строка 204: | Строка 157: | ||
void Knopka() // обрабатываем нажатие кнопки | void Knopka() // обрабатываем нажатие кнопки | ||
{ | { | ||
switch (inByte[3]) { | |||
digitalWrite(relay2, LOW); // включаем помпу по пульту | 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 | 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;
}