Hola, estoy intentando hacer una alarma con un arduino uno REV 3, la shield GSM 2 de arduino, un sensor PIR, una sirena y un buzzer. Bien, pongo el código y os comento cual es el problema que me esta volviendo loco porque no le encuentro la lógica por ninguna parte.
Bueno como veis abajo en el código, básicamente lo que hace es permitir activar o desactivar la alarma mediante llamadas perdidas, una llamada activa la alarma y otra la desactiva. Y estando activada comprueba periódicamente si recibe una llamada de desactivación y si estando activada detecta movimiento. Lo hace todo bien hasta que hago la llamada de desactivación. En vez de ejecutar el "Punto 3" se va directamente al "Punto 1" en adelante, que he puesto como comentarios. Lo curioso es que cuando hago la llamada de desactivación el detector se pone en HIGH sin haber movimiento alguno con lo cual la sirena se enciende durante unos segundos y ya después si que se desactiva la alarma. El problema es que esto no debe ocurrir, la alarma simplemente tiene que desactivarse sin hacer sonar la sirena. No se si se ha entendido todo.
#include <GSM.h>
#define PINNUMBER ""
GSM gsmAccess;
GSMVoiceCall llamadaSaliente;
GSMVoiceCall llamadaEntrante;
String numeroDestino = "660161598"; //número al que llamar
char charbuffer[20];
int estadoAlarma=0;
int estadoSensor=0;
int bocina=10; //Sonido que indica que hemos activado o desactivado la alarma
int sensor=6;
int sirena=8;
void setup()
{
pinMode(bocina,OUTPUT);
pinMode(sirena,OUTPUT);
pinMode(sensor, INPUT);
boolean notConnected = true;
digitalWrite(sirena, LOW);
/*Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
*/
//Esperamos que el módulo GSM se cargue
while (notConnected)
{
if (gsmAccess.begin(PINNUMBER) == GSM_READY)
notConnected = false;
else
{
delay(1000);
}
}
}
void loop()
{
if(estadoAlarma==0)
{
switch (llamadaEntrante.getvoiceCallStatus())
{
case IDLE_CALL: // No ocurre nada
break;
case RECEIVINGCALL: // Nos llaman y activamos la alarma
delay(100);
estadoAlarma=1;
tone(bocina,700,1000);
llamadaEntrante.hangCall();
delay(5000);
break;
case TALKING: //Si nos cogen la llamada colgamos directamente
llamadaEntrante.hangCall();
break;
}
delay(5000);
}
if(estadoAlarma==1)
{
if(llamadaEntrante.getvoiceCallStatus()==RECEIVINGCALL) //Punto 3
{
llamadaEntrante.hangCall(); //Si nos llaman colgamos y desactivamos la alrma
estadoAlarma=0;
tone(bocina,200,1000);
}
else
{
estadoSensor = digitalRead(sensor); //Comprobamos si hay movimiento
if (estadoSensor == HIGH) //Punto 1
{
numeroDestino.toCharArray(charbuffer, 20); //Punto2
llamadaSaliente.voiceCall(charbuffer); //En caso de detectar movimiento hacemos una llamada
digitalWrite(sirena, HIGH); //Activamos la sirena durante un tiempo determinado
delay(10000);
digitalWrite(sirena, LOW);
}
delay(100);
}
}
}