Понадобилось поиграться с написанием примитивного таймера. Скетч:
//UNO
//Блок мах7219
#define pin_din A2
#define pin_clk A0
#define pin_cs A1
int full_time;
int seconds;
int minutes;
unsigned long sec_break;
int tys; // Тысячи
int sot; // Сотни
int des; // Десятки
int edi; // Единицы
#define tire B00000001
#include <LedControl.h> //Подключение библиотеки max7219
LedControl lc_max7219 = LedControl(pin_din, pin_clk, pin_cs, 1);
//______________________________________
//Блок энкодера
#include <Arduino.h>
#include <GyverIO.h>
#include <EncButton.h>
#define enc_B 7 // пин В энкодера
#define enc_A 6 // пин А энкодера
#define enc_but 5 // пин кнопки энкодера
EncButton eb_enc(enc_B, enc_A, enc_but, INPUT_PULLUP); // пины энкодера настройки
int enc_but_val=0;
int enc_val=0;
//______________________________________
void setup()
{
Serial.begin(115200);
//Блок мах7219
pinMode(pin_din, OUTPUT);
pinMode(pin_clk, OUTPUT);
pinMode(pin_cs, OUTPUT);
//Инициализация индикаторов с выравниванием яркости
lc_max7219.shutdown(0, false); //Выводим из спящего режима
lc_max7219.setIntensity(0, 4); //Яркость дисплея на 4. Всего возможных режимов яркости от 0 до 15
lc_max7219.clearDisplay(0); //Очистить дисплей
lc_max7219.setRow(0, 4 , tire); //Индикация "-"
lc_max7219.setRow(0, 3 , tire); //Индикация "-"
//______________________________________
//Блок энкодера
//Предустановки энкодера (значения по умолчанию энкодера)
eb_enc.setBtnLevel(LOW);
eb_enc.setClickTimeout(500);
eb_enc.setDebTimeout(50);
eb_enc.setHoldTimeout(600);
eb_enc.setStepTimeout(200);
eb_enc.setTimeout(1000);
eb_enc.setEncReverse(0);
eb_enc.setEncType(EB_STEP4_LOW);
eb_enc.setFastTimeout(30);
eb_enc.counter = 0;
//______________________________________
}
void loop()
{
eb_enc.tick();
//Нажатие кнопки
if (eb_enc.press())
{
enc_but_val++;
if (enc_but_val==4) {enc_but_val=1;}
}
//Крутим влево, уменьшаем
if (eb_enc.left())
{
enc_val--;
if(enc_val<0) {enc_val=0;}
}
//Крутим вправо, увеличиваем
if (eb_enc.right())
{
enc_val++;
if(enc_val>60) {enc_val=60;}
}
//Настройка минут
if (enc_but_val==1)
{
minutes=enc_val;
full_time=minutes*60+seconds;
//Индикация настройки минут
des = minutes % 100 / 10;
edi = minutes % 10;
lc_max7219.setDigit(0, 6, des, false);
lc_max7219.setDigit(0, 5, edi, false);
}
//Настройка секунд
if (enc_but_val==2)
{
seconds=enc_val;
full_time=minutes*60+seconds;
//Индикация настройки секунд
des = seconds % 100 / 10;
edi = seconds % 10;
lc_max7219.setDigit(0, 2, des, false);
lc_max7219.setDigit(0, 1, edi, false);
}
//Запуск таймера
if (enc_but_val==3)
{
if ((millis()-sec_break)>999)
{
full_time--;
minutes=abs(full_time/60);
seconds=full_time-minutes*60;
//Индикация
des = minutes % 100 / 10;
edi = minutes % 10;
lc_max7219.setDigit(0, 6, des, false);
lc_max7219.setDigit(0, 5, edi, false);
des = seconds % 100 / 10;
edi = seconds % 10;
lc_max7219.setDigit(0, 2, des, false);
lc_max7219.setDigit(0, 1, edi, false);
sec_break=millis();
}
}
Serial.print (enc_but_val);
Serial.print (" ");
Serial.println (full_time);
}
Столкнулся вот с чем: все, что должно выполняться при значении кнопки энкодера==1 или 2 (настройки с энкодера), выполняется. А при значении кнопки энкодера==3 (режим обратного отсчета) НЕ выполняется цикл с millis(). Если закомментировать строки 108,109 и 126 (то есть, перенести цикл с millis() в луп напрямую без условия значения кнопки==3), то цикл с millis() начинает нормально выполняться. Где нарушил логику - не могу понять. Заранее спасибо за помощь!