Не выполняется условие if (). Не могу понять, в чем причина

Коллеги, пожалуйста помогите. Два дня кружу над скетчем как ворон над полем битвы, мозг сломан :frowning:


//ArdinoMega2560

//ГЛОБАЛЬНЫЕ УСТАНОВКИ

//БЛОК ИНДИКАТОРОB МАХ7219_________________________________________________________________
#include <LedControl.h>	 //Подключение библиотеки max7219 
//???Провода: VCC-синий, GND-фиолетовый, clk-черный, cs-белый, din-серый
//Пины модуля индикатора max7219
#define pin_din 23 
#define pin_clk 27
#define pin_cs 25
//VCC=VCC
//GND=GND
//Создаём объект класса LedControl (din,clk,cs,X) X - количество модулей
LedControl lc_max7219 = LedControl(pin_din, pin_clk, pin_cs, 4);  
// Массив с закодированными символами для надписей.
byte bukvy[39] = 
{
B01110111,    //  А - 0 
B01011111,    //  Б - 1
B01111111,    //  B - 2
B01000110,    //  Г - 3
B01001111,    //  Е - 4
B01111001,    //  З - 5
B00111110,    //  И - 6
B00110111,    //  Н - 7
B01111110,    //  О - 8
B01110110,    //  П - 9
B01100111,    //  Р – 10 
B01001110,    //  С - 11
B00111011,    //  У - 12
B00110011,    //  Ч - 13
B00011111,    //  Ь - 14
B01111001,    //  Э - 15
B00000000,    //  пробел – 16 
B10100000,    //  ! - 17
B11100000,    //  ? - 18
B00000101,    //  г - 19
B00011100,    //  и – 20 
B00011101,    //  о - 21
B00010101,    //  п - 22
B00001101,    //  с – 23 
B01100011,    //  ° - 24
B01000111,    //  F - 25
B01011110,    //  G - 26
B00110000,    //  I - 27
B00111000,    //  J - 28 
B00001110,    //  L – 29
B01011011,    //  S - 30
B01101101,    //  Z - 31
B00111101,    //  d - 32
B00011000,    //  j - 33
B00010111,    //  h - 34
B00010000,    //  I - 35
B00011000,    //  j - 36
B00001100,    //  l - 37
B00000001,    //  тире - 38
};
//Переменные разрядов для индикации
volatile int tys;	// Тысячи
volatile int sot;	// Сотни
volatile int des;	// Десятки
volatile int edi;	// Единицы
//_________________________________________________________________

#include <Arduino.h>
/*// #define EB_NO_FOR           // отключить поддержку pressFor/holdFor/stepFor и счётчик степов (экономит 2 байта оперативки)
// #define EB_NO_CALLBACK      // отключить обработчик событий attach (экономит 2 байта оперативки)
// #define EB_NO_COUNTER       // отключить счётчик энкодера (экономит 4 байта оперативки)
// #define EB_NO_BUFFER        // отключить буферизацию энкодера (экономит 1 байт оперативки)

// #define EB_DEB_TIME 50      // таймаут гашения дребезга кнопки (кнопка)
// #define EB_CLICK_TIME 500   // таймаут ожидания кликов (кнопка)
// #define EB_HOLD_TIME 600    // таймаут удержания (кнопка)
// #define EB_STEP_TIME 200    // таймаут импульсного удержания (кнопка)
// #define EB_FAST_TIME 30     // таймаут быстрого поворота (энкодер)
// #define EB_TOUT_TIME 1000   // таймаут действия (кнопка и энкодер)*/
#include <GyverIO.h>
#include <EncButton.h>
//Пины и переменные энкодеров 
//Энкодер настройки
#define pin_enc_setup_B 6 // пин В энкодера настройки
#define pin_enc_setup_A 4 // пин А энкодера настройки
#define pin_but_setup 2 // пин кнопки энкодера настройки
volatile int but_setup_val=0;    //значение кнопки энкодера настройки
volatile int ten_volt_cur=20;   //настраиваемый вольтаж рабочей мощности ТЭНа
volatile int rm2n_volt_cur=20;  //настроенный вольтаж рабочей мощности ТЭНа на РМ2-н
volatile int volt_dif=0;        //разница между настроенным и настраиваемым вольтажами
volatile int rm2n_auto_flag=0;  //запретить автоменю РМ2-н
float zzz=0;            //промежуточная переменная рабочей мощности ТЭНа
long ten_power_cur=0;     //ватты рабочей мощности ТЭНа
volatile int ten_power_pas=500;    //ватты паспортной мощности ТЭНа
volatile int ten_resist=0;    // сопротивление ТЭНа
int exit_flag=1; // разрешение на выход из работы
//Энкодер температуры
#define pin_enc_temp_B 18 // пин В энкодера температуры
#define pin_enc_temp_A 16 // пин А энкодера температуры
#define pin_but_temp 14 // пин кнопки энкодера температуры
volatile int but_temp_val=0;    //значение кнопки энкодера температуры  
unsigned long ds18b20_time;   //переменная периода опроса термодатчика
volatile int temp_col;            //температура ректификационной колонны
volatile int temp_adj=999;      // Температура отсечки хвостов
//Энкодер клапана и насоса
#define pin_enc_valve_B A12 // пин В энкодера клапана
#define pin_enc_valve_A A10 // пин А энкодера клапана
#define pin_but_valve A8 // пин кнопки энкодера клапана
volatile int but_valve_val=0;   //значение кнопки энкодера клапана и насоса
volatile int valve_flag=0;    //запретить работу клапана
volatile long valve_interval=1000;  //время переключения клапана (исходно - 1 сек)
volatile unsigned long valve_time;    //переменная периода опроса клапана
long valve_on_off;
int valve_state = LOW;    //состояние клапана
volatile int pump_pwm=0;  // ШИМ питания насоса
volatile int pump_volt=0;     //вольтаж питания насоса

//Инициализаци библиотеки EncButton.h
EncButton eb_Setup(pin_enc_setup_B, pin_enc_setup_A, pin_but_setup, INPUT_PULLUP); // пины энкодера настройки
EncButton eb_Temp(pin_enc_temp_B, pin_enc_temp_A, pin_but_temp, INPUT_PULLUP); // пины энкодера температуры
EncButton eb_Valve(pin_enc_valve_B, pin_enc_valve_A, pin_but_valve, INPUT_PULLUP); // пины энкодера клапана

//БЛОК ДАТЧИКА ТЕМПЕРАТУРЫ DS18B20_________________________________________________________________
//Пины термодатчика колонны
#define pin_col_data A1  //(серый)Пин Data термодатчика колонны
#define pin_col_vcc A2  //(белый) Пин vcc термодатчика колонны
#define pin_col_gnd A0  //(черный)Пин gnd термодатчика колонны
#include <OneWire.h>    //Подключение библиотеки термодатчика колонны
OneWire ds_col(pin_col_data);   // Датчик T° колонны на пине A1
//Подвязывание рабочих переменных к библиотеке датчика
byte i;
byte present = 0;
byte data[12];
byte addr_col[8];
//________________________________________________________________

//БЛОК HY-M154_________________________________________________________________
#define pin_plus 31   //(коричневый)Пин "B+" на РМ-2н
#define pin_minus 35  // (желтый)Пин "П-" на РМ-2н
#define pin_plus_minus_gnd 33 // (красный) Пин искусственной gnd
//____________________________________________________________________________________________

//БЛОК реле HW-383_________________________________________________________________
#define pin_stop 51   //(желтый)Пин разгона
#define pin_full 53   //(зеленый)Пин стопа
//GND=GND (синий)
//VCC=VCC (оранжевый)
//________________________________________________________________

//БЛОК moc3041_________________________________________________________________
#define pin_valve 43   //(серый) Пин вентилятора
#define pin_cooler 41 // (белый) Пин клапана
#define pin_valve_cooler_gnd 39 // (черный)Пин искусственной gnd
//________________________________________________________________

//БЛОК HW-532_________________________________________________________________
#define pin_pump 13   // пин ШИМ блока насоса
//GND=GND
int pump_power=0; //Переменная ШИМ для насоса (через МАР!)
//________________________________________________________________

//БЛОК Принуждения_________________________________________________________________
#define pin_cooler_force A4   // принудительный пин вентилятора
#define pin_valve_force A5   // принудительный пин насоса
//________________________________________________________________


void setup ()
{
  Serial.begin (115200);
  
  //БЛОК ИНДИКАТОРОВ МАХ7219_________________________________________________________________  
  //Пины индикатора max7219 на выход
  pinMode(pin_din, OUTPUT);  
  pinMode(pin_clk, OUTPUT);  
  pinMode(pin_cs, OUTPUT);  
  //Инициализация индикаторов с выравниванием яркости
  lc_max7219.shutdown(0, false); 		//Выводим из спящего режима
  lc_max7219.setIntensity(0,7);  		//Яркость дисплея на 7. Всего возможных режимов яркости от 0 до 15
  lc_max7219.clearDisplay(0);    		//Очистить дисплей
  lc_max7219.shutdown(1, false); 		//Выводим из спящего режима
  lc_max7219.setIntensity(1,7);  		//Яркость дисплея на 7. Всего возможных режимов яркости от 0 до 15
  lc_max7219.clearDisplay(1);    			//Очистить дисплей  
  lc_max7219.shutdown(2, false); 		//Выводим из спящего режима
  lc_max7219.setIntensity(2,3);  		//Яркость дисплея на 7. Всего возможных режимов яркости от 0 до 15
  lc_max7219.clearDisplay(2);    		//Очистить дисплей  
  lc_max7219.shutdown(3, false); 		//Выводим из спящего режима
  lc_max7219.setIntensity(3,3);  		//Яркость дисплея на 7. Всего возможных режимов яркости от 0 до 15
  lc_max7219.clearDisplay(3);    		//Очистить дисплей    
  //________________________________________________________________

  //Предустановки энкодеров
  // Значения по умолчанию энкодера настройки 
  eb_Setup.setBtnLevel(LOW);
  eb_Setup.setDebTimeout(50);
  eb_Setup.setEncType(EB_STEP4_LOW);
  // сбросить счётчик энкодера
  eb_Setup.counter = 0;
  // Значения по умолчанию энкодера температуры 
  eb_Temp.setBtnLevel(LOW);
  eb_Temp.setDebTimeout(50);
  eb_Temp.setEncType(EB_STEP4_LOW);
  // сбросить счётчик энкодера
  eb_Temp.counter = 0;
  // Значения по умолчанию энкодера клапана 
  eb_Valve.setBtnLevel(LOW);
  eb_Valve.setDebTimeout(50);
  eb_Valve.setEncType(EB_STEP4_LOW);
  // сбросить счётчик энкодера
  eb_Valve.counter = 0;

  //БЛОК ДАТЧИКА ТЕМПЕРАТУРЫ DS18B20_________________________________________________________________
  //Инициализация пинов термодатчика
  pinMode(pin_col_data, INPUT);       //Пин термодатчика колонны на вход
  pinMode(pin_col_vcc, OUTPUT);     //Пин 5v термодатчика колонны на выход
  pinMode(pin_col_gnd, OUTPUT);     //Пин gnd термодатчика колонны на выход
  digitalWrite (pin_col_vcc, HIGH);     //5v для термодатчика 
  digitalWrite (pin_col_gnd, LOW);    //gnd для термодатчика  
  //Запрос термодатчику колонны на измерение температуры
  if (!ds_col.search(addr_col)) {}
  //Инициализация термодатчика 
  ds_col.reset();
  ds_col.select(addr_col);
  ds_col.write(0x44);
  //_________________________________________________________________ 
  //Пишем "НАЧНУ?"
  lc_max7219.setRow(0, 7 , bukvy[16]);    //Индикация " "
  lc_max7219.setRow(0, 6 , bukvy[7]);   //Индикация "Н"
  lc_max7219.setRow(0, 5 , bukvy[0]);   //Индикация "А"
  lc_max7219.setRow(0, 4 , bukvy[13]);    //Индикация "Ч"
  lc_max7219.setRow(0, 3 , bukvy[7]);   //Индикация "Н"
  lc_max7219.setRow(0, 2 , bukvy[12]);    //Индикация "У"
  lc_max7219.setRow(0, 1 , bukvy[18]);    //Индикация "?"
  lc_max7219.setRow(0, 0 , bukvy[16]);  //Индикация " "  
  
  //БЛОК HY-M154_________________________________________________________________
  pinMode (pin_plus, OUTPUT);
  pinMode (pin_minus, OUTPUT);
  pinMode (pin_plus_minus_gnd, OUTPUT);  
  digitalWrite (pin_plus,LOW);
  digitalWrite (pin_minus,LOW);
  digitalWrite (pin_plus_minus_gnd,LOW);
  //________________________________________________________________

  //БЛОК реле HW-383_________________________________________________________________
  pinMode (pin_full, OUTPUT);
  digitalWrite (pin_full, HIGH);
  pinMode (pin_stop, OUTPUT);
  digitalWrite (pin_stop, HIGH);  
  //________________________________________________________________

  //БЛОК moc3041_________________________________________________________________ 
  pinMode (pin_valve, OUTPUT);   //Пин клапана
  digitalWrite (pin_valve, LOW);
  pinMode (pin_cooler, OUTPUT);   //Пин вентилятора
  digitalWrite (pin_cooler, LOW);  
  pinMode (pin_valve_cooler_gnd, OUTPUT);   //Пин искусственной gnd
  digitalWrite (pin_valve_cooler_gnd, LOW);    
  //________________________________________________________________

  //БЛОК HW-532 насос_________________________________________________________________ 
  pinMode (pin_pump, OUTPUT);
  analogWrite (pin_pump,0);
  //________________________________________________________________

  //БЛОК Принуждения_________________________________________________________________
  pinMode (pin_cooler_force,INPUT_PULLUP);   // принудительный пин вентилятора
  pinMode (pin_valve_force,INPUT_PULLUP);   // принудительный пин насоса
  //________________________________________________________________
}  


void loop ()
{
  Serial.println (but_valve_val);
  /*Serial.print (" ");
  Serial.println (enc_valve_val);*/
  if (!digitalRead(pin_but_temp) && !digitalRead(pin_but_valve))
  {
    if (exit_flag==1)
    {
      //Обесточивание устройств
      digitalWrite(pin_stop, LOW);
      digitalWrite(pin_full, HIGH);
      digitalWrite(pin_valve , LOW);
      digitalWrite(pin_cooler , LOW);
      analogWrite(pin_pump,0);
      RM2_N_EXIT ();
      exit_flag=0;  
    }
  }
  else
  {
    goto Work;//Выполнение основного кода 
  }

  Work:;
  //ОПРОС ЭНКОДЕРОВ
  //Энкодер настройки
  eb_Setup.tick();
  // кнопка энкодера настройки
  if (eb_Setup.press()) //Serial.println("setup_press");  
  {
    but_setup_val++;
    Metka:
    if (but_setup_val==1) // Настройка паспортной мощности ТЭНа
    {
      lc_max7219.clearDisplay(0);    //Очистить дисплей настройки
      //Пишем "ПАС "
      lc_max7219.setRow(0, 7 , bukvy[9]);    //Индикация "П "
      lc_max7219.setRow(0, 6 , bukvy[0]);   //Индикация "А"
      lc_max7219.setRow(0, 5 , bukvy[11]);  //Индикация "С"
      lc_max7219.setRow(0, 4 , bukvy[16]);  //Индикация " "
      lc_max7219.setRow(0, 3 , bukvy[16]);  //Индикация " "
      //Вычисляем сопротивление ТЭНа * 10: потом это учесть!!!
      zzz=48400/ten_power_pas; 
      ten_resist=round(zzz*10);
      //Расчленяем паспортную мощность
      tys = ten_power_pas / 1000;
      sot = ten_power_pas % 1000/100;
      des = ten_power_pas % 100 / 10;
      edi = ten_power_pas % 10;   
      //Пишем паспортную мощность с гашением незначащих нулей
      if (ten_power_pas<1000)
      {
        lc_max7219.setRow(0, 3 , bukvy[16]);  //Индикация " "
        lc_max7219.setDigit(0, 2, sot, false);
        lc_max7219.setDigit(0, 1, des, false);
        lc_max7219.setDigit(0, 0, edi, false);
      }
      if (ten_power_pas>999)
      {
        lc_max7219.setDigit(0, 3 , tys, false);
        lc_max7219.setDigit(0, 2, sot, false);
        lc_max7219.setDigit(0, 1, des, false);
        lc_max7219.setDigit(0, 0, edi, false);
      }  
    }
    if (but_setup_val==2) // Настройка рабочей мощности ТЭНа
    {
      lc_max7219.clearDisplay(0);    //Очистить дисплей настройки      
      lc_max7219.setRow(0, 6 , bukvy[31]);  //Индикация "Z"
      lc_max7219.setRow(0, 5 , bukvy[8]);  //Индикация "O"     
    }  
    if (but_setup_val==3) // Передача настройки в РМ2-н
    {
      lc_max7219.clearDisplay(0);    //Очистить дисплей настройки
      //Пишем " ЗАПИСЬ "
      lc_max7219.setRow(0, 7 , bukvy[16]);    //Индикация " "
      lc_max7219.setRow(0, 6 , bukvy[5]);   //Индикация "З"
      lc_max7219.setRow(0, 5 , bukvy[0]);   //Индикация "А"
      lc_max7219.setRow(0, 4 , bukvy[9]);   //Индикация "П"
      lc_max7219.setRow(0, 3 , bukvy[6]);   //Индикация "И"
      lc_max7219.setRow(0, 2 , bukvy[11]);    //Индикация "С"
      lc_max7219.setRow(0, 1 , bukvy[14]);    //Индикация "Ь"
      lc_max7219.setRow(0, 0 , bukvy[16]);    //Индикация " "
      rm2n_auto_flag=1; //Разрешаем RM2N_SETUP один раз    
      RM2N_SETUP ();  
      
    }
    if (but_setup_val==4) // Разгон 
    {
      lc_max7219.clearDisplay(0);    //Очистить дисплей настройки      
      //Пишем " РАЗГОН "
      lc_max7219.setRow(0, 7 , bukvy[16]);  //Индикация " "
      lc_max7219.setRow(0, 6 , bukvy[10]);  //Индикация "Р"
      lc_max7219.setRow(0, 5 , bukvy[0]);   //Индикация "А"
      lc_max7219.setRow(0, 4 , bukvy[5]);   //Индикация "З"
      lc_max7219.setRow(0, 3 , bukvy[3]);   //Индикация "Г"
      lc_max7219.setRow(0, 2 , bukvy[8]);   //Индикация "О"
      lc_max7219.setRow(0, 1 , bukvy[7]);   //Индикация "Н"
      lc_max7219.setRow(0, 0 , bukvy[16]);  //Индикация " "
      digitalWrite (pin_full, LOW); //Разгон 
 
    }   
    if (but_setup_val==5) // Рабочий нагрев
    {
      digitalWrite (pin_full, HIGH); // отключение разгона
      lc_max7219.clearDisplay(0);    //Очистить дисплей настройки      
      //Пишем " НАГРЕВ "
      lc_max7219.setRow(0, 7 , bukvy[16]);  //Индикация " "
      lc_max7219.setRow(0, 6 , bukvy[7]);   //Индикация "Н"
      lc_max7219.setRow(0, 5 , bukvy[0]);   //Индикация "А"
      lc_max7219.setRow(0, 4 , bukvy[3]);   //Индикация "Г"
      lc_max7219.setRow(0, 3 , bukvy[10]);  //Индикация "Р"
      lc_max7219.setRow(0, 2 , bukvy[4]);   //Индикация "Е"
      lc_max7219.setRow(0, 1 , bukvy[2]);   //Индикация "В"
      lc_max7219.setRow(0, 0 , bukvy[16]);  //Индикация " " 
    }    
    if (but_setup_val>5) // Возврат в настройки
    {
      but_setup_val=1;
      goto Metka;
    }  
  }
  // обработка поворота энкодера настройки
  if (eb_Setup.left()) //Serial.println("setup_left");
  {
    if (but_setup_val==1) // Уменьшение паспортной мощности ТЭНа   
    {
      ten_power_pas=ten_power_pas-500;
      if (ten_power_pas<500) {ten_power_pas=500;}
      ENC_SETUP_FULL_PROC (); //Расчеты и индикация паспортной мощности ТЭНа
    }
    if (but_setup_val==2) // Уменьшение рабочей мощности ТЭНа
    {
      ten_volt_cur--;
      if (ten_volt_cur<20) {ten_volt_cur=20;}
      ENC_SETUP_CURR_PROC (); //Расчеты и индикация рабочей мощности ТЭНа
    }
  }
  
  if (eb_Setup.right()) //Serial.println("setup_right");
  {
    if (but_setup_val==1) // Увеличение паспортной мощности ТЭНа   
    {
      ten_power_pas=ten_power_pas+500;
      if (ten_power_pas>4500) {ten_power_pas=4500;}
      ENC_SETUP_FULL_PROC (); //Расчеты и индикация паспортной мощности ТЭНа
    }
    if (but_setup_val==2) // Увеличение рабочей мощности ТЭНа
    {
      ten_volt_cur++;
      if (ten_volt_cur>220) {ten_volt_cur=220;}
      ENC_SETUP_CURR_PROC (); //Расчеты и индикация рабочей мощности ТЭНа
    }  
  }

  //Энкодер температуры
  eb_Temp.tick();
  // кнопка энкодера температуры
  if (eb_Temp.press()) //Serial.println("temp_press"); 
  {
    but_temp_val++; 
    if (but_temp_val>1) {but_temp_val=0;} 
    if (but_temp_val==1) {temp_adj=temp_col;}
    else {temp_adj=999;}
  }
  // обработка поворота энкодера температуры
  if (eb_Temp.left()) //Serial.println("temp_left");
  {
    temp_adj++;
    if (temp_adj>999) {temp_adj=999;}
  }
  if (eb_Temp.right()) //Serial.println("temp_right");
  {
    temp_adj--;
    if (temp_adj<100) {temp_adj=100;}  
  }
  
  //Энкодер клапана
  eb_Valve.tick();
  // кнопка энкодера клапана
  if (eb_Valve.press()) //Serial.println("valve_press");  
  {
    but_valve_val++;    
    if (but_valve_val>3) {but_valve_val=1;}
    if (but_valve_val==1) // настройка времени закрытого клапана
    {
      lc_max7219.clearDisplay(3);        //Очистить дисплей    
      //Пишем "OFF 1-"
      lc_max7219.setRow(3, 7 , bukvy[8]);   //Индикация "O"
      lc_max7219.setRow(3, 6 , bukvy[25]);  //Индикация "F"
      lc_max7219.setRow(3, 5 , bukvy[25]);  //Индикация "F"   
      lc_max7219.setRow(3, 4 , bukvy[16]);  //Индикация " "
      lc_max7219.setRow(3, 3 , bukvy[27]);  //Индикация "I"  
      lc_max7219.setRow(3, 2 , bukvy[38]);  //Индикация "-"        
       //Раскладка по разрядам
      des = (valve_interval/1000) % 100 / 10;
      edi = (valve_interval/1000) % 10;
      if (valve_interval<10000){lc_max7219.setRow(3, 1 , bukvy[16]);} //Индикация " " 
      else {lc_max7219.setDigit(3, 1, des, false);}
      lc_max7219.setDigit(3, 0, edi, false);  
    }
    if (but_valve_val==2) // включаем клапан
    {
      lc_max7219.clearDisplay(3);        //Очистить дисплей    
      //Пишем "ON  1-"
      lc_max7219.setRow(3, 7 , bukvy[8]);   //Индикация "O"
      lc_max7219.setRow(3, 6 , bukvy[9]);   //Индикация "N"
      lc_max7219.setRow(3, 5 , bukvy[16]);    //Индикация " " 
      lc_max7219.setRow(3, 4 , bukvy[16]);    //Индикация " " 
      lc_max7219.setRow(3, 3 , bukvy[27]);  //Индикация "I"
      lc_max7219.setRow(3, 2 , bukvy[38]);  //Индикация "-"        
      //Раскладка по разрядам
      des = (valve_interval/1000) % 100 / 10;
      edi = (valve_interval/1000) % 10;
      if (valve_interval<10000){lc_max7219.setRow(3, 1 , bukvy[16]);} //Индикация " " 
      else {lc_max7219.setDigit(3, 1, des, false);}
      lc_max7219.setDigit(3, 0, edi, false);  
    }  
    if (but_valve_val==3) // настройка насоса
    {
      lc_max7219.clearDisplay(3);        //Очистить дисплей    
      //Пишем "НАСОС_"
      lc_max7219.setRow(3, 7 , bukvy[7]);    //Индикация "Н"
      lc_max7219.setRow(3, 6 , bukvy[0]);   //Индикация "А"
      lc_max7219.setRow(3, 5 , bukvy[11]);  //Индикация "С"   
      lc_max7219.setRow(3, 4 , bukvy[8]);   //Индикация "О"
      lc_max7219.setRow(3, 3 , bukvy[11]);  //Индикация "С"  
      lc_max7219.setRow(3, 2 , bukvy[16]);  //Индикация " "     
      //Раскладка по разрядам
      des = pump_volt % 100 / 10;
      edi = pump_volt % 10;
      if (pump_volt<10){lc_max7219.setRow(3, 1 , bukvy[16]);}  //Индикация " " 
      else {lc_max7219.setDigit(3, 1, des, false);}
      lc_max7219.setDigit(3, 0, edi, false);
    }    
  }  
  // обработка поворота энкодера клапана
  if (eb_Valve.left()) //Serial.println("valve_left");
  {
    if (but_valve_val==1) // настройка времени закрытого клапана увеличить
    {
      valve_interval=valve_interval+1000;
      if (valve_interval>30000) {valve_interval=30000;}
      ENC_VALVE_PROC(); //Расчеты и индикация времени закрытого клапана
    }
    if (but_valve_val==3) // настройка насоса увеличить 
    {
      {pump_volt++;}
      if (pump_volt>12) {pump_volt=12;}
      ENC_PUMP_PROC ();	
    }
  }
  if (eb_Valve.right()) //Serial.println("valve_right");
  {
    if (but_valve_val==1) // настройка времени закрытого клапана уменьшить
    {
      valve_interval=valve_interval-1000;
      if (valve_interval<1000) {valve_interval=1000;}      
      ENC_VALVE_PROC(); //Расчеты и индикация времени закрытого клапана
    } 
    if (but_valve_val==3) // настройка насоса уменьшить 
    {
      {pump_volt--;}
      if (pump_volt<0) {pump_volt=0;}
      ENC_PUMP_PROC ();
    }  
  
  }
  //БЛОК ДАТЧИКА ТЕМПЕРАТУРЫ DS18B20_________________________________________________________________
  //Опрос показаний термодатчика 1 раз в 900 мсек
  if (millis() - ds18b20_time > 900)
  {
    //Опрашиваем датчик колонны
    present = ds_col.reset();
    ds_col.select(addr_col);
    ds_col.write(0xBE);
    for ( i = 0; i < 9; i++)
    {
      data[i] = ds_col.read();
    }
    int16_t raw = (data[1] << 8) | data[0];
    temp_col = raw / 1.6;
    //Очередной запрос термодатчику колонны на измерение температуры
    if (!ds_col.search(addr_col)) {}
    //Инициируем датчик температуры колонны
    ds_col.reset();
    ds_col.select(addr_col);
    ds_col.write(0x44);  
    //Раскладка данных термодатчика и индикация
    sot = temp_col / 100;
    des = temp_col % 100 / 10;
    edi = temp_col % 10;
    lc_max7219.setDigit(1, 7, sot, false);
    lc_max7219.setDigit(1, 6, des, true);
    lc_max7219.setDigit(1, 5, edi, false);  
    lc_max7219.setRow(1, 4, bukvy[24]);   //Индикация "°"
    ds18b20_time=millis(); //обнуляем таймер датчика
  }
  //Раскладка данных температуры отсечки и индикация
  sot = temp_adj / 100;
  des = temp_adj % 100 / 10;
  edi = temp_adj % 10;
  lc_max7219.setDigit(1, 3, sot, false);
  lc_max7219.setDigit(1, 2, des, true);
  lc_max7219.setDigit(1, 1, edi, false);
  lc_max7219.setRow(1, 0 , bukvy[24]);  //Индикация "°"
  //_________________________________________________________________ 

  //БЛОК РАБОТЫ ВЕНТИЛЯТОРА_________________________________________________________________  
  if ((temp_col >666) || (!digitalRead(pin_cooler_force))) {digitalWrite(pin_cooler,HIGH); }  
  else {digitalWrite(pin_cooler,LOW); } 
  //__________________________________________________

  //БЛОК РАБОТЫ НАСОСА_________________________________________________________________ 
  if (temp_col >666) {analogWrite (pin_pump,pump_pwm);}	
  else  {analogWrite (pin_pump,0);}
  if (!digitalRead(pin_valve_force)) {analogWrite (pin_pump,255);}
  else  {analogWrite (pin_pump,pump_pwm);}
  //_________________________________________________________________

}	
void ENC_SETUP_FULL_PROC () //Расчеты и индикация паспортной мощности ТЭНа
{
  //Вычисляем сопротивление ТЭНа * 10: потом это учесть!!!
  zzz=48400/ten_power_pas; 
  ten_resist=round(zzz*10);
  //Расчленяем паспортную мощность
  tys = ten_power_pas / 1000;
  sot = ten_power_pas % 1000/100;
  des = ten_power_pas % 100 / 10;
  edi = ten_power_pas % 10;   
  //Пишем паспортную мощность с гашением незначащих нулей
  if (ten_power_pas<1000)
  {
    lc_max7219.setRow(0, 3 , bukvy[16]);  //Индикация " "
    lc_max7219.setDigit(0, 2, sot, false);
    lc_max7219.setDigit(0, 1, des, false);
    lc_max7219.setDigit(0, 0, edi, false);
  }
  if (ten_power_pas>999)
  {
    lc_max7219.setDigit(0, 3 , tys, false);
    lc_max7219.setDigit(0, 2, sot, false);
    lc_max7219.setDigit(0, 1, des, false);
    lc_max7219.setDigit(0, 0, edi, false);
  }     
}
void ENC_SETUP_CURR_PROC () //Расчеты и индикация рабочей мощности ТЭНа
{
  //Расчленяем рабочее напряжение 
  sot = ten_volt_cur % 1000/100;
  des = ten_volt_cur % 100 / 10;
  edi = ten_volt_cur % 10;
  //Пишем рабочее напряженине с гашением нуля
  if (ten_volt_cur<100){lc_max7219.setRow(0, 7 , bukvy[16]);}   //Индикация " ") 
  else {lc_max7219.setDigit(0, 7, sot, false);}     //Индикация сотен
  lc_max7219.setDigit(0, 6, des, false);
  lc_max7219.setDigit(0, 5, edi, false); 
  ten_power_cur = long(ten_volt_cur) * ten_volt_cur / ten_resist * 10;   //Вычисляем рабочую мощность ТЭНа
  //Расчленяем рабочую мощность ТЭНа
  tys = ten_power_cur / 1000;
  sot = ten_power_cur % 1000/100;
  des = ten_power_cur % 100 / 10;
  edi = ten_power_cur % 10;
  //Пишем рабочую мощность ТЭНа с гашением нулей
  if (ten_power_cur<1000) {lc_max7219.setRow(0, 3 , bukvy[16]);}  //Индикация " ")
  else {lc_max7219.setDigit(0, 3 , tys, false);}
  if (ten_power_cur<100) {lc_max7219.setRow(0, 2 , bukvy[16]);}     //Индикация " ")
  else {lc_max7219.setDigit(0, 2 , sot, false);}    
  if (ten_power_cur<10) {lc_max7219.setRow(0, 1 , bukvy[16]);}    //Индикация " ")
  else {lc_max7219.setDigit(0, 1 , des, false);}    
  lc_max7219.setDigit(0, 0, edi, false);  
}
void ENC_VALVE_PROC () //Расчеты и индикация времени закрытого клапана
{
  //Раскладка по разрядам
  des = (valve_interval/1000) % 100 / 10;
  edi = (valve_interval/1000) % 10;
  if (valve_interval<10000){lc_max7219.setRow(3, 1 , bukvy[16]);} //Индикация " " 
  else {lc_max7219.setDigit(3, 1, des, false);}
  lc_max7219.setDigit(3, 0, edi, false);  
}

void ENC_PUMP_PROC () //Расчеты и индикация мощности насоса
{
   //Раскладка по разрядам
   des = pump_volt % 100 / 10;
   edi = pump_volt % 10;
   if (pump_volt<10){lc_max7219.setRow(3, 1 , bukvy[16]);}  //Индикация " " 
   else {lc_max7219.setDigit(3, 1, des, false);}
   lc_max7219.setDigit(3, 0, edi, false);
   pump_pwm=map(pump_volt,0,12,0,255); 	//Пересчет "вольты" -> ШИМ
}

void RM2N_SETUP () //Передача настройки в РМ2-н
{
  if(rm2n_auto_flag==1);     //разрешить RM2N_SETUP до следующего цикла настройки
  {
    //Листание меню
    digitalWrite (pin_plus,HIGH);
    delay (200);  
    digitalWrite (pin_plus,LOW);
    delay (200);  
    digitalWrite (pin_plus,HIGH);
    delay (200);  
    digitalWrite (pin_plus,LOW);
    delay (200);
    digitalWrite (pin_plus,HIGH);
    delay (200);  
    digitalWrite (pin_plus,LOW);
    delay (200);
    digitalWrite (pin_plus,HIGH);
    delay (200);  
    digitalWrite (pin_plus,LOW);
    delay (200);
    digitalWrite (pin_minus,HIGH);
    delay (200);  
    digitalWrite (pin_minus,LOW);
    //Передача данных в РМ2-н
    if (ten_volt_cur>rm2n_volt_cur)
    {
      for (int i=rm2n_volt_cur+1; i<=ten_volt_cur-1; i++)
      {
        digitalWrite (pin_plus,HIGH);
        delay (200);  
        digitalWrite (pin_plus,LOW);
        delay (200);  
      }
    }
    if (ten_volt_cur<rm2n_volt_cur)
    {
      for (i=rm2n_volt_cur-1; i>=ten_volt_cur+1; i--)
      {
        digitalWrite (pin_minus,HIGH);
        delay (200);  
        digitalWrite (pin_minus,LOW);
        delay (200);  
      }
    }  
    delay (11000);
    //Пишем " ЗАПИСАНО"
    lc_max7219.setRow(0, 7 , bukvy[5]);    //Индикация "З"
    lc_max7219.setRow(0, 6 , bukvy[0]);   //Индикация "А"
    lc_max7219.setRow(0, 5 , bukvy[9]);   //Индикация "П"
    lc_max7219.setRow(0, 4 , bukvy[6]);   //Индикация "И"
    lc_max7219.setRow(0, 3 , bukvy[11]);    //Индикация "С"
    lc_max7219.setRow(0, 2 , bukvy[0]);   //Индикация "А"
    lc_max7219.setRow(0, 1 , bukvy[7]);   //Индикация "Н"
    lc_max7219.setRow(0, 0 , bukvy[8]);   //Индикация "О"  
    rm2n_auto_flag=0;     //запретить RM2N_SETUP до следующего цикла настройки
    rm2n_volt_cur=ten_volt_cur;   //Записываем последнее значение вольтажа на РМ2-н  
  }
}
void RM2_N_EXIT () //Выходим в завершение работы
{
  //Очистить дисплеи
  for (int i=0; i<=3; i++)
  {
  lc_max7219.clearDisplay(i);   
  } 
  //Пишем " ПАУЗА! " на первом дисплее
  lc_max7219.setRow(0, 7 , bukvy[16]);    //Индикация " "
  lc_max7219.setRow(0, 6 , bukvy[9]);   //Индикация "П"
  lc_max7219.setRow(0, 5 , bukvy[0]);   //Индикация "А"
  lc_max7219.setRow(0, 4 , bukvy[12]);    //Индикация "У"
  lc_max7219.setRow(0, 3 , bukvy[5]);   //Индикация "З"
  lc_max7219.setRow(0, 2 , bukvy[0]);   //Индикация "А"
  lc_max7219.setRow(0, 1 , bukvy[17]);    //Индикация "!"
  lc_max7219.setRow(0, 0 , bukvy[16]);    //Индикация " "
  
  //Пишем " СБРОС  " на втором дисплее
  lc_max7219.setRow(1, 7 , bukvy[16]);    //Индикация " "
  lc_max7219.setRow(1, 6 , bukvy[11]);   //Индикация "С"
  lc_max7219.setRow(1, 5 , bukvy[1]);   //Индикация "Б"
  lc_max7219.setRow(1, 4 , bukvy[10]);    //Индикация "Р"
  lc_max7219.setRow(1, 3 , bukvy[8]);   //Индикация "О"
  lc_max7219.setRow(1, 2 , bukvy[11]);   //Индикация "С"
  lc_max7219.setRow(1, 1 , bukvy[16]);    //Индикация " "
  lc_max7219.setRow(1, 0 , bukvy[16]);    //Индикация " "
  
  //Пишем " НАПРУГИ" на третьем дисплее
  lc_max7219.setRow(2, 7 , bukvy[7]);   //Индикация "Н"
  lc_max7219.setRow(2, 6 , bukvy[0]);   //Индикация "А"
  lc_max7219.setRow(2, 5 , bukvy[9]);   //Индикация "П"
  lc_max7219.setRow(2, 4 , bukvy[10]);    //Индикация "Р"
  lc_max7219.setRow(2, 3 , bukvy[12]);    //Индикация "У"
  lc_max7219.setRow(2, 2 , bukvy[3]);   //Индикация "Г"
  lc_max7219.setRow(2, 1 , bukvy[6]);   //Индикация "И"
  lc_max7219.setRow(2, 0 , bukvy[17]);    //Индикация "!"

//Меню РМ2-н
  digitalWrite (pin_plus,HIGH);
  delay (200);  
  digitalWrite (pin_plus,LOW);
  delay (200);  
  digitalWrite (pin_plus,HIGH);
  delay (200);  
  digitalWrite (pin_plus,LOW);
  delay (200);
  digitalWrite (pin_plus,HIGH);
  delay (200);  
  digitalWrite (pin_plus,LOW);
  delay (200);
  digitalWrite (pin_plus,HIGH);
  delay (200);  
  digitalWrite (pin_plus,LOW);
  delay (200);
  digitalWrite (pin_minus,HIGH);
  delay (200);  
  digitalWrite (pin_minus,LOW);
  delay (200);   
 //Готовим к отключению
  lc_max7219.setRow(3, 7 , bukvy[16]);    //Индикация " "     
  lc_max7219.setRow(3, 6 , bukvy[16]);    //Индикация " "     
  lc_max7219.setRow(3, 2 , bukvy[16]);    //Индикация " "     
  lc_max7219.setRow(3, 1 , bukvy[16]);    //Индикация " "     
  lc_max7219.setRow(3, 0 , bukvy[16]);    //Индикация  " "     
  for (i=220; i>=20; i--)
    {
      digitalWrite (pin_minus,HIGH);
      delay (200);  
      digitalWrite (pin_minus,LOW);
      delay (200);  
      //Раскладка вольтажа
      sot = i / 100;
      des = i % 100 / 10;
      edi = i % 10; 
      //Пишем убывающий вольтаж на четвертом дисплее      
      if (i<100)  {lc_max7219.setRow(3, 5 , bukvy[16]);}  
      else {lc_max7219.setDigit(3, 5, sot, false);}
      lc_max7219.setDigit(3, 4, des, false);
      lc_max7219.setDigit(3, 3, edi, false);
    }  
  delay (11000);
  //Очистить дисплеи
  for (i=0; i<=3; i++)
  {
  lc_max7219.clearDisplay(i);   
  } 
  //Пишем " ЗАПИСАНО" на четвертом дисплее
  lc_max7219.setRow(3, 7 , bukvy[5]);   //Индикация "З"
  lc_max7219.setRow(3, 6 , bukvy[0]);   //Индикация "А"
  lc_max7219.setRow(3, 5 , bukvy[9]);   //Индикация "П"
  lc_max7219.setRow(3, 4 , bukvy[6]);   //Индикация "И"
  lc_max7219.setRow(3, 3 , bukvy[11]);    //Индикация "С"
  lc_max7219.setRow(3, 2 , bukvy[0]);   //Индикация "А"
  lc_max7219.setRow(3, 1 , bukvy[7]);   //Индикация "Н"
  lc_max7219.setRow(3, 0 , bukvy[8]);   //Индикация "О"  
}

В строке 586 “if (temp_col >666) {analogWrite (pin_pump,pump_pwm);} “ игнорируется условие (temp_col >666). То есть, при вращении энкодера вправо-влево (строки 513,514,515 и 534,535,536) изменение подаваемой мощности в насос проходит адекватно, но в лупе “if (temp_col >666)” как будто отсутствует, насос реагирует на изменение “вольтажа”, несмотря на то, что temp_col на выше 666. Сунул во вложение весь скетч, может быть, чей-то свежий взгляд поможет?

Заранее спасибо!


одно можно сказать однозначно
в строке 586 переменная temp_col меньше или равна значению 666.
в термина вывести ее не пробовал?

Извиняюсь, строка 587 (на 586 комментарий).

В мониторе temp_col==240, то есть, меньше 666. Значит, насос должен молчать (строка 588).

вроде не пятница еще

Виноват! Да, 586.

ну видимо турбо кнопка/клапан (pin_valve_force) не нажата и срабатывает строка 589.

1 лайк

Хмм, постараюсь разобраться….

уж кто, если не вы…

Портянка кода, с кучей практически одинаковых переменных, да еще с переходом по меткам… неудивительно, что даже вы, автор, не знаете, что там откуда вылазит.

Поставьте вывод в монитор ВЕЗДЕ, где есть analogWrite (pin_pump. Выврдите номер строки и значение, которое передаёте analogWrite . Cразу же увидите кто гадит.

//БЛОК РАБОТЫ НАСОСА_________________________________________________________________ 
if (!digitalRead(pin_valve_force)) {
// Принудительное включение насоса
analogWrite (pin_pump,255);
} else if (temp_col > 666) {
// Нормальная работа по температуре
analogWrite (pin_pump,pump_pwm);
} else {
// Выключение насоса
analogWrite (pin_pump,0);
}

xDriver а вы 292 строку видели ? или вы не всех критикуете за такое использование)))

1 лайк

Спасибо за код. В процессе поиска попробую применить и его!

Автор жжет… у него код меняется ежесекундно.

Отвечал Бабосу вот на это

пока отвечал, стало так:

Но у меня этого кода нет ни на 280, ни на 292 строке.

@Sonologist
Перестаньте ковырять код в первом сообщении!
Это неуважение к тем, кто отвечает.
Если вы решили подгрузить другой код - вставляйте его НОВЫМ СООБЩЕНИЕМ

не видел и не хочу в таком коде, когда автор скажет, что у него проблема в 292 строке, тогда посмотрю.

1 лайк

вот))

Я знаю, что goto считается дурным тоном, но тут работает нормально.

Я ничего не менял в приведенном коде!

не смешите))
я посмотрел, и скажу я вам он там н@х не нужен!!

вот, другое дело, если критиковать так всех!))) не то что бы я подстрекатель… но если бы вы тут поспорили с аргументами было бы интересно почитать…

какой смысл прыгать на следующую исполняемую строку?

Так оно не потому бяка, что не работает, а потому что приводит к путанному коду, в котором потом трудно разбираться. Что мы у вас и видим в полный рост!