AYUDA!!! interrupcion watch dog por periodo de tiempo
Publicado por EMANUEL (1 intervención) el 06/08/2018 00:21:34
Hola que tal soy amateur y necesito ayuda!!!
estoy programando una alarma con arduino UNO
el caso es que la alarma tiene diferentes casos de activación en los cuales se activan diferentes zonas y sensores
uno de los casos, pongamoslo el caso "A", necesita para su desactivación permitir la activación de uno de los sensores, el cual esta en la puerta de entrada, durante unos segundos. en esos segundos debe ejecutar una subrutina leer el teclado en un loop par ver si entra la clave de desactivación.
Aquí va mi problema, he logrado esto planteado anteriormente mediante la librería "TimeOne.h" pero cuando desactivo mediante la clave se rompe el loop del caso "a" hasta aquí todo bien. perooo..... cuando sale del caso y se desea activar nuevamente la alarma con alguna de las opciones se "a" sea "b" no toma la tecla ingresada en el teclado....
AQUI VA LO IMPORTANTE ESTO PASA SOLO CON EL CASO "A" DONDE SE PRODUCE LA INTERRUPCIÓN POR TIEMPO CON UN DELAY QUE PAUSA EL CODIGO DEL LOOP Y EJECUTA LA SUBRUTINA DE LECTURA DEL TECLADO ,DURANTE EL DELAY. TODOS LOS DEMAS CASOS AL DESACTIVAR SALEN DE SU CASO Y SE PUEDE ACTIVAR NUEVAMENTE SIN PROBLEMAS ...
OSEA QUE EL PROBLEMA ES CON LA INTERRUPCION DE LA LIBRERIA "TIMEONE"
Explico mejor:
PRESIONO "A" en el teclado (para activar esa opción de armado)
SE ARMA LA ALARMA
ABRO LA PUERTA
SE EJECUTA LA SUBRUTINA DE LECTURA DE TECLADO
PASAR 15 SEGUNDOS
SI SE INGRESO LA CLAVE SE DESARMA LA ALARMA
AQUÍ EL PROBLEMA, SI VUELVO A PRESIONAR ALGUNA OPCIÓN DE ARMADO
DEBERÍA LEERLA Y ARMAR NUEVAMENTE LA ALARME, BUENO ESTO NO SUCEDE NO ME LEE LO INGRESADO EN EL TECLADO
ESTO NO PASA EN LAS OPCIONES DONDE NO TENGO LA SUBRUTINA, SE DESRAMA Y SE PUEDE VOLVER A ARMAR PRESIONANDO UNA OPCIÓN SIN PROBLEMA..
creo que he sido claro, si alguien me puede ayudar agradeceria.
dejo el código
PD: perdón si hay algunas cosas feas soy amateur jajaja
#include <TimerOne.h> //timer para poder hacer las interrupciones
#include <Keypad.h>
byte c=0;
volatile byte aperturaporton;
volatile byte antipanico;
byte portoncalle;
byte sensorgaraje;
byte taller;
byte averturascasa;
byte sensorescasa;
volatile char tecla;
String clave;
const byte ROWS = 4; //filas
const byte COLS = 4; //columna
char hexaKeys[ROWS][COLS] =
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //pines en el arduino fila
byte colPins[COLS] = {5, 4, 3, 2}; //pines en el arduino columnas
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup()
{
Serial.begin(9600);
Timer1.initialize(25000); // Dispara el timer cada 25 ms
pinMode(16, OUTPUT);
pinMode(15, OUTPUT);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, INPUT);
pinMode(10, INPUT);
pinMode(14, INPUT);
pinMode(17, INPUT);
pinMode(18, INPUT);
}
void secuencia_arranque()
{
for( c=0; c<=6; c++)
{
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
delay(500);
digitalWrite(12, LOW);//bufer
digitalWrite(13, LOW);//led rojo
delay(1500);
}
for( c; c==7; c++)
{
digitalWrite(12, HIGH);//alarma armada
delay(1500);
digitalWrite(12, LOW);
Serial.println("armado");
}
}
void teclado()
{
tecla = customKeypad.getKey();
if (tecla=='1'|| tecla=='2')
{
clave=clave+tecla;
if (clave=="122")
{
digitalWrite(16, LOW);//desactiva alarma
digitalWrite(15, LOW);//desactiva alarma
digitalWrite(13, LOW);//led rojo
Serial.println("desactivado");
clave="";
c=0;
antipanico=0;
aperturaporton==0;
}
}
else if(tecla=='C')//anti panico
{
digitalWrite(16, HIGH);//suena alarma
digitalWrite(15, HIGH);//suena alarma
digitalWrite(13, HIGH);//led rojo
Serial.println("anti panico");
}
else if(tecla=='#')//borra el registro
{
clave="";
Serial.println("registro borrado");
}
}
void loop()
{
tecla = customKeypad.getKey();
Serial.println(c);
Serial.println(tecla);
switch (tecla)
{
case 'A':
Serial.println("caso A");
secuencia_arranque();
while(c==8)
{
averturascasa=digitalRead(11);// guarda lo leido
portoncalle=digitalRead(10);// guarda lo leido
sensorgaraje=digitalRead(14);// guarda lo leido
sensorescasa=digitalRead(17);// guarda lo leido
taller=digitalRead(18);// guarda lo leido
if(averturascasa==LOW || sensorescasa==LOW || taller==LOW)
{
digitalWrite(16, HIGH);//suena alarma
digitalWrite(15, HIGH);//suena alarma
digitalWrite(13, HIGH);//led rojo
Serial.println("activado");
}
if(portoncalle==LOW && aperturaporton==0 || sensorgaraje==LOW && aperturaporton==0)
{
aperturaporton=1;
digitalWrite(12, HIGH);// bufer
delay(3000);
digitalWrite(12, LOW);// bufer
Timer1.attachInterrupt(teclado); // Activa la interrupcion y la asocia a ISR_Blink
interrupts(); // Autoriza las interrupciones
digitalWrite(13, HIGH);//led rojo
delay(15000);
digitalWrite(13, LOW);//led rojo
if(c==8)
{
digitalWrite(16, HIGH);//suena alarma
digitalWrite(15, HIGH);//suena alarma
digitalWrite(13, HIGH);//led rojo
Serial.println("activado1");
}
}
noInterrupts();
}
break;
case 'B':
Serial.println("caso B");
secuencia_arranque();
while(c==8)
{
averturascasa=digitalRead(11);// guarda lo leido
portoncalle=digitalRead(10);// guarda lo leido
taller=digitalRead(18);// guarda lo leido
teclado();
if(portoncalle==LOW || averturascasa==LOW || taller==LOW)
{
digitalWrite(16, HIGH);//suena alarma
digitalWrite(15, HIGH);//suena alarma
digitalWrite(13, HIGH);//led rojo
Serial.println("activado");
teclado();
}
}
break;
case 'C':
antipanico=1;
Serial.print("caso C");
digitalWrite(16, HIGH);//suena alarma
digitalWrite(15, HIGH);//suena alarma
Serial.println("activado");
while(antipanico==1)
{
teclado();
}
break;
}
}
estoy programando una alarma con arduino UNO
el caso es que la alarma tiene diferentes casos de activación en los cuales se activan diferentes zonas y sensores
uno de los casos, pongamoslo el caso "A", necesita para su desactivación permitir la activación de uno de los sensores, el cual esta en la puerta de entrada, durante unos segundos. en esos segundos debe ejecutar una subrutina leer el teclado en un loop par ver si entra la clave de desactivación.
Aquí va mi problema, he logrado esto planteado anteriormente mediante la librería "TimeOne.h" pero cuando desactivo mediante la clave se rompe el loop del caso "a" hasta aquí todo bien. perooo..... cuando sale del caso y se desea activar nuevamente la alarma con alguna de las opciones se "a" sea "b" no toma la tecla ingresada en el teclado....
AQUI VA LO IMPORTANTE ESTO PASA SOLO CON EL CASO "A" DONDE SE PRODUCE LA INTERRUPCIÓN POR TIEMPO CON UN DELAY QUE PAUSA EL CODIGO DEL LOOP Y EJECUTA LA SUBRUTINA DE LECTURA DEL TECLADO ,DURANTE EL DELAY. TODOS LOS DEMAS CASOS AL DESACTIVAR SALEN DE SU CASO Y SE PUEDE ACTIVAR NUEVAMENTE SIN PROBLEMAS ...
OSEA QUE EL PROBLEMA ES CON LA INTERRUPCION DE LA LIBRERIA "TIMEONE"
Explico mejor:
PRESIONO "A" en el teclado (para activar esa opción de armado)
SE ARMA LA ALARMA
ABRO LA PUERTA
SE EJECUTA LA SUBRUTINA DE LECTURA DE TECLADO
PASAR 15 SEGUNDOS
SI SE INGRESO LA CLAVE SE DESARMA LA ALARMA
AQUÍ EL PROBLEMA, SI VUELVO A PRESIONAR ALGUNA OPCIÓN DE ARMADO
DEBERÍA LEERLA Y ARMAR NUEVAMENTE LA ALARME, BUENO ESTO NO SUCEDE NO ME LEE LO INGRESADO EN EL TECLADO
ESTO NO PASA EN LAS OPCIONES DONDE NO TENGO LA SUBRUTINA, SE DESRAMA Y SE PUEDE VOLVER A ARMAR PRESIONANDO UNA OPCIÓN SIN PROBLEMA..
creo que he sido claro, si alguien me puede ayudar agradeceria.
dejo el código
PD: perdón si hay algunas cosas feas soy amateur jajaja
#include <TimerOne.h> //timer para poder hacer las interrupciones
#include <Keypad.h>
byte c=0;
volatile byte aperturaporton;
volatile byte antipanico;
byte portoncalle;
byte sensorgaraje;
byte taller;
byte averturascasa;
byte sensorescasa;
volatile char tecla;
String clave;
const byte ROWS = 4; //filas
const byte COLS = 4; //columna
char hexaKeys[ROWS][COLS] =
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //pines en el arduino fila
byte colPins[COLS] = {5, 4, 3, 2}; //pines en el arduino columnas
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup()
{
Serial.begin(9600);
Timer1.initialize(25000); // Dispara el timer cada 25 ms
pinMode(16, OUTPUT);
pinMode(15, OUTPUT);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, INPUT);
pinMode(10, INPUT);
pinMode(14, INPUT);
pinMode(17, INPUT);
pinMode(18, INPUT);
}
void secuencia_arranque()
{
for( c=0; c<=6; c++)
{
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
delay(500);
digitalWrite(12, LOW);//bufer
digitalWrite(13, LOW);//led rojo
delay(1500);
}
for( c; c==7; c++)
{
digitalWrite(12, HIGH);//alarma armada
delay(1500);
digitalWrite(12, LOW);
Serial.println("armado");
}
}
void teclado()
{
tecla = customKeypad.getKey();
if (tecla=='1'|| tecla=='2')
{
clave=clave+tecla;
if (clave=="122")
{
digitalWrite(16, LOW);//desactiva alarma
digitalWrite(15, LOW);//desactiva alarma
digitalWrite(13, LOW);//led rojo
Serial.println("desactivado");
clave="";
c=0;
antipanico=0;
aperturaporton==0;
}
}
else if(tecla=='C')//anti panico
{
digitalWrite(16, HIGH);//suena alarma
digitalWrite(15, HIGH);//suena alarma
digitalWrite(13, HIGH);//led rojo
Serial.println("anti panico");
}
else if(tecla=='#')//borra el registro
{
clave="";
Serial.println("registro borrado");
}
}
void loop()
{
tecla = customKeypad.getKey();
Serial.println(c);
Serial.println(tecla);
switch (tecla)
{
case 'A':
Serial.println("caso A");
secuencia_arranque();
while(c==8)
{
averturascasa=digitalRead(11);// guarda lo leido
portoncalle=digitalRead(10);// guarda lo leido
sensorgaraje=digitalRead(14);// guarda lo leido
sensorescasa=digitalRead(17);// guarda lo leido
taller=digitalRead(18);// guarda lo leido
if(averturascasa==LOW || sensorescasa==LOW || taller==LOW)
{
digitalWrite(16, HIGH);//suena alarma
digitalWrite(15, HIGH);//suena alarma
digitalWrite(13, HIGH);//led rojo
Serial.println("activado");
}
if(portoncalle==LOW && aperturaporton==0 || sensorgaraje==LOW && aperturaporton==0)
{
aperturaporton=1;
digitalWrite(12, HIGH);// bufer
delay(3000);
digitalWrite(12, LOW);// bufer
Timer1.attachInterrupt(teclado); // Activa la interrupcion y la asocia a ISR_Blink
interrupts(); // Autoriza las interrupciones
digitalWrite(13, HIGH);//led rojo
delay(15000);
digitalWrite(13, LOW);//led rojo
if(c==8)
{
digitalWrite(16, HIGH);//suena alarma
digitalWrite(15, HIGH);//suena alarma
digitalWrite(13, HIGH);//led rojo
Serial.println("activado1");
}
}
noInterrupts();
}
break;
case 'B':
Serial.println("caso B");
secuencia_arranque();
while(c==8)
{
averturascasa=digitalRead(11);// guarda lo leido
portoncalle=digitalRead(10);// guarda lo leido
taller=digitalRead(18);// guarda lo leido
teclado();
if(portoncalle==LOW || averturascasa==LOW || taller==LOW)
{
digitalWrite(16, HIGH);//suena alarma
digitalWrite(15, HIGH);//suena alarma
digitalWrite(13, HIGH);//led rojo
Serial.println("activado");
teclado();
}
}
break;
case 'C':
antipanico=1;
Serial.print("caso C");
digitalWrite(16, HIGH);//suena alarma
digitalWrite(15, HIGH);//suena alarma
Serial.println("activado");
while(antipanico==1)
{
teclado();
}
break;
}
}
Valora esta pregunta
0