Contador regressivo para desativar alarme

Bem, estou desenvolvendo um alarme para minha casa, o que preciso fazer é o seguinte:

Coloquei um sensor de abertura do portão para quando eu chegar de carro, e gostaria de colocar um tempo de 30 segundos para desarme do alarme sem que o mesmo disparasse...

Algo como "Invasão detectada" digite a senha... 30...29..28......

Para acionar eu consegui fazer, para acionar o alarme ele me da X segundos para que seja ativado, mas o inverso disso não consegui fazer pois fica travado dentro do "WHILE" e trava o teclado (claro... :wink: .)

void ativar_alarme(){
				  lcd.setCursor(0,0);
                  lcd.print(">ATIVAR ALARME      ");

                  teclaPressionada = meuTeclado.getKey();
                  if (teclaPressionada =='A'){        
                  lcd.clear();
                  sub_alarme++;}

            switch(sub_alarme){
                 case 1:
                  lcd.clear();
                  lcd.setCursor(0,0);
                  lcd.print("O alarme sera");
                  lcd.setCursor(0,1);
                  lcd.print("ativado em");
                 
                  int countdown = 10;        //CONTAGEM REGRESSIVA DE 10 SEGUNDOS ANTES DE ATIVAR O ALARME
                  while (countdown != 0) {
                    lcd.setCursor(13,1);
                    lcd.print(countdown);
                    countdown--;
                    tone(buzzer, 700, 100);
                    delay(1000);
                  }
                  lcd.clear();
                  lcd.setCursor(3,3);
                  lcd.print("Alarme Ativado!");
                  break;
            }           
}

Porem o que fiz ele já dispara e já entra na função de senha , apos digitar a senha ele desliga, tentei usar o millis() o timerOne, mas sem sucesso , alguma sugestão de como eu executo esses "30" segundos sem o teclado travar no delay ou while ??

Estou na pesquisa ainda… se eu usar um for dessa maneira:

for (int i = 0; i < 30; i++)

{

ativa_alarme()

}

Esta correto?
como ela passa a cada 1 segundo? ou ele não esta passando a cada 1 segundo sobre o for?!

Já viste o exemplo blink without delay ?