#include <LiquidCrystal_I2C.h>
#include <GyverNTC.h>
LiquidCrystal_I2C lcd(0x27,20,4);
int8_t pin_comp = 3;
int8_t pin_ten = 2;
int8_t pin_term_ref = 0;
int8_t pin_term_free = 1;
int8_t pin_term_def = 2;
int8_t pin_valve_ref = 12;
int8_t pin_valve_free = 11;
float temp_ref;
float temp_free;
uint32_t tm;
uint32_t tmr1;
uint32_t tmr2;
uint32_t tmr_colling;
uint32_t tmr_defrost;
bool flag_tmr;
bool flag_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;
struct DATA{
bool flag_comp;
bool flag_ref;
bool flag_free;
};
void setup(){
pinMode(pin_comp, OUTPUT);
pinMode(pin_ten, OUTPUT);
pinMode(pin_term_ref, OUTPUT);
pinMode(pin_term_free, OUTPUT);
lcd.init();
lcd.backlight();
lcd.print("TEMP:");
lcd.setCursor(0, 1);
lcd.print("TEMP-1:");
}
void loop(){
temp_ref = Temperature(pin_term_ref, 10000);
temp_free = Temperature(pin_term_free, 10000);
temp_print(temp_ref, temp_free);
if (millis() > 3000){
if (!flag_colling){ //Включаем работу охлаждение и заморозки
if (millis() - tmr_colling <= 20000){
colling_mode();
}
else{
digitalWrite(pin_comp, 0);
flag_colling = 1;
tmr_defrost = millis();
}
}
if (flag_colling){ //Включаем работу оттайки
if (millis() - tmr_defrost <= 10000){
defrost_mode();
}
else{
digitalWrite(2, 0);
flag_colling = 0;
tmr_colling = millis();
}
}
}
}
float Temperature(int8_t pin, int16_t resist){
GyverNTC therm(pin, 9960, 3950, 24, resist);
float temperature = therm.getTempAverage();
return temperature;
}
DATA oper_comp(float temp_ref, float temp_free){
if (temp_ref > 4 + 3 || temp_free > -18 + 3) flag_comp = 1;
else if (temp_ref <= 4 && temp_free <= -18) flag_comp = 0;
if (temp_ref > 4 + 3) flag_ref = 1;
else if (temp_ref <= 4) flag_ref = 0;
if (temp_free > -18 + 3) flag_free = 1;
else if (temp_free <= 4) flag_free = 0;
DATA data;
data.flag_comp = flag_comp;
data.flag_ref = flag_ref;
data.flag_free = flag_free;
return data;
}
void temp_print(float temp_ref, float temp_free){
if (temp_ref < 0){
lcd.setCursor(5, 0);
lcd.print(temp_ref);
}
else{
lcd.setCursor(5, 0);
lcd.print(" ");
lcd.print(temp_ref);
}
if (temp_free < 0){
lcd.setCursor(7, 1);
lcd.print(temp_free);
}
else{
lcd.setCursor(7, 1);
lcd.print(" ");
lcd.print(temp_free);
}
}
void colling_mode (){ //Режим работы охлаждения и заморозки
DATA data; //Создаем структуры
data = oper_comp(temp_ref, temp_free); //Заполняем структуру данными
flag_ref_oper = (!flag_free_oper && data.flag_ref); //Определяем действие холодильника
flag_free_oper = (!flag_ref_oper && data.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(pin_comp, data.flag_comp); //Включаем или выключаем компрессор
}
void valve_on_ref(){ //Откраваем клапан холодильника
digitalWrite(pin_valve_ref, flag_ref_oper); //Подаем питание на клапан холодильника
delay(10); //Ждем 50 мсек
digitalWrite(pin_valve_ref, 0); //Отключае питание клапан холодильника
}
void valve_on_free(){ //Открываем клапан морозилки
digitalWrite(pin_valve_free, flag_free_oper); //Подаем питание на клапан морозилки
delay(10); //Ждем 50 мсек
digitalWrite(pin_valve_free, 0); //Отключаем питание клапана морозилки
}
void defrost_mode(){ //Режим работы оттайки
if (Temperature(pin_term_def, 10000) < 10) digitalWrite(2, 1);
else digitalWrite(2, 0);
}