temporizador alarma, que decremente conteo antes de activarse.

hola amigos, la cosa es que hice un codigo con ayuda de un amigo y lo que quiero hacer es que cuando se presione el boton para armar la alarma esta espere 20 segundos y despues recien se arme, eso ya esta echo pero lo que quiero es que en el display lcd que le puse quiero que aparezca abajo a la derecha en la esquina aparezca el conteo de 20 segundos hasta cero y ahi se arme. y no se me ocure como realizarlo. la parte del codigo es el Estado 1.

#include <LiquidCrystal.h> 
// Libreria LiquidCrystal incluida.
LiquidCrystal lcd(12, 11, 10, 9, 8, 7); //  Asignación  de  pines  de  arduino  para display.

const int switchs = 6; 
// Pin de entrada para interruptores de puerta.
const int pir = 3; 
// Pin de entrada para sensor de presencia.
const int leds = 5; 
// Pin de salida para los leds de estado de la alarma.
const int sirena = 2; 
// Pin de salida para el relé que activa la sirena.
const int altavoz = 13; 
// Pin de salida para el altavoz.
const int activacion = 4;     
// activacin de la alarma

int titila=0;
int estado = 0; 
// Variable donde se almacena el estado de la alarma.
long tiempo; 
// Variable para guardar tiempo.

void setup()
{
Serial.begin(9600); 
// Se establece la velocidad de transmisión en 19200 Bauds.
lcd.begin(16, 2); 
// Se inicializa la pantalla del LCD con 16 columnas y 2 filas.
pinMode(pir, INPUT);  
// pir es una entrada.
pinMode(switchs, INPUT); 
// switchs es una entrada.
pinMode(leds, OUTPUT); 
// leds es una salida.
pinMode(sirena, OUTPUT); 
// sirena es una salida.
Serial.println("0"); 
// Inicializo imprimiendo "0" en el puerto serie.
pinMode(activacion, INPUT);
} 

void loop()
{
while(estado == 0) 
{
/*   En el siguiente estado (estado '0')
 -poner a nivel bajo las salidas leds, sirena y altavoz.
 -indicar en la pantalla LCD que la alarma esta inactiva.
 -esperar a presionar el pulsador (high)
 -si se pulsa, ir al estado 1 e imprimir "se activo=1" en el puerto serie.
 */
digitalWrite(leds, LOW); 
digitalWrite(sirena, LOW); 
digitalWrite(altavoz, LOW); 
lcd.setCursor(0, 0);
lcd.print("Alarma off");
lcd.setCursor(0, 1);
lcd.print("pulse para activar ");
if(digitalRead(activacion) == HIGH)
{
  estado = 1;
  Serial.println("se activo=1");
  delay (1000);
}
}
/*
ESTADO 1

- poner a nivel alto el indicador de alarma activada (led verde)
- indicar en la pantalla lcd que la alarma se esta activando.
- esperar 20 segundos (delay)
- el programa pasa al estado 2.
imprimir "alarma armada=2" en el puerto serie.
*/
if(estado == 1)
{
digitalWrite(sirena, LOW); 
digitalWrite(altavoz, HIGH); 
lcd.setCursor(0, 0);
lcd.print("Activando Alarma...");
lcd.setCursor(0, 1);
lcd.print("espera 20 seg      ");

tiempo = millis() + 10000;
//espero que se active solo, o que se desactive con el boton:
while(tiempo > millis ()){
  if(digitalRead(activacion) == HIGH)
  {
    estado = 0;
    Serial.print("Se desactivo=0");
    delay (1000);
    break;
  }
  if(millis() %200 ==0){
    if(digitalRead(leds)) digitalWrite(leds, LOW); 
    else digitalWrite(leds, HIGH); 
  }
}
if(estado==1) estado = 2;
Serial.println("alarma armada=2");
}
/*
ESTADO 2

-poner a nivel alto solo el indicador de alarma activada (led verde)
-indicar en la pantalla LCD que la alarma esta operativa
-verificar si el sensor pir o los interruptores de puerta han detectado algun intruso.
-si se activa el switch de puerta, el programa pasara al estado 3 e imprimira "puerta de entrada=3" en el puerto serie.
si se activa el sensor pir el programa pasa al estado cuatro en imprime PIR=4 en el puerto serie.
*/
if(estado == 2)
{
digitalWrite(leds, HIGH); 
digitalWrite(altavoz, LOW); 
digitalWrite(sirena, LOW);
lcd.setCursor(0, 0);
lcd.print("ON, press but   ");
lcd.setCursor(0, 1);
lcd.print("to desactivate  ");

while(estado==2) {
  if(digitalRead (switchs) == HIGH) 
  {
    estado = 3;
    Serial.println("puerta de entrada=3");
  }
  if(digitalRead (pir) == HIGH) 
  {
    estado = 4;
    Serial.println("PIR=4");
  }
}
}
/*
* ESTADO 3

durante 20 segundos:
-poner a nivel alto solo el indicador de alarma activa (led verde)
-indicar en la pantalla LCD que la alarma debe desactivarse en menos de 20 seg.
-verificar que sea apretado el pulsador.
-si es apretado ir al estado 0 e imprimir se desactivo=0 en el puerto serie.
si no es pulsado ir al estado 4 e imprimir "4" en el puerto serie.
*/
if(estado == 3)
{
tiempo = millis() + 10000;
digitalWrite(leds, HIGH); 
digitalWrite(sirena, LOW);  
lcd.setCursor(0, 0);
lcd.print("Desactivar en  ");
lcd.setCursor(0, 1);
lcd.print("20 segundos      "); 

//espero desactivar:
while(tiempo > millis ()){
  if(digitalRead(activacion) == HIGH)
  {
    estado = 0;
    Serial.println("Se desactivo=0");
    delay (1000);
    break;
  }
}
//ya pasaron 20 seg y no se desactivo...entonces ALARMA!
if (estado==3) estado = 4;
}
/*
* ESTADO 4

-poner a nivel alto el indicador de alarma activa (led verde)
-poner a nivel alto el rele que activa la sirena o buzzer.
-indicar en la pantalla LCD que la alarma esta en funcionamiento y necesita clave para desactivarse.
-verficar que se pulse el pulsador.
-si se pulsa pasa al estado 0 e imprime "0" en el puerto serie.

*/
if(estado == 4)
{
Serial.print("ALARMA!! 4");
digitalWrite(leds, HIGH); 
digitalWrite(sirena, HIGH); 
lcd.setCursor(0, 0);
lcd.print("ALARMA! pres boton");
lcd.setCursor(0, 1);
lcd.print("para desactivar  ");

while(estado==4)
{
  if(digitalRead(activacion) == HIGH)
  {
    estado = 0;
    Serial.println("Se desactivo=0");
    delay (1000);
  }
}
}
}

proyecto_alarma.ino (5.47 KB)

debes poner el codigo entre tags (< / >), mirate las normas, para evitar futuros errores en insertar preguntas y corregir este.
saludos

efect2000:
debes poner el codigo entre tags (< / >), mirate las normas, para evitar futuros errores en insertar preguntas y corregir este.
saludos

ya esta echo! gracias por la ayuda.

lo que yo haria: tengo en algun sitio que la referencia de 20 segundos, y en otro lugar un contador de segundos que va bajando hasta cero, pues deberia ser algo como que en display muestre el resultado de 20-tiempo que está descontando.