Aquí está el código. En la interrupción no uso ningún delay, durante el resto del código muy pocas veces.
#include <TimerOne.h>
#include <Keypad.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(14, 15, 16, 17, 18, 19); //Pines para la pantalla LCD
const int sensor = 2 ; //pin para el sensor, asociado a la interrupcion, no se puede cambiar el pin
const int led = 5 ; //pin para el led
const int zumbador = 11; //pin para el zumbador
char lectura; //Recibe lo escrito por teclado
const byte Filas = 4; //Teclado de 4 filas
const byte Cols = 4; //y 4 columnas
byte Pins_Filas[] = {10, 9, 8, 7}; // Pines asignados a las filas
byte Pins_Cols[] = {6, 5, 4, 3}; // Pines asignados a las columnas
char Teclas [ Filas ][ Cols ] =
{
{'1','2','3', 'A'}, // teclado
{'4','5','6', 'B'},
{'7','8','9', 'C'},
{'*','0','#', 'D'}
};
char PIN[4] = {'0','0','0','0'}; // Aqui va el pin de la alarma
char prueba [4] = {'0','0','0','0'}; //Inicializamos array prueba
Keypad Teclado = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols); //Inicializamos teclado
int estadoAlarma=0; //alarma empieza desactivada
//estadoAlarma=0 desactivada
//estadoAlarma=1 activada en silencio
//estadoAlarma=2 activada sonando
int sesion=0; // Sesion iniciada o no
int aux=0; //para que la alarma parpadee en sonido
int contadorv = 0;
int contadorv2 = 0;
int escribio = 0;
int escribio2 = 0;
int escribio3 = 0;
void setup() {
pinMode(led,OUTPUT); // LED, salida
pinMode(zumbador,OUTPUT); // Zumbador, salida
//Analogicas como digitales
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);
pinMode(16, OUTPUT);
pinMode(17, OUTPUT);
pinMode(18, OUTPUT);
pinMode(19, OUTPUT);
attachInterrupt(0, GestionarSensor, RISING); //Interrupcion 0 (pin 2, sensor)
lcd.begin(16, 4); // Fijamos el numero de caracteres y filas
lcd.setCursor(0,0);
Timer1.initialize(500000); // Dispara cada 500 ms
Timer1.attachInterrupt(GestionarAlarma);
}
void loop() {
if (sesion==0){
lcd.setCursor(0,0);
lcd.print("Introduzca PIN"); // Aqui va el mensaje inicial
while (contadorv < 4){
while (escribio == 0){
lectura = Teclado.getKey() ; // leemos tecla pulsada
if (lectura !=0){
// lcd.setCursor(0,1);
// lcd.print (lectura);
escribio = 1;
}
}
escribio = 0;
lcd.setCursor(contadorv,1);
lcd.print (lectura);
prueba [contadorv] = lectura;
//lcd.setCursor(8,1);
//lcd.print (contadorv);
contadorv++;
}
lectura = 0;
contadorv = 0;
if ((prueba[0] == PIN[0]) & (prueba[1] == PIN[1]) & (prueba [2] == PIN[2]) & (prueba[3] == PIN[3])){
lcd.clear();
lcd.setCursor(0,0);
//lcd.print(PIN);
//lcd.print(prueba);
//delay(500);
lcd.print ("PIN CORRECTO");
delay(500);
sesion = 1;
}
else {
lcd.clear();
lcd.setCursor(0,0);
lcd.print ("PIN INCORRECTO");
delay(500);
lcd.clear();
}
}
//Si ya iniciamos sesion
if (sesion == 1){
lcd.setCursor(0,0);
lcd.print("1Activ 2Desactiv");
lcd.setCursor(0,1);
lcd.print("3Cambio 4Cerrar");
while (escribio2 == 0){
lectura = Teclado.getKey() ; // leemos tecla pulsada
if (lectura !=0){
escribio2 = 1;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Has elegido");
lcd.setCursor(0,1);
lcd.print(lectura);
delay (700);
lcd.clear(); ////////////OJO ESTE!!!
}
}
escribio2 = 0;
///LO ELEGIDO EN MENU///
if (lectura == '1'){
if (estadoAlarma == 0){
estadoAlarma = 1;
lcd.print("Activada");
delay(500);
}
sesion = 0;
lcd.clear();
}
if (lectura == '2'){
if (estadoAlarma!=0){
estadoAlarma = 0;
}
lcd.clear();
lcd.print("DESACTIVADA");
delay(500);
sesion=0;
lcd.clear();
}
if (lectura == '3'){
lcd.setCursor(0,0);
lcd.print("Nuevo PIN"); // Aqui va el mensaje inicia
while (contadorv2 < 4){
while (escribio3 == 0){
lectura = Teclado.getKey() ; // leemos tecla pulsada
if (lectura !=0){
// lcd.setCursor(0,1);
// lcd.print (lectura);
escribio3 = 1;
}
}
escribio3 = 0;
lcd.setCursor(contadorv2,1);
lcd.print (lectura);
PIN [contadorv2] = lectura;
lcd.setCursor(8,1);
lcd.print (contadorv2);
contadorv2++;
}
contadorv2 = 0;
//escribio2 = 0;
lectura = 0;
}
if (lectura == '4'){
sesion = 0;
lcd.clear();
lectura = 0;
}
}
}
void GestionarSensor (){//solo nos interesa el estado 1
if (estadoAlarma ==0){
digitalWrite(zumbador, LOW);
}
if (estadoAlarma == 1){
estadoAlarma = 2;
aux=0;
suenaAlarma();
}
}
void GestionarAlarma (){
if (estadoAlarma==2){
if (aux & 0x01){
silenciaAlarma();
aux++;
}
else{
suenaAlarma();
aux++;
}
}
}
void suenaAlarma() {
digitalWrite(led, HIGH);
digitalWrite(zumbador, HIGH);
}
void silenciaAlarma() {
digitalWrite(led, LOW);
digitalWrite(zumbador, LOW);
}