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..
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 valoreAd 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)}
}