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)