#include <GyverWDT.h>
#include <EEPROM.h>
#include <GyverNTC.h>
struct DATA{
bool flag_comp;
bool flag_ref;
bool flag_free;
};
int8_t PinFanRef = 3; //Вентилятор холодильник на 3 пин
int8_t PinTen = 6; //Тэн на 6 пин
int8_t PinCompressor = 5; //Компрессор на 5 пин
int8_t PinFanFree = 4; //Вентилятор морозилки на 4 пин
int8_t PinValveRef = A1; //Клапан холодильника на А1 пин
int8_t PinValveFree = A2; //Клапан морозилки на А2 пин
int8_t PinSensorRef = 5; //Датчик холодильника на А5 пин
int8_t PinSensorFree = 6; //Датчик морозилки на А6 пин
int8_t PinSensorDef = 7; //Датчик испарителя на А7 пин
bool flag1; //Флаг отправки начальных данных
bool flag2; //Флаг работы охлаждения и оттайки
bool flag3 = 0; //
bool flag4 = 0;
bool flag5 = 0;
bool flag6 = 0;
bool flag7 = 0;
bool flag8 = 0;
bool flag_comp; //Флаг работы компрессора
bool flag_indicator_comp; //Флан индикатора компрессора
bool flag_ref; //Флаг работы холодильника
bool flag_free; //Флаг работы морозилки
bool flag_ref_oper; //Флаг клапана холодильника
bool flag_free_oper; //Флаг клапана морозилки
bool flag_valve_ref; //Флаг работы клапана холодильника
bool flag_valve_free; //Флаг работы клапана морозилки
bool flag_colling; //Флаг режима работы холодильника(охлаждение, оттайка)
bool flag_page; //Флаг страницы
uint32_t tmr1; //Таймер температуры
uint32_t tmr2; //Таймер работы охлаждение
uint32_t tmr_colling; //Таймер охлаждения
uint32_t tmr_defrost; //Таймер оттайки
int8_t TempRef; //Датчик температура в холодильнике
int8_t TempFree; //Датчик температура в морозилке
int8_t TempDef; //Датчик температура испарителя
int8_t SetRef = 4; //Температура холодильника (установочная)
int8_t SetFree = -18; //Температура морозилки (установочная)
int8_t Hysteresis = 3; //Гистерезис
int16_t RefResist = 10; //Датчик холодильника (сопротивление)
int16_t FreeResist = 10; //Датчик морозилки (сопротивление)
int8_t DefResist = 10; //Датчик отттайки (сопротивление)
int8_t RefSensorCalibration = 0; //Датчик холодильника (калибровка)
int8_t FreeSensorCalibration = 0; //Датчик холодильника (калибровка)
int8_t DefSensorCalibration = 0; //Датчик холодильника (калибровка)
int8_t TimeBetDef = 12; //Время между оттайками (в часах)
int8_t DefTime = 20; //Время оттайки (в минутах)
int8_t DefTemp = 10; //Температура оттайки
void setup() {
Serial.begin(9600); //Установка скорости порта
Serial.setTimeout(50);
pinMode(PinFanRef, OUTPUT); //Подключение 4 пина на выход
pinMode(PinTen, OUTPUT); //Подключение 5 пина на выход
pinMode(PinCompressor, OUTPUT); //Подключение 6 пина на выход
pinMode(PinFanFree, OUTPUT); //Подключение 7 пина на выход
pinMode(PinValveRef, OUTPUT); //Подключение A1 пина на выход
pinMode(PinValveFree, OUTPUT); //Подключение A2 пина на выход
Watchdog.enable(RESET_MODE, WDT_PRESCALER_512);
//if(!EEPROM.read(0)) data_set_start(); //Проверяет начальное заполнение памяти и заполняет один раз при первом включении
//else data_set_read(); //Читаем данные из памяти
}
void loop() {
if (millis() > 3000 && !flag7){
veriable_name_data();
flag7 = 1;
}
// ЧИТАЕМ ТЕМПЕРАТУРУ С ДАТЧИКОВ И ОТПРАВЛЯЕМ В NEXTION
TempRef = RefSensorCalibration + Temperature(PinSensorRef, RefResist * 1000); //Снимаем показания датчика холодильника и записываем в переменную
TempFree = FreeSensorCalibration + Temperature(PinSensorFree, FreeResist * 1000); //Снимаем показания датчика морозилки и записываем в переменную
TempDef = DefSensorCalibration + Temperature(PinSensorDef, DefResist * 1000); //Снимаем показания датчика испарителя и записываем в переменную
if (millis() - tmr1 >= 5000){ //Включаем таймер, каждые 30 секунд отсылаем температуру на дисплей
send_nextion_string(F("page0.t1.txt"), TempRef);
send_nextion_string(F("page0.t0.txt"), TempFree);
send_nextion_string(F("page1.t1.txt"), TempDef);
tmr1 = millis(); //Сбрасываем таймер
}
// ЗАПУСКАЕМ РАБОТУ ОХЛАЖДЕНИЕ И ОТТАЙКИ
if (millis() > 60000){
if (!flag_colling){ //Включаем работу охлаждение и заморозки
if (millis() - tmr_colling <= TimeBetDef * 3600000){ //Запускаем работу охлаждения
fan_setup(1);
if (!flag_page){ //Порверяем флаг страницы
send_nextion_string(F("va0rec.txt"), 1); //Переходим на страницу охлаждения
flag_page = 1; //Опускаем флаг страницы
}
colling_mode(); //Работа охлаждения и заморозки
show_error(); //Если нехватает температуры, показываем ошибку
}
else{
digitalWrite(PinCompressor, 0); //Выключаем компрессор
flag_colling = 1; //Опускаем флаг работы охлаждения
tmr_defrost = millis(); //Обнуляем таймер оттайки
}
}
if (flag_colling){ //Включаем работу оттайки
if (millis() - tmr_defrost <= DefTime * 60000){ //Запускаем работу оттайки
fan_setup(0);
if (flag_page){ //Проверяем флаг страницы
send_nextion_string(F("page0.page1rec.txt"), 1); //Переходим на страницу оттайки
flag_page = 0; //Поднимаем флаг страницы
}
defrost_mode(); //Работа оттайки
}
else{
digitalWrite(PinTen, 0); //Выключаем тэн
flag_colling = 0; //Поднимаем флаг работы охлаждения
tmr_colling = millis(); //Обнуляем таймер охлаждения
}
}
}
// ЧИТАЕМ ДАННЫЕ С NEXTION
if (Serial.available() > 1) serial_parse(); //Если в порту что-то есть, то читаем
Watchdog.reset(); //Обнуляем Watchdog
}
/*void data_set_start(){ //Запись данных в память EEPROM
EEPROM.put(0, 1); //Закрываем ключь для начального заполнения
EEPROM.put(1, SetRef); //Температура холодильника (установочная)(a)
EEPROM.put(2, SetFree); //Температура морозилки (установочная)(b)
EEPROM.put(3, Hysteresis); //Гистерезис(c)
EEPROM.put(4, RefResist); //Датчик холодильника (сопротивление)(d)
EEPROM.put(5, FreeResist); //Датчик морозилки (сопротивление)(e)
EEPROM.put(6, DefResist); //Датчик отттайки (сопротивление)(f)
EEPROM.put(7, RefSensorCalibration); //Датчик холодильника (калибровка)(g)
EEPROM.put(8, FreeSensorCalibration); //Датчик морозилки (калибровка)(h)
EEPROM.put(9, DefSensorCalibration); //Датчик испарителя (калибровка)(i)
EEPROM.put(10, TimeBetDef); //Время между оттайками (в часах)(j)
EEPROM.put(11, DefTime); //Время оттайки (в минутах)(k)
EEPROM.put(12, DefTemp); //Температура оттайки(l)
}
void data_set_read(){ //Читаем данные из память EEPROM
EEPROM.get(1, SetRef); //Температура холодильника (установочная)(a)
EEPROM.get(2, SetFree); //Температура морозилки (установочная)(b)
EEPROM.get(3, Hysteresis); //Гистерезис(c)
EEPROM.get(4, RefResist); //Датчик холодильника (сопротивление)(d)
EEPROM.get(5, FreeResist); //Датчик морозилки (сопротивление)(e)
EEPROM.get(6, DefResist); //Датчик отттайки (сопротивление)(f)
EEPROM.get(7, RefSensorCalibration); //Датчик холодильника (калибровка)(g)
EEPROM.get(8, FreeSensorCalibration); //Датчик морозилки (калибровка)(h)
EEPROM.get(9, DefSensorCalibration); //Датчик испарителя (калибровка)(i)
EEPROM.get(10, TimeBetDef); //Время между оттайками (в часах)(j)
EEPROM.get(11, DefTime); //Время оттайки (в минутах)(k)
EEPROM.get(12, DefTemp); //Температура оттайки(l)
}*/
void send_nextion_string(String name, int16_t data){ //Отправляем данные в NEXTION
Serial.print(name + "=\"" + String(data, DEC) + "\"" + char(255) + char(255) + char(255));
}
void veriable_name_data(){ //Перебираем данные для отправки в NEXTION
int8_t arr_data[] = {SetRef, SetFree, Hysteresis, RefResist, FreeResist, DefResist,
RefSensorCalibration, FreeSensorCalibration, DefSensorCalibration, TimeBetDef, DefTime, DefTemp};
String arr_name[] = {F("page0.t3.txt"), F("page0.t2.txt"), F("page4.t7.txt"), F("page2.t5.txt"),F("page2.t4.txt"), F("page2.t6.txt"), F("page3.t4.txt"), F("page3.t5.txt"), F("page3.t6.txt"), F("page4.t4.txt"), F("page4.t5.txt"), F("page4.t6.txt")};
for(int8_t i = 0; i < 12; i++) send_nextion_string(arr_name[i], arr_data[i]);
}
int8_t Temperature(int8_t pin, int16_t resist){ //Снимаем показания температуры и отправляем в NEXTION
GyverNTC therm(pin, 10000, 3950, 24, resist);
int8_t temperature = int8_t(therm.getTemp());
return temperature;
}
DATA oper_comp(int8_t temp_ref, int8_t temp_free){ //Заполнием данные работы компрессора и клапанов
if (TempRef > SetRef + Hysteresis || TempFree > SetFree + Hysteresis) flag_comp = 1; //Поднимаем флан работы компрессора
else if (TempRef <= SetRef && TempFree <= SetFree) flag_comp = 0; //Опускаем флаг работы компрессора
if (TempRef > SetRef + Hysteresis) flag_ref = 1; //Поднимаем флаг работы холодильника
else if (TempRef <= SetRef) flag_ref = 0; //Опускаем флаг работы холодильника
if (TempFree > SetFree + Hysteresis) flag_free = 1; //Поднимаем флаг работы морозилки
else if (TempFree <= SetFree) flag_free = 0; //Опускаем флаг работы морозилки
DATA datax; //Создаем структуру и заполняем данными
datax.flag_comp = flag_comp;
datax.flag_ref = flag_ref;
datax.flag_free = flag_free;
return datax;
}
void valve_on_ref(){ //Откраваем клапан холодильника
digitalWrite(PinValveRef, flag_ref_oper); //Подаем питание на клапан холодильника
indicator_nextion(1);
delay(5); //Ждем 50 мсек
digitalWrite(PinValveRef, 0); //Отключае питание клапан холодильника
}
void valve_on_free(){ //Открываем клапан морозилки
digitalWrite(PinValveFree, flag_free_oper); //Подаем питание на клапан морозилки
indicator_nextion(2);
delay(5); //Ждем 50 мсек
digitalWrite(PinValveFree, 0); //Отключаем питание клапана морозилки
}
void colling_mode (){ //Режим работы охлаждения и заморозки
DATA datax; //Создаем структуры
datax = oper_comp(TempRef, TempFree); //Заполняем структуру данными
flag_ref_oper = (!flag_free_oper && datax.flag_ref); //Определяем действие холодильника
flag_free_oper = (!flag_ref_oper && datax.flag_free); //Определяем действие морозилки
if (flag_ref_oper && !flag_valve_ref){ //Определяем работу клапана холодильника
valve_on_ref(); //Открываем клапан холодильника
flag_valve_ref = 1; //Опускаем флаг клапана холодильника
}
if (!flag_ref_oper) flag_valve_ref = 0; //Проверяем если клапан холодильника закрыт поднимаем флаг клапана холодильника
if (flag_free_oper && !flag_valve_free){ ////Определяем работу клапана морозилки
valve_on_free(); //Открываем клапан морозилки
flag_valve_free = 1; //Опускаем флаг клапана морозилки
}
if (!flag_free_oper) flag_valve_free = 0; //Проверяем если клапан морозилки закрыт поднимаем флаг клапана морозилки
digitalWrite(PinCompressor, datax.flag_comp); //Включаем или выключаем компрессор
if (!datax.flag_comp) indicator_nextion(3);
}
void defrost_mode(){ //Режим работы оттайки
if (TempDef < DefTemp){
digitalWrite(PinTen, 1); //Проверяем тепературу и включаем тэн
if (!flag8){
send_nextion_string("page1.p1rec.txt", 1);
flag8 = 1;
}
}
else{
digitalWrite(PinTen, 0); //Выключаем тэн
if (flag8){
send_nextion_string("page1.p1rec.txt", 0);
flag8 = 0;
}
}
}
void serial_parse(){ //Проверяем и читаем порт
char key = Serial.read(); //Читаем данные(ключ)
int8_t val = Serial.parseInt(); //Читаем данные(результат)
switch (key) {
case 'a': SetRef = val; break;
case 'b': SetFree = val; break;
case 'c': Hysteresis = val; break;
case 'd': RefResist = val; break;
case 'e': FreeResist = val; break;
case 'f': DefResist = val; break;
case 'g': RefSensorCalibration = val; break;
case 'h': FreeSensorCalibration = val; break;
case 'i': DefSensorCalibration = val; break;
case 'j': TimeBetDef = val; break;
case 'k': DefTime = val; break;
case 'l': DefTemp = val; break;
}
//data_set_start(); //Обновляем данные в памяти
}
void indicator_nextion(int8_t flag){ //Отправляем работу индикаторов
switch (flag){
case 1:
if (!flag4){
send_nextion_string(F("page0.p4rec.txt"), 1); //Компрессор работает
send_nextion_string(F("page0.p2rec.txt"), 0); //Клапан морозилки закрыт
send_nextion_string(F("page0.p1rec.txt"), 1); //Клапан холодильника открыт
}
flag4 = 1;
flag5 = 0;
flag6 = 0;
break;
case 2:
if (!flag5){
send_nextion_string(F("page0.p4rec.txt"), 1); //Компрессор работает
send_nextion_string(F("page0.p2rec.txt"), 1); //Клапан морозилки открыт
send_nextion_string(F("page0.p1rec.txt"), 0); //Клапан холодильника закрыт
}
flag4 = 0;
flag5 = 1;
flag6 = 0;
break;
case 3:
if (!flag6){
send_nextion_string(F("page0.p4rec.txt"), 0); //Компрессор выключен
send_nextion_string(F("page0.p2rec.txt"), 0); //Клапан морозилки закрыт
send_nextion_string(F("page0.p1rec.txt"), 0); //Клапан холодильника закрыт
}
flag4 = 0;
flag5 = 0;
flag6 = 1;
break;
}
}
void fan_setup(bool i){ //Работа вентиляторов
digitalWrite(PinFanRef, i); //Работа вентилятора холодильника
digitalWrite(PinFanFree, i); //Работа вентилятора морозилки
}
void show_error(){ //Проверка температуры и отправка ошибки
if ((TempRef >= SetRef + 8) || (TempFree >= SetFree + 8)) { //Если температура в холодильнике или морозилке больше установочной на 8 градусов
if (!flag3){
send_nextion_string("page0.reff.txt", 1); //Проверяем температуру если превышает установочную показываем ошибку в NEXTION
flag3 = 1;
}
}
else if (flag3){
send_nextion_string("page0.reff.txt", 0); //Убираем ошибку в NEXTION
flag3 = 0;
}
}