Problema di conteggio dei secondi nella realizzazione di un contatempo con LCD

Buongiorno a tutti.
Ho un piccolo problema nel conteggio dei millisecondi con arduino Rev 3.
Lo scopo è quello di creare un semplice contatempo utilizzando il timer interno di arduino, senza utilizzare clock esterni.
Svilòuppato il codice allegato, ho riscontrato che in un tempo di 3 ore circa il mio "orologio" software è rimasto indietro di circa 1 minuto.
Ho commesso qualche errore nel software?
Oppure è una cosa normale?

Grazie a tutti per l'aiuto.

    // Gestione LCD
     
    #include <LiquidCrystal.h>
     
    // initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
     
     
    unsigned int secondo = 1000;
    unsigned int minuto = 60000;
    unsigned int ora = 60*60000;
     
    unsigned long mem_sec=0;
    unsigned int mem_min=0;
    unsigned int mem_ora=0;
     
    int secondi=0;
    int minuti=0;
    int ore=0;
    int giorni=0;
     
    void setup() {
     
      lcd.begin(16, 2);
     
    };
     
    void loop (){
     
    unsigned long currentMillis = millis();  
     
    if(currentMillis - mem_sec > secondo) {
      mem_sec=currentMillis;
      secondi=secondi+1;
      if (secondi==60) {
        secondi=0;
        minuti=minuti+1;
        }
    }
      if (minuti==60) {
        minuti=0;
        ore=ore+1;
        }
      if (ore==24) {
        ore=0;
        giorni=giorni+1;
        }
     
    //stampa su LCD l'orario corrente
    lcd.setCursor(0, 0);
    lcd.print(giorni);
    lcd.setCursor(6, 0);
    lcd.print(ore);
    lcd.setCursor(9, 0);
    lcd.print(minuti);
    lcd.setCursor(12, 0);
    lcd.print(secondi);
    lcd.setCursor(1, 1);
    lcd.print(currentMillis);
    if (secondi<10) {
      lcd.setCursor(13, 0);
      lcd.print(" ");
      }
    if (minuti<10) {
      lcd.setCursor(10, 0);
      lcd.print(" ");
      }
    if (ore<10) {
      lcd.setCursor(7, 0);
      lcd.print(" ");
      }
    }

Ciao, leggi qui Contare 60 minuti - Software - Arduino Forum

Alcuni utenti hanno spiegato il perché dell'errore che hai rilevato :slight_smile:

if(currentMillis - mem_sec > secondo)

Per aumentare la precisione devi considerare almeno i decimi di secondo come base per il tuo confronto.

Cioè aggiungi una variabile Decimi che aggiornerai di conseguenza.

Tuttavia credo che otterrai lo stesso risultati non precisi perché normalmente si usa un Timer usato come contatore e relativa routine di interrupt per aggiornare i decimi o i centesimi di secondo.

ciao FabrizioRossi

3 cose.
L' Arduino UNO usa un risonatore come base di clock. Quello é inpreciso sul ordine dei 0,3% che sono ca 0,5 minuti su 180 minuti un quarzo ha una precisione di ca 100 volte maggiore. Lo stesso Sketch su un Arduino Leonardo diventa piú preciso.

Poi Tu determini i secondi con il millis e crei una imprecisione perché se no becchi il pasaggio preciso tra 999 e 1000, ma Ti ritrovi a controllare a 1003 perché il ciclo loop non passa ogni millisecondo, ma gli serve piú tempo hai ogni secondo questa imprecisione.
Trasforma il tempo del conteggio in millisecondi e fai un controllo di quello per determinare se il tempo é trascorso. Trasforma il tempo in millisecondi che é passato dal start fino adesso in secondi , minuti e ore per avere il tempo visualizzato corretto.
In questo modo l' errore rispetto il clock resta siccuramente sotto il secondo.

if (secondi==60) {
        secondi=0;
        minuti=minuti+1;
        }

Questo controllo é pericoloso.
meglio prevedere che i secondi non sono preciasamente 60

if (secondi>=60) {
        secondi -=60;
        minuti=minuti+1;
        }

Ciao Uwe