Значение переменной самопроизвольно меняется в зависимости подключения Ардуино

Если загрузить скетч из Arduino IDE, то переменная int help имеет значение 1, как указывается при ее объявлении. После этого я отключаю шнур USB и включаю устройство от источника питания. При этом переменная int help сразу имеет значение 0.
В чем причина? Заранее спасибо!
Скетч:

//Mega2560
/*Пины прерываний
  пин2 (прерывание 0)
  пин3 (прерывание 1)
  пин18 (прерывание 5)
  пин19 (прерывание 4)
  пин20 (прерывание 3)
  пин21 (прерывание 2)*/

//Пины термодатчика колонны
int pin_col = 47; //Пин Data термодатчика колонны 47 (фиолетовый)
int pin_col_vcc = 49; //Пин 5v термодатчика колонны 49 (синий)
int pin_col_gnd = 45; //Пин gnd термодатчика колонны 45 (серый)
//Пин клапана
int pin_val = 12;
//Пины энкодеров
int pin_but_adj = 21; //Пин кнопки настройки (int2)
int pin_clk_adj = 20; //Пин CLK настройки (int3)
int pin_data_adj = 17; //Пин Data настройки
int pin_but_val = 19; //Пин кнопки клапана (int4)
int pin_clk_val = 18; //Пин CLK клапана (int5)
int pin_data_val = 16; //Пин Data клапана
//Переменные энкодеров
volatile int button_adj=1;
volatile int encoder_adj;
volatile int button_val;
volatile int encoder_val;
//Переменные индикаторов
int sot;  //Для интикаторов сотни
int des;  //Для интикаторов десятки
int edi;  //Для интикаторов единицы
//Переменные термодатчика
volatile int temp_col; // Температура ректификационной колонны
unsigned long ds18b20_time; //Переменная периода опроса термодатчика
//Переменные температуры отсечки
volatile int temp_adj=999; // Температура отсечки хвостов
//Переменные работы клапана
volatile long val_interval = 1000; //  Время закрытого клапана, умноженное на 1000 (открытый всегда на 1000 мсек)
volatile long val_change = 0; // Данные энкодера клапана
volatile int flag_val = 0; // Включать или нет клапан
volatile int flag_val_temp = 0; // Состояние отсечки хвостов
int val_state = LOW;      // Состояние клапана
long previous_millis = 0;  // Храним время последнего переключения кларана
//Переменная подсказки разъемов
volatile int help = 1;
//Подключение библиотеки  термодатчика колонны
#include <OneWire.h>
OneWire ds_col(pin_col);  // Датчик T° колонны на пине 47
//Подвязывание рабочих переменных к библиотеке датчика
byte i;
byte present = 0;
byte data[12];
byte addr_col[8];
//Подключение библиотеки max7219
#include <LedControl.h>
  /*создаём объект класса LedControl (din,clk,cs,X) X - количество модулей
  Провода: clk-зеленый, cs-желтый, din-оранжевый*/
LedControl lc_col = LedControl(30, 34, 32, 1);
LedControl lc_adj = LedControl(38, 42, 40, 1);
LedControl lc_val = LedControl(46, 50, 48, 1);
// Массив с закодированными символами для надписей.
byte bukvy[21] =
{
  B01001110,    //C-0
  B00011101,    //o-1
  B00001100,    //l-2
  B01110111,    //A-3
  B00111101,    //d-4
  B00011000,    //j-5
  B01100011,    //°-6
  B01111110,    //O-7
  B01000111,    //F-8
  B00010101,    //n-9
  B00000000,    //пусто-10
  B00000001,    //тире-11
  B01011110,    //G-12
  B00111101,    //d-13
  B01110111,    //A-14
  B01110110,    //N-15
  B00111110,    //V-16
  B00001110,    //L-17
  B01001111,    //E-18
  B01011011,    //S-19
  B00011111,    //b-20
};

void setup()

{
  Serial.begin(115200); //Инициализация монитора порта
  //Инициализация пинов энкодеров на подтянутый вход
  pinMode(pin_data_val, INPUT_PULLUP);
  pinMode(pin_data_adj, INPUT_PULLUP);
  pinMode(pin_clk_val, INPUT_PULLUP);
  pinMode(pin_but_val, INPUT_PULLUP);
  pinMode(pin_clk_adj, INPUT_PULLUP);
  pinMode(pin_but_adj, INPUT_PULLUP);
  //Инициализация пинов энкодеров на прерывания
  attachInterrupt(2, BUTTON_ADJ, RISING);
  attachInterrupt(3, ENCODER_ADJ, RISING);
  attachInterrupt(4, BUTTON_VAL, RISING);
  attachInterrupt(5, ENCODER_VAL, RISING);
  //Инициализация пина клапана на выход
  pinMode(pin_val, OUTPUT);
  //Инициализация пинов термодатчика
  pinMode(pin_col, 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);
  //Инициализация пинов индикаторов на выход
  for (int ind = 30; ind <= 50; ind++)
  {
    pinMode(ind, OUTPUT);
  }
  //Инициализация модулей индикаторов
  lc_col.shutdown(0, false); //Выводим из спящего режима
  lc_col.setIntensity(0, 7); //Яркость дисплея на 7. Всего возможных режимов яркости от 0 до 15
  lc_col.clearDisplay(0);    //Очистить дисплей
  lc_adj.shutdown(0, false); //Выводим из спящего режима
  lc_adj.setIntensity(0, 7); //Яркость дисплея на 7. Всего возможных режимов яркости от 0 до 15
  lc_adj.clearDisplay(0);    //Очистить дисплей
  lc_val.shutdown(0, false); //Выводим из спящего режима
  lc_val.setIntensity(0, 7); //Яркость дисплея на 7. Всего возможных режимов яркости от 0 до 15
  lc_val.clearDisplay(0);    //Очистить дисплей
  //ТЕСТ №1
//Пишем цифры от 0 до 7
    for (int dig = 7; dig >-1; dig--)
    {
      lc_col.setDigit(0, dig, 7-dig, false);
      delay (150);
    }
    delay (150);
    for (int dig = 7; dig >-1; dig--)
    {
      lc_adj.setDigit(0, dig, 7-dig, false);
      delay (150);
    }
    delay (150);
    lc_val.setChar (0,7,' ', true);
    delay (150);
    lc_val.setChar (0,6,' ', true);
    delay (150);
    lc_val.setChar (0,5,' ', true);
    delay (150);
    lc_val.setChar (0,4,' ', true);
    delay (150);
    lc_val.setRow (0,3,bukvy[12]);
    delay (150);
    lc_val.setRow (0,2,bukvy[1]);
    delay (150);
    lc_val.setRow (0,1,bukvy[1]);
    delay (150);
    lc_val.setRow (0,0,bukvy[13]);
    delay (1500);    
    
  //Очищаем индикаторы
  lc_col.clearDisplay(0);    //Очистить дисплей
  lc_adj.clearDisplay(0);    //Очистить дисплей
  lc_val.clearDisplay(0);    //Очистить дисплей
  

}
 
void loop()
{
  if (help==1) //Справка по разъемам
  {
    lc_col.setRow(0, 2, bukvy[8]);//Индикация "F"
    lc_col.setRow(0, 1, bukvy[14]);//Индикация "A"
    lc_col.setRow(0, 0, bukvy[15]);//Индикация "N"
    lc_adj.setRow(0, 7, bukvy[8]);//Индикация "F"
    lc_adj.setRow(0, 6, bukvy[17]);//Индикация "L"
    lc_adj.setRow(0, 5, bukvy[7]);//Индикация "O"
    lc_adj.setRow(0, 2, bukvy[16]);//Индикация "V"
    lc_adj.setRow(0, 1, bukvy[14]);//Индикация "A"
    lc_adj.setRow(0, 0, bukvy[17]);//Индикация "L"  
    lc_val.setDigit(0, 7, 1, false);//Индикация "I"
    lc_val.setRow(0, 6, bukvy[9]);//Индикация "n"
    lc_val.setRow(0, 5, bukvy[6]);//Индикация "°"
  }
  else
  {
  //Пишем "Col"
  lc_col.setRow(0, 7, bukvy[0]);//Индикация C"
  lc_col.setRow(0, 6, bukvy[1]);//Индикация "o"
  lc_col.setRow(0, 5, bukvy[2]);//Индикация "l"
  lc_col.setRow(0, 4, bukvy[10]);//Индикация " "
  lc_col.setRow(0, 0, bukvy[6]);//Индикация "°"
  //Пишем "Adj"
  lc_adj.setRow(0, 7, bukvy[3]);//Индикация "A"
  lc_adj.setRow(0, 6, bukvy[4]);//Индикация "d"
  lc_adj.setRow(0, 5, bukvy[5]);//Индикация "j"
  lc_adj.setRow(0, 0, bukvy[6]);//Индикация "°"
  //Пишем "OFF"
  //lc_val.setRow(0, 7, bukvy[7]);//Индикация "O"
  //lc_val.setRow(0, 6, bukvy[8]);//Индикация "F"
  //lc_val.setRow(0, 5, bukvy[8]);//Индикация "F"
  lc_val.setDigit(0, 3, 1, false); //Индикация "1"
  lc_val.setRow(0, 2, bukvy[11]);//Индикация "-"
  
  //Опрос показаний термодатчика 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_col.setDigit(0, 3, sot, false);
  lc_col.setDigit(0, 2, des, true);
  lc_col.setDigit(0, 1, edi, false);  
  //Раскладка данных температуры отсечки и индикация
  if (temp_adj > 999) 
  {
    temp_adj = 999; //Предел 999
  }
  if (temp_adj < 0) 
  {
    temp_adj = 0; //Предел 0
  }
  sot = temp_adj / 100;
  des = temp_adj % 100 / 10;
  edi = temp_adj % 10;
  lc_adj.setDigit(0, 3, sot, false);
  lc_adj.setDigit(0, 2, des, true);
  lc_adj.setDigit(0, 1, edi, false);
  //Раскладка и индикация времен клапана
  if (flag_val == 0)
  {
    lc_val.setRow(0, 7, bukvy[7]);//Индикация "O"
    lc_val.setRow(0, 6, bukvy[8]);//Индикация "F"
    lc_val.setRow(0, 5, bukvy[8]);//Индикация "F"
  }
  if (flag_val == 1)
  {
    lc_val.setRow(0, 7, bukvy[7]);//Индикация "O"
    lc_val.setRow(0, 6, bukvy[9]);//Индикация "n"
    lc_val.setRow(0, 5, bukvy[10]);//Индикация "_"
  }

  if (val_change > 59) {
    val_change = 59; //Предел 59
  }
  if (val_change < 1) {
    val_change = 1; //Предел 1
  }
  des = val_change % 100 / 10;
  edi = val_change % 10;
  //Гашение незначащего нуля
  if (val_change<10){lc_val.setRow(0, 1,  bukvy[11]);}
  else {lc_val.setDigit(0, 1, des, false);}
  lc_val.setDigit(0, 0, edi, false);
  
  
  //РАБОТА КЛАПАНА
    if(temp_col>temp_adj)  //Если температура колонны выше температуры отсечки
  {
    flag_val_temp=0;
    lc_val.setChar (0,4,' ', false);  
  }
  else //Если температура колонны ниже температуры отсечки
  {
    flag_val_temp=1;
    lc_val.setChar (0,4,' ', true);  
  } 
  unsigned long current_millis = millis(); // Приравниваем время отслеживания к таймеру
  if (current_millis - previous_millis > val_interval) //Если прошел нужный интервал
  {
    previous_millis = current_millis; // сохраняем время последнего переключения
    if (flag_val == 1 && flag_val_temp == 1) //если разрешено работать клапану
    {
      // если клапан закрыт, то открываем, и наоборот
      if (val_state == LOW)
      {
        val_state = HIGH;
        val_interval = 1000;
      }
      else
      {
        val_state = LOW;
        val_interval = val_change * 1000;
      }
      digitalWrite(pin_val, val_state);// устанавливаем состояния выхода, чтобы включить или выключить клапан
    }
    else {digitalWrite(pin_val, LOW);} // если запрещено работать клапану
  }
  }

    
  
  //Serial.println (encoder_val);
  //delay (100);
}
 
void BUTTON_ADJ()
{
  help=0;
  button_adj++;
  if (button_adj == 1) 
  {
    temp_adj = temp_col;
  }
  if (button_adj == 2) 
  {
    temp_adj = 999;
  }
  if (button_adj ==3) 
  {
    button_adj = 1;
    temp_adj = temp_col;
  }
}

void ENCODER_ADJ()
{
  int clk=digitalRead(20);
  int data=digitalRead(17);
  if (clk>data)
  {
    temp_adj--;
  }
  else
  {
    temp_adj++;
  }  
}

void BUTTON_VAL()
{
  help=0;
  if (flag_val == 0) 
  {
    flag_val = 1;
  }
  else 
  {
    flag_val = 0;
  }
}

void ENCODER_VAL()
{
  int clk=digitalRead(18);
  int data=digitalRead(16);
  if (clk>data)
  {
    val_change--;
  }
  else
  {
    val_change++;
  } 
}

При включении питания сразу же прилетает прерывание и она меняется. Чтобы убедиться в этом, вставьте зажигание какого-нибудь светодиода возле строк №№ 318 и 351 (можно разных светодиодов). Сразу увидите.

А вообще, чтобы такого не было, чистите флаги прерываний перед attachInterrupt.

Спасибо, буду пытаться.

Еще раз, спасибо. Начал с простого: присвоил переменной значение 1 в сетапе ПОСЛЕ attachInterrupt. Все наладилось.

На будущее. Хорошим тоном считается очистка флага прерывания перед его инициализацией, что бы сразу после инициализации оно не сработало. Перед строками 99-102 воткнуть команду очистки регистра флагов прерывания. О чём Евгений Петрович уже предупредил.

@Sonologist, отметить “Вопрос решен” нужно пост Евгения Петровича #2, а не свой.

Спасибо, усёк на будущее и про чистку флагов и куда “вопрос решен” ставить.