// Контроллер самогонного аппарата
// "ХАН - 1"
// by minash87
// Версия 1.0
// Сокращения
// CUB - датчик температуры в кубе (Cube) (ёмкость в которой находится брага)
// TRA - датчик в трубке связи с атмосферой (Temperature Relationship with the Atmosphere)
// CS - датчик в охладителе (Cooling System)
// --------------------- Установка пинов подключения периферии ---------------------
// Энкодер
#define CLK 3 //S1 должен быть подключен на пин аппаратного прерывания
#define DT 2 //S2 должен быть подключен на пин аппаратного прерывания
#define SW 4 //KEY
// Кнопки
#define BSt 10 //Кнопка Пуск
#define BSp 11 //Кнопка Стоп/Звук
#define BMn 12 //Кнопка Меню
#define BEx 13 //Кнопка Выход
// Датчики температуры DS18B20
#define SCUB 7 // Датчик в кубе
#define STRA 9 // Датчик в ТСА
#define SCS 8 // Датчик в охладителе
// Реле
#define SSRCUB 5 // SSR включения/отключения тэна куба
#define SSRFCUB 6 // SSR включения/отключения форсажа нагревания куба
#define R1CS 14 // Реле 1 включения/отключения охлаждения
#define R2Ring 15 // Реле 2 включения/отключения сирены
#define R3RLamp 16 // Реле 3 включения/отключения красной лампы
#define R4GLamp 17 // Реле 4 включения/отключения зелёной лампы
// --------------------- Библиотеки, настройки, переменные ---------------------
//Библиотеки
#include <EncButton.h>
#include <microDS18B20.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
// Энкодер и кнопки
EncButton <EB_TICK, CLK, DT, SW> Enc;
EncButton <EB_TICK, BSt> BtnStart; //Кнопка Пуск
EncButton <EB_TICK, BSp> BtnStop; //Кнопка Стоп/Звук
EncButton <EB_TICK, BMn> BtnMenu; //Кнопка Меню
EncButton <EB_TICK, BEx> BtnExit; //Кнопка Выход
// Датчики температуры DS18B20
MicroDS18B20<SCUB> SensorCUB; // Датчик в кубе
MicroDS18B20<STRA> SensorTRA; // Датчик в ТСА
MicroDS18B20<SCS> SensorCS; // Датчик в охладителе
// LCD дисплей
LiquidCrystal_I2C lcd(0x27, 16, 2); // Дисплей 1602A
// Таймеры
uint32_t TOne; // Таймер 1
// Меню
uint16_t MenuPage = 0;
// Коэффициенты калибровка датчиков температуры
float kCUB = 0;
float kTRA = 0;
float kCS = 0;
// Суммы с датчиков температур и коэффициентов калибровки
float TempCUB;
float TempTRA;
float TempCS;
// Защита по превышению температуры
boolean ActivateProtectTempCUB = 0; // Включение/выключение слежения за превышением температуры. 0 - выкл, 1 - вкл
boolean ActivateProtectTempTRA = 0; // Включение/выключение слежения за превышением температуры. 0 - выкл, 1 - вкл
boolean ActivateProtectTempCS = 0; // Включение/выключение слежения за превышением температуры. 0 - выкл, 1 - вкл
uint8_t ProtectTempCUB = 99; // Установка температуры полного отключения тэнов
uint8_t ProtectTempTRA = 45; // Установка температуры полного отключения тэнов
uint8_t ProtectTempCS = 45; // Установка температуры полного отключения тэнов
// Защита по потере датчиков температуры
boolean OnlineSensorCUB = 0; // Включение/выключение слежения за потерей датчиков температуры. 0 - выкл, 1 - вкл
boolean OnlineSensorTRA = 0; // Включение/выключение слежения за потерей датчиков температуры. 0 - выкл, 1 - вкл
boolean OnlineSensorCS = 0; // Включение/выключение слежения за потерей датчиков температуры. 0 - выкл, 1 - вкл
// Отбор спирта сырца
boolean EnableRAW = 0; // Начальное меню режима отбора спирта сырца. 0 - выкл этого режима, 1 - вкл.
uint8_t TempTurnOnCSRAW = 30; // Температура активации охлаждение при отборе спирта сырца.
uint8_t TempTurnOffCUBRAW = 99; // Температура выключения тэна(ов) по окончанию отбора спирта сырца.
// Отбор голов
boolean EnableHEAD = 0; // Начальное меню режима отбора голов. 0 - выкл этого режима, 1 - вкл.
// Отбор тела
boolean EnableBODY = 0; // Начальное меню режима отбора тела. 0 - выкл этого режима, 1 - вкл.
// Отбор хвостов
boolean EnableTAIL = 0; // Начальное меню режима отбора хвостов. 0 - выкл этого режима, 1 - вкл.
void setup() {
Serial.begin(9600);
// Энкодер
attachInterrupt (0, isrCLK, CHANGE);
attachInterrupt (1, isrDT, CHANGE);
// Реле
pinMode(SSRCUB, OUTPUT); // SSR куба
pinMode(SSRFCUB, OUTPUT); // SSR форсажа куба (дополнительные тэны, или просто электроплитка)
pinMode(R1CS, OUTPUT); // реле включения охлаждения
pinMode(R2Ring, OUTPUT); // Сирена
pinMode(R3RLamp, OUTPUT); // Красная лампа
pinMode(R4GLamp, OUTPUT); // Зелёная лампа
// Дисплей
lcd.init();
lcd.backlight();
}
void loop() {
Serial.println(MenuPage);
Enc.tick(); // опрос энкодера
BtnStart.tick(); // опрос кнопки Старт
BtnStop.tick(); // опрос кнопки Стоп
BtnMenu.tick(); // опрос кнопки Меню
BtnExit.tick(); // опрос кнопки Выход
Temperature(); // Расчёт температур с коэффициентом калибровки
AlarmTemp(); // Превышение заданой температуры в режиме защиты
if (BtnExit.held()) { // в любом месте меню, если зажать кнопку выход, выходит на основной экран
lcd.clear();
MenuPage = 0;
Serial.println(MenuPage);
}
// --------------------- Конструкция переходов по меню ---------------------
// Если переменная MenuPage равна какому-то значению, на дисплей выводится та менюшка, которая за это отвечает
// Если первое меню равно 10, все относящиеся к этому меню имюет значения +1 (11, 12, 13 и т.д.)
// Если меню другого режима, переменная равна + 10 (10, 20, 30 и т.д.)
// Таким образом видна связь по меню, если PageMenu равно 56, то начальное меню будет 50.
// Вывод основной информации начинается с нуля
// Меню по основным режимам начинается с 10
// Меню по настройкам начинается со 100
// Вывод тревог начинается с 200
switch (MenuPage) {
case 0:
TempGUI(); // Основной экран, выводится температуры с датчиков
if (BtnMenu.click()) {
lcd.clear();
MenuPage = 10;
Serial.println(MenuPage);
}
if (BtnMenu.held()) {
lcd.clear();
MenuPage = 100;
Serial.println(MenuPage);
}
//if (Enc.rightH());
//if (Enc.leftH());
break;
case 10: MenuRAW(); // Начальное меню режима отбора спитра сырца
break;
case 11: TurnOnCSRAW(); // Температура активации охлаждение при отборе спирта сырца.
break;
case 12: TurnOffCUBRAW(); // Температура выключения тэна(ов) по окончанию отбора спирта сырца.
break;
case 20: MenuHEAD(); // Начальное меню режима отбора голов.
break;
case 30: MenuBODY(); // Начальное меню режима отбора тела.
break;
case 40: MenuTAIL(); // Начальное меню режима отбора хвостов.
break;
case 100: CalibrationSensorTemp(); // Начальное меню калибровки датчиков температуры
break;
case 101: CalibrationCUB(); // Калибровки датчика в кубе
break;
case 102: CalibrationTRA(); // Калибровки датчика в ТСА
break;
case 103: CalibrationCS(); // Калибровки датчика в охладителе
break;
case 110: ProtectionTemp(); // Начальное меню функции защиты при повышении температуры
break;
case 111: ProtectionTempCUB(); // Установка значения для датчика в кубе
break;
case 112: ProtectionTempTRA(); // Установка значения для датчика в ТСА
break;
case 113: ProtectionTempCS(); // Установка значения для датчика в охладителе
break;
case 120: ProtectionSensor(); // Начальное меню функции защиты от потери датчиков температуры
break;
case 121: ProtectionSensorCUB(); // Включение/выключение реакции на потерю датчика в кубе
break;
case 122: ProtectionSensorTRA(); // Включение/выключение реакции на потерю датчика в ТСА
break;
case 123: ProtectionSensorCS(); // Включение/выключение реакции на потерю датчика в охладителе
break;
case 200:
AlarmTempCUB(); //Вывод тревоги на дисплей при превышении температуры в кубе
ResetProtecTemp(); //Сброс настроек защиты по превышению температуры
break;
case 201:
AlarmTempTRA(); //Вывод тревоги на дисплей при превышении температуры в ТСА
ResetProtecTemp(); //Сброс настроек защиты по превышению температуры
break;
case 202:
AlarmTempCS(); //Вывод тревоги на дисплей при превышении температуры в охладителе
ResetProtecTemp(); //Сброс настроек защиты по превышению температуры
break;
case 203:
AlarmTempCUBTRA(); //Вывод тревоги на дисплей при превышении температуры в кубе и ТСА
ResetProtecTemp(); //Сброс настроек защиты по превышению температуры
break;
case 204:
AlarmTempCUBCS(); //Вывод тревоги на дисплей при превышении температуры в кубе и охладителе
ResetProtecTemp(); //Сброс настроек защиты по превышению температуры
break;
case 205:
AlarmTempTRACS(); //Вывод тревоги на дисплей при превышении температуры в ТСА и охладителе
ResetProtecTemp(); //Сброс настроек защиты по превышению температуры
break;
case 206:
AlarmTempCUBTRACS(); //Вывод тревоги на дисплей при превышении температуры в кубе, ТСА и охладителе
ResetProtecTemp(); //Сброс настроек защиты по превышению температуры
break;
}
}
// --------------------- Вывод температур с датчиков на дисплей ---------------------
void TempGUI() { //MenuPage = 0
lcd.setCursor(0, 0);
lcd.print("CUB ");
lcd.print(TempCUB);
lcd.setCursor(0, 1);
lcd.print("TRA ");
lcd.print(TempTRA);
lcd.setCursor(12, 0);
lcd.print("CS");
lcd.setCursor(11, 1);
lcd.print(TempCS);
}
// --------------------- МЕНЮ ОТБОРА СПИРТА СЫРЦА ---------------------
// Начальное меню режима отбора спитра сырца
void MenuRAW() { //MenuPage = 10
lcd.setCursor(0, 0);
lcd.print("RAW ");
if (EnableRAW == 1) {
lcd.print("ON ");
if (Enc.click()) {
lcd.clear();
MenuPage = 11;
Serial.println(MenuPage);
}
}
if (EnableRAW == 0) lcd.print("OFF"); //Если выключено войти в меню нельзя и при запуске программы отбор спитра сырца производится не будет
if (Enc.rightH()) EnableRAW = 1;
if (Enc.leftH()) EnableRAW = 0;
if (BtnMenu.click()) {
lcd.clear();
MenuPage = 20;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 0;
Serial.println(MenuPage);
}
}
// Температура активации охлаждение при отборе спирта сырца.
void TurnOnCSRAW() { //MenuPage = 11
lcd.setCursor(1, 0);
lcd.print("1.On CS Temp ");
lcd.setCursor(8, 1);
lcd.print(TempTurnOnCSRAW);
if (Enc.right()) TempTurnOnCSRAW += 1.00;
if (Enc.left()) TempTurnOnCSRAW -= 1.00;
if (BtnMenu.click()) {
MenuPage = 12;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 10;
Serial.println(MenuPage);
}
if (TempTurnOnCSRAW >= 100) TempTurnOnCSRAW = 10; //Ограничиваю выбор температуры потому что на дисплее остаются знаки
if (TempTurnOnCSRAW <= 9) TempTurnOnCSRAW = 99; //И потому что использовать lcd.clear() не вариант (экран мигает как сумасшедший)
}
// Температура выключения тэна(ов) по окончанию отбора спирта сырца.
void TurnOffCUBRAW() { //MenuPage = 12
lcd.setCursor(1, 0);
lcd.print("2.Off CUB Temp");
lcd.setCursor(8, 1);
lcd.print(TempTurnOffCUBRAW);
if (Enc.right()) TempTurnOffCUBRAW += 1.00;
if (Enc.left()) TempTurnOffCUBRAW -= 1.00;
if (BtnMenu.click()) {
MenuPage = 11;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 10;
Serial.println(MenuPage);
}
if (TempTurnOffCUBRAW >= 100) TempTurnOffCUBRAW = 10; //Ограничиваю выбор температуры потому что на дисплее остаются знаки
if (TempTurnOffCUBRAW <= 9) TempTurnOffCUBRAW = 99; //И потому что использовать lcd.clear() не вариант (экран мигает как сумасшедший)
}
// --------------------- МЕНЮ ОТБОРА ГОЛОВ ---------------------
void MenuHEAD() { //MenuPage = 20
lcd.setCursor(0, 0);
lcd.print("HEAD ");
if (EnableHEAD == 1) {
lcd.print("ON ");
}
if (EnableHEAD == 0) lcd.print("OFF");
if (Enc.rightH()) EnableHEAD = 1;
if (Enc.leftH()) EnableHEAD = 0;
if (BtnMenu.click()) {
MenuPage = 30;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 0;
Serial.println(MenuPage);
}
}
// --------------------- МЕНЮ ОТБОРА ТЕЛА ---------------------
void MenuBODY() { //MenuPage = 30
lcd.setCursor(0, 0), lcd.print("BODY ");
if (EnableBODY == 1) {
lcd.print("ON ");
}
if (EnableBODY == 0) lcd.print("OFF");
if (Enc.rightH()) EnableBODY = 1;
if (Enc.leftH()) EnableBODY = 0;
if (BtnMenu.click()) {
MenuPage = 40;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 0;
Serial.println(MenuPage);
}
}
// --------------------- МЕНЮ ОТБОРА ХВОСТОВ ---------------------
void MenuTAIL() { //MenuPage = 40
lcd.setCursor(0, 0), lcd.print("TAIL ");
if (EnableTAIL == 1) {
lcd.print("ON ");
}
if (EnableTAIL == 0) lcd.print("OFF");
if (Enc.rightH()) EnableTAIL = 1;
if (Enc.leftH()) EnableTAIL = 0;
if (BtnMenu.click()) {
MenuPage = 10;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 0;
Serial.println(MenuPage);
}
}
// --------------------- МЕНЮ КАЛИБРОВКИ ДАТЧИКОВ ТЕМПЕРАТУРЫ ---------------------
void CalibrationSensorTemp() { //MenuPage = 100
lcd.setCursor(0, 0);
lcd.print("Calibration");
lcd.setCursor(3, 1);
lcd.print("Sensor");
if (Enc.click()) {
lcd.clear();
MenuPage = 101;
Serial.println(MenuPage);
}
if (BtnMenu.click()) {
lcd.clear();
MenuPage = 110;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 0;
Serial.println(MenuPage);
}
}
void CalibrationCUB() { //MenuPage = 101
lcd.setCursor(1, 0);
lcd.print("CUB ");
lcd.print(SensorCUB.getTemp());
lcd.setCursor(0, 1);
lcd.print(kCUB);
lcd.setCursor(6, 1);
lcd.print(TempCUB);
if (Enc.right()) {
lcd.clear();
kCUB += 0.10;
}
if (Enc.left()) {
lcd.clear();
kCUB -= 0.10;
}
if (Enc.rightH()) {
lcd.clear();
kCUB += 0.01;
}
if (Enc.leftH()) {
lcd.clear(); // КАК ОТ ЭТИХ lcd.clear() ИЗБАВИТЬСЯ?????? АААААААААААА
kCUB -= 0.01;
}
if (Enc.held()) {
lcd.clear();
kCUB = 0;
}
if (BtnMenu.click()) {
lcd.clear();
MenuPage = 102;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 100;
Serial.println(MenuPage);
}
}
void CalibrationTRA() { //MenuPage = 102
lcd.setCursor(1, 0);
lcd.print("TRA ");
lcd.print(SensorTRA.getTemp());
lcd.setCursor(0, 1);
lcd.print(kTRA);
lcd.setCursor(6, 1);
lcd.print(TempTRA);
if (Enc.right()) {
lcd.clear();
kTRA += 0.10;
}
if (Enc.left()) {
lcd.clear();
kTRA -= 0.10;
}
if (Enc.rightH()) {
lcd.clear();
kTRA += 0.01;
}
if (Enc.leftH()) {
lcd.clear();
kTRA -= 0.01;
}
if (Enc.held()) {
lcd.clear();
kTRA = 0;
}
if (BtnMenu.click()) {
lcd.clear();
MenuPage = 103;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 100;
Serial.println(MenuPage);
}
}
void CalibrationCS() { //MenuPage = 103
lcd.setCursor(1, 0);
lcd.print("CS ");
lcd.print(SensorCS.getTemp());
lcd.setCursor(0, 1);
lcd.print(kCS);
lcd.setCursor(6, 1);
lcd.print(TempCS);
if (Enc.right()) {
lcd.clear();
kCS += 0.10;
}
if (Enc.left()) {
lcd.clear();
kCS -= 0.10;
}
if (Enc.rightH()) {
lcd.clear();
kCS += 0.01;
}
if (Enc.leftH()) {
lcd.clear();
kCS -= 0.01;
}
if (Enc.held()) {
lcd.clear();
kCS = 0;
}
if (BtnMenu.click()) {
lcd.clear();
MenuPage = 101;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 100;
Serial.println(MenuPage);
}
}
// --------------------- МЕНЮ ЗАЩИТЫ ПО ТЕМПЕРАТУРЕ ---------------------
void ProtectionTemp() { //MenuPage = 110
lcd.setCursor(0, 0);
lcd.print("Protect");
lcd.setCursor(3, 1);
lcd.print("Temp");
if (BtnMenu.click()) {
lcd.clear();
MenuPage = 120;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 0;
Serial.println(MenuPage);
}
if (Enc.click()) {
lcd.clear();
MenuPage = 111;
Serial.println(MenuPage);
}
}
void ProtectionTempCUB() { //MenuPage = 111
lcd.setCursor(1, 0);
lcd.print("CUB ");
if (ActivateProtectTempCUB == 1) {
lcd.print ("ON ");
lcd.print(ProtectTempCUB);
if (Enc.right()) ProtectTempCUB += 1;
if (Enc.left()) ProtectTempCUB -= 1;
if (ProtectTempCUB >= 99) ProtectTempCUB = 99; //Ограничиваю выбор температуры потому что на дисплее остаются знаки
if (ProtectTempCUB <= 10) ProtectTempCUB = 10; //И потому что использовать lcd.clear() не вариант (экран мигает как сумасшедший)
}
if (ActivateProtectTempCUB == 0) lcd.print ("OFF "); //Если выключено изменять температуру нельзя
if (Enc.rightH()) ActivateProtectTempCUB = 1;
if (Enc.leftH()) ActivateProtectTempCUB = 0;
if (BtnMenu.click()) {
MenuPage = 112;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 110;
Serial.println(MenuPage);
}
}
void ProtectionTempTRA() { //MenuPage = 112
lcd.setCursor(1, 0);
lcd.print("TRA ");
if (ActivateProtectTempTRA == 1) {
lcd.print ("ON ");
lcd.print(ProtectTempTRA);
if (Enc.right()) ProtectTempTRA += 1;
if (Enc.left()) ProtectTempTRA -= 1;
if (ProtectTempTRA >= 99) ProtectTempTRA = 99; //Ограничиваю выбор температуры потому что на дисплее остаются знаки
if (ProtectTempTRA <= 10) ProtectTempTRA = 10; //И потому что использовать lcd.clear() не вариант (экран мигает как сумасшедший)
}
if (ActivateProtectTempTRA == 0) lcd.print ("OFF "); //Если выключено изменять температуру нельзя
if (Enc.rightH()) ActivateProtectTempTRA = 1;
if (Enc.leftH()) ActivateProtectTempTRA = 0;
if (BtnMenu.click()) {
MenuPage = 113;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 110;
Serial.println(MenuPage);
}
}
void ProtectionTempCS() { //MenuPage = 113
lcd.setCursor(1, 0);
lcd.print("CS ");
if (ActivateProtectTempCS == 1) {
lcd.print ("ON ");
lcd.print(ProtectTempCS);
if (Enc.right()) ProtectTempCS += 1;
if (Enc.left()) ProtectTempCS -= 1;
if (ProtectTempCS >= 99) ProtectTempCS = 99; //Ограничиваю выбор температуры потому что на дисплее остаются знаки
if (ProtectTempCS <= 10) ProtectTempCS = 10; //И потому что использовать lcd.clear() не вариант (экран мигает как сумасшедший)
}
if (ActivateProtectTempCS == 0) lcd.print ("OFF "); //Если выключено изменять температуру нельзя
if (Enc.rightH()) ActivateProtectTempCS = 1;
if (Enc.leftH()) ActivateProtectTempCS = 0;
if (BtnMenu.click()) {
MenuPage = 111;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 110;
Serial.println(MenuPage);
}
}
// --------------------- МЕНЮ ЗАЩИТЫ ПО ПОТЕРЕ ДАТЧИКОВ ТЕМПЕРАТУРЫ ---------------------
void ProtectionSensor() { //MenuPage = 120
lcd.setCursor(0, 0);
lcd.print("Protect ");
lcd.setCursor(3, 1);
lcd.print("Sensor");
if (BtnMenu.click()) {
lcd.clear();
MenuPage = 100;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
lcd.clear();
MenuPage = 0;
Serial.println(MenuPage);
}
if (Enc.click()) {
lcd.clear();
MenuPage = 121;
Serial.println(MenuPage);
}
}
void ProtectionSensorCUB() { //MenuPage = 121
lcd.setCursor(1, 0);
lcd.print("CUB ");
if (Enc.rightH()) OnlineSensorCUB = 1;
if (Enc.leftH()) OnlineSensorCUB = 0;
if (OnlineSensorCUB == 1) lcd.print("ON ");
if (OnlineSensorCUB == 0) lcd.print("OFF");
if (BtnMenu.click()) {
MenuPage = 122;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
MenuPage = 120;
Serial.println(MenuPage);
}
}
void ProtectionSensorTRA() { //MenuPage = 122
lcd.setCursor(1, 0);
lcd.print("TRA ");
if (Enc.rightH()) OnlineSensorTRA = 1;
if (Enc.leftH()) OnlineSensorTRA = 0;
if (OnlineSensorTRA == 1) lcd.print("ON ");
if (OnlineSensorTRA == 0) lcd.print("OFF");
if (BtnMenu.click()) {
MenuPage = 123;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
MenuPage = 120;
Serial.println(MenuPage);
}
}
void ProtectionSensorCS() { //MenuPage = 123
lcd.setCursor(1, 0);
lcd.print("CS ");
if (Enc.rightH()) OnlineSensorCS = 1;
if (Enc.leftH()) OnlineSensorCS = 0;
if (OnlineSensorCS == 1) lcd.print("ON ");
if (OnlineSensorCS == 0) lcd.print("OFF");
if (BtnMenu.click()) {
MenuPage = 121;
Serial.println(MenuPage);
}
if (BtnExit.click()) {
MenuPage = 120;
Serial.println(MenuPage);
}
}
// --------------------- Вывод тревог на дисплей ---------------------
void AlarmTempCUB() { //MenuPage = 200
lcd.setCursor(0, 0);
lcd.print("ALARM");
lcd.setCursor(3, 1);
lcd.print("CUB");
}
void AlarmTempTRA() { //MenuPage = 201
lcd.setCursor(0, 0);
lcd.print("ALARM");
lcd.setCursor(7, 1);
lcd.print("TRA");
}
void AlarmTempCS() { //MenuPage = 202
lcd.setCursor(0, 0);
lcd.print("ALARM");
lcd.setCursor(11, 1);
lcd.print("CS");
}
void AlarmTempCUBTRA() { //MenuPage = 203
lcd.setCursor(0, 0);
lcd.print("ALARM");
lcd.setCursor(3, 1);
lcd.print("CUB TRA");
}
void AlarmTempCUBCS() { //MenuPage = 204
lcd.setCursor(0, 0);
lcd.print("ALARM");
lcd.setCursor(3, 1);
lcd.print("CUB");
lcd.setCursor(11, 1);
lcd.print("CS");
}
void AlarmTempTRACS() { //MenuPage = 205
lcd.setCursor(0, 0);
lcd.print("ALARM");
lcd.setCursor(7, 1);
lcd.print("TRA CS");
}
void AlarmTempCUBTRACS() { //MenuPage = 206
lcd.setCursor(0, 0);
lcd.print("ALARM");
lcd.setCursor(3, 1);
lcd.print("CUB TRA CS");
}
// --------------------- Вывод тревог по температуре на дисплей ---------------------
void AlarmTemp() {
//Вывод тревоги на дисплей при превышении температуры в кубе
if (ActivateProtectTempCUB == 1 && ActivateProtectTempTRA == 0 && ActivateProtectTempCS == 0) {
if (TempCUB >= ProtectTempCUB) {
lcdclear();
MenuPage = 200;
Serial.println(MenuPage);
}
}
//Вывод тревоги на дисплей при превышении температуры в ТСА
if (ActivateProtectTempCUB == 0 && ActivateProtectTempTRA == 1 && ActivateProtectTempCS == 0) {
if (TempTRA >= ProtectTempTRA) {
lcdclear();
MenuPage = 201;
Serial.println(MenuPage);
}
}
//Вывод тревоги на дисплей при превышении температуры в охладителе
if (ActivateProtectTempCUB == 0 && ActivateProtectTempTRA == 0 && ActivateProtectTempCS == 1) {
if (TempCS >= ProtectTempCS) {
lcdclear();
MenuPage = 202;
Serial.println(MenuPage);
}
}
//Вывод тревоги на дисплей при превышении температуры в кубе и ТСА
if (ActivateProtectTempCUB == 1 && ActivateProtectTempTRA == 1 && ActivateProtectTempCS == 0) {
if (TempCUB >= ProtectTempCUB && TempTRA < ProtectTempTRA) {
lcdclear();
MenuPage = 200;
Serial.println(MenuPage);
}
if (TempCUB < ProtectTempCUB && TempTRA >= ProtectTempTRA) {
lcdclear();
MenuPage = 201;
Serial.println(MenuPage);
}
if (TempCUB >= ProtectTempCUB && TempTRA >= ProtectTempTRA) {
lcdclear();
MenuPage = 203;
Serial.println(MenuPage);
}
}
//Вывод тревоги на дисплей при превышении температуры в кубе и охладителе
if (ActivateProtectTempCUB == 1 && ActivateProtectTempTRA == 0 && ActivateProtectTempCS == 1) {
if (TempCUB >= ProtectTempCUB && TempCS < ProtectTempCS) {
lcdclear();
MenuPage = 200;
Serial.println(MenuPage);
}
if (TempCUB < ProtectTempCUB && TempCS >= ProtectTempCS) {
lcdclear();
MenuPage = 202;
Serial.println(MenuPage);
}
if (TempCUB >= ProtectTempCUB && TempCS >= ProtectTempCS) {
lcdclear();
MenuPage = 204;
Serial.println(MenuPage);
}
}
//Вывод тревоги на дисплей при превышении температуры в ТСА и охладителе
if (ActivateProtectTempCUB == 0 && ActivateProtectTempTRA == 1 && ActivateProtectTempCS == 1) {
if (TempTRA >= ProtectTempTRA && TempCS < ProtectTempCS) {
lcdclear();
MenuPage = 201;
Serial.println(MenuPage);
}
if (TempTRA < ProtectTempTRA && TempCS >= ProtectTempCS) {
lcdclear();
MenuPage = 202;
Serial.println(MenuPage);
}
if (TempTRA >= ProtectTempTRA && TempCS >= ProtectTempCS) {
lcdclear();
MenuPage = 205;
Serial.println(MenuPage);
}
}
//Вывод тревоги на дисплей при превышении температуры в кубе, ТСА и охладителе
if (ActivateProtectTempCUB == 1 && ActivateProtectTempTRA == 1 && ActivateProtectTempCS == 1) {
if (TempCUB >= ProtectTempCUB && TempTRA < ProtectTempTRA && TempCS < ProtectTempCS) {
lcdclear();
MenuPage = 200;
Serial.println(MenuPage);
}
if (TempCUB < ProtectTempCUB && TempTRA >= ProtectTempTRA && TempCS < ProtectTempCS) {
lcdclear();
MenuPage = 201;
Serial.println(MenuPage);
}
if (TempCUB < ProtectTempCUB && TempTRA < ProtectTempTRA && TempCS >= ProtectTempCS) {
lcdclear();
MenuPage = 202;
Serial.println(MenuPage);
}
if (TempCUB >= ProtectTempCUB && TempTRA >= ProtectTempTRA && TempCS < ProtectTempCS) {
lcdclear();
MenuPage = 203;
Serial.println(MenuPage);
}
if (TempCUB >= ProtectTempCUB && TempTRA < ProtectTempTRA && TempCS >= ProtectTempCS) {
lcdclear();
MenuPage = 204;
Serial.println(MenuPage);
}
if (TempCUB < ProtectTempCUB && TempTRA >= ProtectTempTRA && TempCS >= ProtectTempCS) {
lcdclear();
MenuPage = 205;
Serial.println(MenuPage);
}
if (TempCUB >= ProtectTempCUB && TempTRA >= ProtectTempTRA && TempCS >= ProtectTempCS) {
lcdclear();
MenuPage = 206;
Serial.println(MenuPage);
}
}
}
void lcdclear() {
if (millis() - TOne >= 1000) {
TOne = millis();
lcd.clear();
}
}
// Сброс настроек защиты по температуре
void ResetProtecTemp() {
if (Enc.held()) {
ActivateProtectTempCUB = 0;
ActivateProtectTempTRA = 0;
ActivateProtectTempCS = 0;
ProtectTempCUB = 99;
ProtectTempTRA = 99;
ProtectTempCS = 99;
lcd.clear();
MenuPage = 0;
Serial.println(MenuPage);
}
}
// Температура с датчиков + коэффициент калибровки
void Temperature() {
if (millis() - TOne >= 2250) {
TOne = millis();
SensorCUB.requestTemp(); // Запрос температур с датчиков
SensorTRA.requestTemp();
SensorCS.requestTemp();
TempCUB = SensorCUB.getTemp() + kCUB;
TempTRA = SensorTRA.getTemp() + kTRA;
TempCS = SensorCS.getTemp() + kCS;
}
}
// Аппаратные прерывания энкодера
void isrCLK() {
Enc.tick();
}
void isrDT() {
Enc.tick();
}