Энкодер изменяет переменную там, где не должен

minash87

✩✩✩✩✩✩✩
1 Мар 2022
32
1
Добрый день. Нужна помощь. Пытаюсь сделать контроллер самогонного аппарата. Это мой первый проект на МК, и мало того что, у меня нет опыта и в самогоноварении и в написании кода, так ещё и самого аппарата нет. МК есть, даже два, осталось два, было три.
В общем начал я со считывания температур, вывода их на дисплей и защиты по превышению температуры и потере датчиков.
Так вот, проблема № 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();
}
 

Сотнег

★★★★★★★
15 Янв 2020
4,372
1,497
@minash87, выведите в терминал сообщение о каждом изменении режима с номером режима, и всё увидите.
 

minash87

✩✩✩✩✩✩✩
1 Мар 2022
32
1
@Сотнег,так в том то и дело, что режим не изменяется, а переменная изменяется
 

Сотнег

★★★★★★★
15 Янв 2020
4,372
1,497
@minash87, которые строчки выводят номер в порт?
Нужно после каждого MenuPage =
сделать. Иначе не увидите.
 

minash87

✩✩✩✩✩✩✩
1 Мар 2022
32
1
@Сотнег,
C++:
Serial.println(MenuPage);
поворачиваю энкодер с нажимом и EnableRAW изменяется при MenuPage == 0.
 

Сотнег

★★★★★★★
15 Янв 2020
4,372
1,497
@minash87, к моменту рестарта цикла, где вы режим в порт выводите, режим мог 10 раз поменяться.
 

minash87

✩✩✩✩✩✩✩
1 Мар 2022
32
1
@Сотнег, чё т я не пойму, сам по себе что ли? Что его меняет? И тем более меняет так, что именно ставит MenuPage == 10 получается.
 

Сотнег

★★★★★★★
15 Янв 2020
4,372
1,497
@minash87,
думаю, что 10й режим ставит строчка
if (BtnMenu.click()) lcd.clear(), MenuPage = 10;
а восстанавливает другая.

Кстати, а точно можно через запятую и без фигурных скобок функции перечислять?
Я не большой знаток этого языка...
 

minash87

✩✩✩✩✩✩✩
1 Мар 2022
32
1
@Сотнег, спасибо, хоть направление есть теперь куда думать. На счёт скобок - не знаю, но работает и так и так. Может IDE сама исправляет.
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Отложите проект, книжку по Си почитайте. Потраченное время окупится. Не зная элементарного синтаксиса, вы на каждой строке будете спотыкаться. И удивляться, "почему переменная меняется?"
Правильно так
C++:
if (a< 0) {
  operator1;
  operator2;
  .....
  }
  else {
   operator3;
   operator4;
   .....
  }
 

Сотнег

★★★★★★★
15 Янв 2020
4,372
1,497
@minash87, если после if нужно выполнить более одной команды, ставьте фигурные скобки и разделяйте команды точкой с запятой.
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
В смысле книжку? Любой учебник по Си. Вы таких простейших вещей не знаете, что вам сейчас не до выбора, а о том что в конце оператора точку с запятой ставят - в любом пособии написано в первой главе.
 

minash87

✩✩✩✩✩✩✩
1 Мар 2022
32
1
В общем всё исправил, проблема не ушла.
Сделал вот так
C++:
switch (MenuPage) {
    case 0:
      TempGUI();                          // Основной экран, выводится температуры с датчиков
      if (BtnMenu.click()) {
        lcd.clear();
        MenuPage = 10;
      }
      if (BtnMenu.held()) {
        lcd.clear();
        MenuPage = 100;
      }
      if (Enc.rightH());   // !!!
      if (Enc.leftH());     // !!!
      break;
Теперь при MenuPage == 0 зажатый энкодер в поворотах ничего не делает.
 

Сотнег

★★★★★★★
15 Янв 2020
4,372
1,497
@minash87,
по-прежнему нужно в порт вывести каждый факт изменения режима. Сразу после изменения.
 

minash87

✩✩✩✩✩✩✩
1 Мар 2022
32
1
@Сотнег, а как это сделать, я так понимаю без отладчика никак? Простым
C++:
if (MenuPage > 0) Serial.println(MenuPage)
не выводит (((
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Если эта строчка не выводит, значит в этом месте MenuPage = 0

Никакой отладчик не нужен. Покажите весь код, вы видно эту строчку не туда вставили.
 

minash87

✩✩✩✩✩✩✩
1 Мар 2022
32
1
@bort707, без условия не выводит, но меняет. Может дело в библиотеке энкодера?
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Может дело в библиотеке энкодера?
по тем признакам, что вы перечислили - дело 100% в ошибке в вашем коде. Работа Библиотеки энкодера никак не может зависить от вашей переменной menupage
По прежнему не хотите показать код? боитесь украдем? Тогда ищите сами
 

minash87

✩✩✩✩✩✩✩
1 Мар 2022
32
1
@bort707,
C++:
void loop() {
  Serial.println(EnableRAW);
  Serial.println(MenuPage);
Вот так постоянно выводит ноль, но переменную MenuRAW меняет.
C++:
  switch (MenuPage) {
    case 0:
      TempGUI();                          // Основной экран, выводится температуры с датчиков
      if (BtnMenu.click()) {
        lcd.clear();
        MenuPage = 10;
      }
      if (BtnMenu.held()) {
        lcd.clear();
        MenuPage = 100;
      }
      //if (Enc.rightH());
      //if (Enc.leftH());
      break;
Естественно эти два условия закомментировал