Таймер обратного отсчета на TM1637 (Проблема)

Приветствую, уважаемые форумчане.
Задача стояла такая: сделать таймер обратного отсчета на 5 минут. Проблема в том, что после отсчёта 2х минут таймер сбрасывается, отсчет начинается заново с 5 минут. Ткните носом, что я делаю не так. Спасибо.

#include <GyverTM1637.h>

GyverTM1637 disp1(7, 8);
uint32_t Now1;


void setup() {
  disp1.clear();
  disp1.brightness(5);  // яркость, 0 - 7 (минимум - максимум)
}

void loop() {
  byte min1 = 4, sec1 = 59;
  uint32_t tmr1;
  Now1 = millis();
  disp1.point(1);
  while (millis() - Now1 < 60000 && min1 >= 0) {   // каждые 60 секунд
    if (millis() - tmr1 > 1000) {       // каждую секунду
      tmr1 = millis();
      sec1 --;
      disp1.displayClock(min1, sec1);   // выводим время функцией часов
      if (sec1 == 00) {
        sec1 = 60;
        min1--;
        Now1 = millis();
      }
    }
  }
}

Вообще в корне не верный подход!

Вот таймер прямого счета (взято отсюда):

/ переменные для отсчета минут и секунд
int SEC = 0;
int MIN = 0;
unsigned long timer;

void setup() {
   Serial.begin(9600);
   timer = millis();
}

void loop() {
   // если прошло 1000 мс - прибавляем одну секунду к переменной SEC
   if (millis() - timer > 1000) {
      timer = millis();
      SEC = SEC + 1;
      if (SEC > 59) {  // Если прошло 60 секунд
         SEC = 0; 
         MIN = MIN + 1; 
      }
      // выводим текущий счетчик времени на монитор порта
      Serial.println(String(MIN) + " : " + String(SEC));
   }
}

Переделать его на обратный отсчет дело нескольких минут.

Большое спасибо за помощь

Такой подход используется, когда требуется отсчитать интервал заведомо не меньший заданного. Если же нужно отсчитать заданный интервал с максимальной точностью, писать следует:

Вы правы, но я (если честно) особо в код не вчитывался, источник указал.