Если загрузить скетч из 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++;
}
}