countdown + controllo codice

salve a tutti ... mi servirebbe una mano per un progetto..:
ho un display lcd 16x2 , un keypad 4x3 , 2 led , un sensore magnetico e un buzzer (liquidcrystal.h , keypad.h e tone.h).. arrivo ad un punto (esempio apro porta) in cui inizia un countdown (va mostrato a display in formato hh:mm:ss). durante il countdown devo poter inserire un codice mostrato a display salvandolo in un array 'prova[6]' .
se il timer finisce -> suona buzzer
se codice corretto ->stoppa countdown
se codice errato -> alternativa non decisa.. :slight_smile:
quale è il modo migliore per farlo? sul web ho trovato tante alternative simili (metro.h , timer.h , void loop) ma nessuna mi convince e timer.h non ho ben compreso in che modo utilizzarla (in questo caso).
GRAZIE ANTICIPATAMENTE A TUTTI..!

Che risposta Ti asspetti?

Io userei millis() visto che non é rischiesto ne una precisione altissima ne un tempo brevissimo (nel ordine dei mS o minore)

Ciao Uwe

uwefed:
Che risposta Ti asspetti?

Io userei millis() visto che non é rischiesto ne una precisione altissima ne un tempo brevissimo (nel ordine dei mS o minore)

Ciao Uwe

in effetti all'inizio mi è venuto in mente semplicemente ogni 1000millis() di scendere un secondo sul timer e ogni volta attendere il getKey().. solo che una volta che il timer è 0 o il codice è giusto o sbagliato il programma continua sensa senso (tipodevo mettere un lcd.print codice errato suono del buzzer per 1 minuto e poi un maxi delay).. ma non mi sembra la soluzione piu elegante.. io in ogni caso vorrei sapere quale è la migliore in generale per fare una cosa del genere : countdown + controllo codice.
ho trovato sia la libreria metro.h che timer,h che potevano essere utili ma in timer.h non so come gestire lo schermo lcd che sottrae secondi

Guarda che per controllare il tempo trascorso , o usare la millis() o una libreria, cambia poco
Visto che la tua unità di tempo è il secondo, converti il tempo impostato in secondi e lavora su questo valore

Ad esempio, usando la millis() potresti fare così

void loop() {
  // Controlla tastierino etc etc
  
  if (millis() - PreviousMillis >= 1000 && flag_conta == 1 ) {
    RefreshDisplay(Tempo_in_sec);
    Tempo_in_sec --;
    if (Tempo_in_sec == 0 ) {
      flag_conta = 0 ;
      lcd.setCursor(0, 0);
      lcd.print("Fine conteggio");
    }
    PreviousMillis = millis();
  }
}

ed usare una funzione per visualizzare il tempo sull' LCD

void RefreshDisplay(unsigned long Tempo) {
  unsigned int Secondi = Tempo % 60;
  Tempo /= 60;
  unsigned int Minuti = Tempo % 60;
  Tempo /= 60;
  unsigned int Ore = Tempo % 24;
  lcd.setCursor(0, 1);
  lcd.print(Ore);
  lcd.print(":");
  if (Minuti < 10) lcd.print("0");
  lcd.print(Minuti);
  lcd.print(":");
  if (Secondi < 10) lcd.print("0");
  lcd.print(Secondi);
}

Se ci fai caso è stato usato il flag_conta per sapere quando il conteggio è terminato e appunto smettere di contare

Brunello:
Guarda che per controllare il tempo trascorso , o usare la millis() o una libreria, cambia poco
Visto che la tua unità di tempo è il secondo, converti il tempo impostato in secondi e lavora su questo valore

Ad esempio, usando la millis() potresti fare così

..

si in effetti sapevo che per quello che mi serviva non cambiava praticamente nulla.. era per sapere comunque come avrei potuto fare ad esempio utilizzando la lib timer.h oppure metro.h .. in effetti in principio avevo in mente di usare qualcosa tipo :
millis()=now;
appena (millis()-now)>=1000

loop{
if (secondi && minuti && ore>0)
{
//controllo getkey e inizz. array

if (millis()modulo 1000 == 0)
{ secondi--;
if secondi==0 ->minuti -- ;
if minuti==0->ore--;
//gestione e controllo tempo

aggiornamento display
print hh:mm:ss
}

}
if ( premo * controllo codice )
{if sbagliato
if giusto
delay(999999)}

}