Добрый день. Нужна помощь. Пытаюсь сделать контроллер самогонного аппарата. Это мой первый проект на МК, и мало того что, у меня нет опыта и в самогоноварении и в написании кода, так ещё и самого аппарата нет. МК есть, даже два, осталось два, было три.
В общем начал я со считывания температур, вывода их на дисплей и защиты по превышению температуры и потере датчиков.
Так вот, проблема № 1:
При MenuPage == 0, МК что-то тормозит, сам я найти не смог что именно. Отключал функции и по очереди и по отдельности не помогает. Но вот если перейти на MenuPage == 10 , то МК работает нормально. Но может быть так и должно быть, потому что постоянно складываются три float числа. Хотя и при MenuPage == 10 они тоже постоянно складываются.
проблема № 2:
При MenuPage == 0 и зажатом повороте энкодера изменяется значение в EnableRAW, а должно изменяться только при MenuPage == 10. Вот тут у меня даже мыслей нет, почему так происходит...
Помогите пожалуйста люди добрые )))
МК ардуино нано 328р
В общем начал я со считывания температур, вывода их на дисплей и защиты по превышению температуры и потере датчиков.
Так вот, проблема № 1:
При MenuPage == 0, МК что-то тормозит, сам я найти не смог что именно. Отключал функции и по очереди и по отдельности не помогает. Но вот если перейти на MenuPage == 10 , то МК работает нормально. Но может быть так и должно быть, потому что постоянно складываются три float числа. Хотя и при MenuPage == 10 они тоже постоянно складываются.
проблема № 2:
При MenuPage == 0 и зажатом повороте энкодера изменяется значение в EnableRAW, а должно изменяться только при MenuPage == 10. Вот тут у меня даже мыслей нет, почему так происходит...
Помогите пожалуйста люди добрые )))
МК ардуино нано 328р
C++:
// Контроллер самогонного аппарата
// "ХАН - 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
// Меню
uint8_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(); // опрос кнопки Выход
RequestTemp(); // Запрос температур с датчиков
Temperature(); // Расчёт температур с коэффициентом калибровки
AlarmTemp(); // Превышение заданой температуры в режиме защиты
if (BtnExit.held()) lcd.clear(), MenuPage = 0; // в любом месте меню, если зажать кнопку выход, выходит на основной экран
// --------------------- Конструкция переходов по меню ---------------------
// Если переменная MenuPage равна какому-то значению, на дисплей выводится та менюшка, которая за это отвечает
// Если первое меню равно 10, все относящиеся к этому меню имюет значения +1 (11, 12, 13 и т.д.)
// Если меню другого режима, переменная равно + 10 (10, 20, 30 и т.д.)
// Таким образом видна связь по меню, если PageMenu равно 56, то начальное меню будет 50.
// Вывод основной информации начинается с нуля
// Меню по основным режимам начинается с 10
// Меню по настройкам начинается со 100
// Вывод тревог начинается с 200
switch (MenuPage) {
case 0:
TempGUI(); // Основной экран, выводится температуры с датчиков, и в случае потери датчика выводится вместо температуры ERROR
if (BtnMenu.click()) lcd.clear(), MenuPage = 10;
if (BtnMenu.held()) lcd.clear(), MenuPage = 100;
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.setCursor(4, 0);
if (SensorCUB.readTemp()) lcd.print(TempCUB);
else lcd.print("ERROR");
lcd.setCursor(0, 1);
lcd.print("TRA");
lcd.setCursor(4, 1);
if (SensorTRA.readTemp()) lcd.print(TempTRA);
else lcd.print("ERROR");
lcd.setCursor(12, 0);
lcd.print("CS");
lcd.setCursor(11, 1);
if (SensorCS.readTemp()) lcd.print(TempCS);
else lcd.print("ERROR");
}
// --------------------- МЕНЮ ОТБОРА СПИРТА СЫРЦА ---------------------
void MenuRAW() { //MenuPage = 10
lcd.setCursor(0, 0), lcd.print("RAW ");
if (EnableRAW == 1) lcd.print("ON ");
if (EnableRAW == 0) lcd.print("OFF");
if (Enc.rightH()) EnableRAW = 1;
if (Enc.leftH()) EnableRAW = 0;
if (Enc.click()) lcd.clear(), MenuPage = 11;
if (BtnMenu.click()) lcd.clear(), MenuPage = 20;
if (BtnExit.click()) lcd.clear(), MenuPage = 0;
}
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;
if (BtnExit.click()) lcd.clear(), MenuPage = 10;
if (TempTurnOnCSRAW >= 100) TempTurnOnCSRAW = 10;
if (TempTurnOnCSRAW <= 9) TempTurnOnCSRAW = 99;
}
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;
if (BtnExit.click()) lcd.clear(), MenuPage = 10;
if (TempTurnOffCUBRAW >= 100) TempTurnOffCUBRAW = 10;
if (TempTurnOffCUBRAW <= 9) TempTurnOffCUBRAW = 99;
}
// --------------------- МЕНЮ ОТБОРА ГОЛОВ ---------------------
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()) lcd.clear(), MenuPage = 30;
if (BtnExit.click()) lcd.clear(), MenuPage = 0;
}
// --------------------- МЕНЮ ОТБОРА ТЕЛА ---------------------
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()) lcd.clear(), MenuPage = 40;
if (BtnExit.click()) lcd.clear(), MenuPage = 0;
}
// --------------------- МЕНЮ ОТБОРА ХВОСТОВ ---------------------
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()) lcd.clear(), MenuPage = 10;
if (BtnExit.click()) lcd.clear(), MenuPage = 0;
}
// --------------------- МЕНЮ КАЛИБРОВКИ ДАТЧИКОВ ТЕМПЕРАТУРЫ ---------------------
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;
if (BtnMenu.click()) lcd.clear(), MenuPage = 110;
if (BtnExit.click()) lcd.clear(), MenuPage = 0;
}
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(), kCUB -= 0.01;
if (Enc.held()) lcd.clear(), kCUB = 0;
if (BtnMenu.click()) lcd.clear(), MenuPage = 102;
if (BtnExit.click()) lcd.clear(), MenuPage = 100;
}
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;
if (BtnExit.click()) lcd.clear(), MenuPage = 100;
}
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;
if (BtnExit.click()) lcd.clear(), MenuPage = 100;
}
// --------------------- МЕНЮ ЗАЩИТЫ ПО ТЕМПЕРАТУРЕ ---------------------
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;
if (BtnExit.click()) lcd.clear(), MenuPage = 0;
if (Enc.click()) lcd.clear(), MenuPage = 111;
}
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;
}
if (ActivateProtectTempCUB == 0) lcd.print ("OFF ");
if (Enc.rightH()) ActivateProtectTempCUB = 1;
if (Enc.leftH()) ActivateProtectTempCUB = 0;
if (BtnMenu.click()) MenuPage = 112;
if (BtnExit.click()) lcd.clear(), MenuPage = 110;
}
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;
}
if (ActivateProtectTempTRA == 0) lcd.print ("OFF ");
if (Enc.rightH()) ActivateProtectTempTRA = 1;
if (Enc.leftH()) ActivateProtectTempTRA = 0;
if (BtnMenu.click()) MenuPage = 113;
if (BtnExit.click()) lcd.clear(), MenuPage = 110;
}
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;
}
if (ActivateProtectTempCS == 0) lcd.print ("OFF ");
if (Enc.rightH()) ActivateProtectTempCS = 1;
if (Enc.leftH()) ActivateProtectTempCS = 0;
if (BtnMenu.click()) MenuPage = 111;
if (BtnExit.click()) lcd.clear(), MenuPage = 110;
}
// --------------------- МЕНЮ ЗАЩИТЫ ПО ПОТЕРЕ ДАТЧИКОВ ТЕМПЕРАТУРЫ ---------------------
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;
if (BtnExit.click()) lcd.clear(), MenuPage = 0;
if (Enc.click()) lcd.clear(), MenuPage = 121;
}
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;
if (BtnExit.click()) MenuPage = 120;
}
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;
if (BtnExit.click()) MenuPage = 120;
}
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;
if (BtnExit.click()) MenuPage = 120;
}
// --------------------- Вывод тревог на дисплей ---------------------
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;
}
if (ActivateProtectTempCUB == 0 && ActivateProtectTempTRA == 1 && ActivateProtectTempCS == 0) {
if (TempTRA >= ProtectTempTRA) lcdclear(), MenuPage = 201;
}
if (ActivateProtectTempCUB == 0 && ActivateProtectTempTRA == 0 && ActivateProtectTempCS == 1) {
if (TempCS >= ProtectTempCS) lcdclear(), MenuPage = 202;
}
if (ActivateProtectTempCUB == 1 && ActivateProtectTempTRA == 1 && ActivateProtectTempCS == 0) {
if (TempCUB >= ProtectTempCUB && TempTRA < ProtectTempTRA) lcdclear(), MenuPage = 200;
if (TempCUB < ProtectTempCUB && TempTRA >= ProtectTempTRA) lcdclear(), MenuPage = 201;
if (TempCUB >= ProtectTempCUB && TempTRA >= ProtectTempTRA) lcdclear(), MenuPage = 203;
}
if (ActivateProtectTempCUB == 1 && ActivateProtectTempTRA == 0 && ActivateProtectTempCS == 1) {
if (TempCUB >= ProtectTempCUB && TempCS < ProtectTempCS) lcdclear(), MenuPage = 200;
if (TempCUB < ProtectTempCUB && TempCS >= ProtectTempCS) lcdclear(), MenuPage = 202;
if (TempCUB >= ProtectTempCUB && TempCS >= ProtectTempCS) lcdclear(), MenuPage = 204;
}
if (ActivateProtectTempCUB == 0 && ActivateProtectTempTRA == 1 && ActivateProtectTempCS == 1) {
if (TempTRA >= ProtectTempTRA && TempCS < ProtectTempCS) lcdclear(), MenuPage = 201;
if (TempTRA < ProtectTempTRA && TempCS >= ProtectTempCS) lcdclear(), MenuPage = 202;
if (TempTRA >= ProtectTempTRA && TempCS >= ProtectTempCS) lcdclear(), MenuPage = 205;
}
if (ActivateProtectTempCUB == 1 && ActivateProtectTempTRA == 1 && ActivateProtectTempCS == 1) {
if (TempCUB >= ProtectTempCUB && TempTRA < ProtectTempTRA && TempCS < ProtectTempCS) lcdclear(), MenuPage = 200;
if (TempCUB < ProtectTempCUB && TempTRA >= ProtectTempTRA && TempCS < ProtectTempCS) lcdclear(), MenuPage = 201;
if (TempCUB < ProtectTempCUB && TempTRA < ProtectTempTRA && TempCS >= ProtectTempCS) lcdclear(), MenuPage = 202;
if (TempCUB >= ProtectTempCUB && TempTRA >= ProtectTempTRA && TempCS < ProtectTempCS) lcdclear(), MenuPage = 203;
if (TempCUB >= ProtectTempCUB && TempTRA < ProtectTempTRA && TempCS >= ProtectTempCS) lcdclear(), MenuPage = 204;
if (TempCUB < ProtectTempCUB && TempTRA >= ProtectTempTRA && TempCS >= ProtectTempCS) lcdclear(), MenuPage = 205;
if (TempCUB >= ProtectTempCUB && TempTRA >= ProtectTempTRA && TempCS >= ProtectTempCS) lcdclear(), MenuPage = 206;
}
}
// --------------------- Реакции на ошибки ---------------------
void ErrorOnlineSensorTemp() {
if (OnlineSensorCUB == 1) {
if (!SensorCUB.readTemp());
}
if (OnlineSensorTRA == 1) {
if (!SensorTRA.readTemp());
}
if (OnlineSensorCS == 1) {
if (!SensorCS.readTemp());
}
}
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;
}
}
// Запрос температур с датчиков
void RequestTemp() {
SensorCUB.requestTemp();
SensorTRA.requestTemp();
SensorCS.requestTemp();
}
// Температура с датчиков + коэффициент калибровки
void Temperature() {
TempCUB = SensorCUB.getTemp() + kCUB;
TempTRA = SensorTRA.getTemp() + kTRA;
TempCS = SensorCS.getTemp() + kCS;
}
// Аппаратные прерывания энкодера
void isrCLK() {
Enc.tick();
}
void isrDT() {
Enc.tick();
}