miglior modo timer/countdown con display e keypad

salve a tutti . vorrei chiedervi un consiglio . dovrei costruire una sorta di 'allarme-controllo accesso' tale che all'evento E (ad esempio apertura di una porta) inizi un timer deciso in precedenza in formato HH:MM:SS . durante il countdown mostrato nell LCD 16x2 è possibile inserire un codice (keypad 4x3) per resettarlo-stopparlo.. la mi domanda è .. quale è il miglior modo per fare ciò secondo voi? - faccio funzione timer con controllo tasti in loop . - timer in loop con funzione controllo tasti. - ciclo while in setup. - cosa mi dite voi.

Una cosa del genere nel loop():

  • Se timer non avviato:
  • Verifica se evento E è scattato
  • Se sì:
  • Avvia timer
  • Altrimenti:
  • Aggiorna display
  • Leggi tasti
  • Se codice corretto
  • Ferma timer

mm … ok… quindi piu nello specifico del timer se io ho un tempo in formato
int h
int m
int s…
per fare il timer devo nell loop ogni millis(1000) devo sottrarre 1 sec e ogni volta che sec è 0 sottraggo un min e cosi via…

poi gia che ci sono ho un altro problemino… durante la scelta del codice vorrei che al premere di ‘’ il cursore tornasse indietro di una posizione mentre se premo ‘#’ accetta il codice, esce dal while, e lo mostra per sicurezza in una seconda schermata dove se premo ancora’’ posso reimpostare il codice e se premo ‘#’ avvio il timer…
io ho fatto cosi ma non funziona bene.

void setup() {
  
  pinMode(ledPinRed, OUTPUT); // sets the digital pin as output
  pinMode(ledPinGreen, OUTPUT); // sets the digital pin as output
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  
  digitalWrite(ledPinRed, HIGH);
  digitalWrite(ledPinGreen, HIGH);
  
  lcd.setCursor(0,0);
  lcd.print("     access  ");
  delay(3000);
  
  
  digitalWrite(ledPinRed, LOW);
  digitalWrite(ledPinGreen, LOW);
  
  
  /////////////////////////////////////////////////// set code
  label_1:
  lcd.clear();
  lcd.home();
  delay(300);  
  lcd.print("   SET  CODE:");
  k = 0;
  controlloavanti = 0 ;
  while (controlloavanti != 1 ) //set code unti[quote][/quote]l press # 
  {     lcd.cursor();
    	lcd.setCursor(k+5,1);
    	
       	char key = keypad.getKey();
      	if (key != NO_KEY)
    	{
     		 	if ((key != '*')&&(key != '#'))
    			{ 
      						lcd.print(key);
      						realcode[k] = key;
      						if(k<5)
                            {k++;
                            }
                  
      			} 
                else if (key = '*')
                {    if(k!=0)
                     {k--;
                     }
           	    }
                else if (key = '#')
                { controlloavanti = 1 ;
           		}       
          }
          key = NO_KEY;
  
    }
        delay(300);
        lcd.clear();
    	lcd.noCursor();
        delay(800);
        controlloavanti = false;
        while (controlloavanti == false) //show code until press#
        {       lcd.home();
      		    lcd.print("  THE CODE IS:  ");
    			lcd.setCursor(5,1);
    			lcd.print(realcode);
        	    char key = keypad.getKey();
    	    	key == NO_KEY;
    		     if (key != NO_KEY)
    		     { 
    			   if (key = '*')
          		   { //goto label_1 ;
           		   }
                   if (key = '#')
          		   {  controlloavanti = true;
           		   }
                 }
        }

SukkoPera: Una cosa del genere nel loop():

  • Se timer non avviato:
  • Verifica se evento E è scattato
  • Se sì:
  • Avvia timer
  • Altrimenti:
  • Aggiorna display
  • Leggi tasti
  • Se codice corretto
  • Ferma timer