COUNTDOWN RTC

Ciao a tutti, sono impiegato nella realizzazione di un tabellone dei punti con il relativo tempo generale e il tempo dell'azione.
Ho notato che i secondi sono un po' più lenti rispetto a quelli reali.
Leggendo in internet ho scoperto che è colpa di arduino infatti mi consigliavano di usare un modulo rtc.
Premesso che sono ancora alle prime armi, qualcuno ha idea di come fare un timer usando il modulo rtc?
Ho notato che nel mio caso perde circa un secondo a minuto forse anche di più.

void countdown(){
  Serial.println("COUNTDOWN");
  /*
  if(new_tempo < 60) tempo_shot = new_tempo; 
  
        Serial.println("TEMPO < 60");
        Serial.println(tempo_shot);
  */ 
  
  int reading_start_stop = digitalRead(buttonPin_start_stop);
  if (reading_start_stop != lastButtonState_start_stop) {
    lastDebounceTime_start_stop = millis();
  }
  if ((millis() - lastDebounceTime_start_stop) > debounceDelay_start_stop) {
    if (reading_start_stop != buttonState_start_stop) {
      buttonState_start_stop = reading_start_stop;
      if (buttonState_start_stop == HIGH) {
        step_funzione = 0;
      }
    }
  }
  lastButtonState_start_stop = reading_start_stop;
  
   
  //GENERAL TIMER
  unsigned long currentMillis_general = millis();
  if(currentMillis_general - previousMillis_general >= interval_general){
    previousMillis_general = currentMillis_general;

    m = new_tempo/60;
    s = new_tempo%60;
    
    new_tempo--;
    if(new_tempo<0){
      step_funzione = 3;
    }
    Serial.println(new_tempo);
  }
  
     //display.showNumberDec(new_tempo);
    display.showNumberDec(m, true,2,0);
    display.showNumberDec(s, true,2,2);
    //TIMER SHOT
    
  unsigned long currentMillis_shot = millis();
  if(currentMillis_shot - previousMillis_shot >= interval_shot){
    previousMillis_shot = currentMillis_shot;
    
    //m_shot = tempo_shot/60;
    s_shot = tempo_shot;//%60;
    
    tempo_shot--;
    if(tempo_shot<0){
      step_funzione = 3;
    }
    Serial.println(tempo_shot);

    

  }
     //display.showNumberDec(new_tempo);
    //display_shot.showNumberDec(m_shot, true,2,0);
    display_shot.showNumberDec(s_shot, true,2,2);
    
}

L'errore di millis, se non si usano procedure che alterano gli interrupt, è di qualche secondo all'ora (anche molto meno se il clock di Arduino è quarzato), a cui si può però aggiungere un ulteriore grosso ritardo se non usato in modo corretto.

Il caso in questione mi sembra proprio questo, se ne è parlato qui:
https://forum.arduino.cc/index.php?topic=447098.msg3087318#msg3087318
e qui:
http://forum.arduino.cc/index.php?topic=500503.msg3414558#msg3414558

L' RTC invece ha un errore di pochissimi secondi al mese, ma la risoluzione minima è un secondo, questo vuol dire che dal momento esatto dello "start" il tempo impostato è affetto da un errore massimo di un secondo su qualsiasi periodo (a seconda di dove avviene lo start all'interno del secondo attuale).

Ho sostituito il codice con quello che mi hai consigliato, il tempo funziona in modo corretto, ma ora ho un nuovo problema...
Non riesco a fermarlo... Colpa della funzione millis()...
Per questo io pensavo di usare il modulo rtc, e di far partire il conteggio dell'rtc solo al momento dell'attivazione del pulsante. Non so se sia sbagliato il concetto...
Comunque qui incollo il codice con la funzione millis(), visto che è un doppio timer uno l'ho voluto usare con la nuova funzione mentre l'altro con la vecchia, solo per il confronto.

void countdown(){
  display.setBrightness(7);
  display_shot.setBrightness(7);
  unsigned long currentMillis_general = millis();
  if(currentMillis_general - previousMillis_general >= interval_general){
    previousMillis_general += interval_general; 
    //previousMillis_general = currentMillis_general;

    m = new_tempo/60;
    s = new_tempo%60;
    
    new_tempo--;
    if(new_tempo<0){
      step_funzione = 3;
    }
  }

  Serial.println(previousMillis_general);
     //display.showNumberDec(new_tempo);
    display.showNumberDec(m, true,2,0);
    display.showNumberDec(s, true,2,2);
    buttonState = digitalRead(buttonPin);

  if(buttonState == HIGH){
    Serial.println("HIGH"); 
    step_funzione = 0;
    delay(200);
  }

  unsigned long currentMillis_shot = millis();
  if(currentMillis_shot - previousMillis_shot >= interval_shot){
    previousMillis_shot = currentMillis_shot;
    
    m_shot = tempo_shot/60;
    s_shot = tempo_shot%60;
    
    tempo_shot--;
    if(tempo_shot<0){
      step_funzione = 3;
    }
  }
  s_shot = tempo_shot%60;
  display_shot.setBrightness(7);
  display_shot.showNumberDec(m_shot, true,2,0);
    display_shot.showNumberDec(s_shot, true,2,2);
}