Buenas tardes,
Mi nombre es Leandro, estoy desarrollando una alarma domiciliaria con control de estado de la misma usando una placa SIM900 enviando y/o recibiendo mensajes SMS.
Ya tengo todo montado en la casa, pero surge un problema:
1- Envio el sms de activación, y se activa sin problema.
2- Si detecta movimiento me envía el SMS de alerta y suena por x tiempo y se rearma sola.
Pero:
3- Estando activada, y cuando le envio el mensaje de desactivación o Reset aparece el problema: se alarma la zona 2 y luego hace caso a la órden recibida por mensaje.
Probé incluso de cambiar de pines los sensores de zona 2 pero aún así siempre se alarma la misma zona.
El hardware que utilizo es:
1- Arduino Nano
2- Sensores PIR x 2 + Sensores de presencia x 2 (combinado uno y uno, en 2 zonas).
3- Rele para sirenas
4- Reguladores de voltaje, uno para Arduino y otro para la SIM900.
5- Placa SIM900.
Este es todo mi código (las lineas comentadas es para no generar ruido durante las pruebas o bien gastar el saldo recibiendo mensajes que ya se que eso funciona):
#include <SoftwareSerial.h>
#include <Arduino.h>
/*** PARÁMETROS ***/
/******************************/
#define BUZZER 5
#define releR1 2
#define SERIAL_BAUDRATE 9600
#define GSM_BAUDRATE 9600
#define RX_pin 10
#define TX_pin 11
#define ON 1
#define OFF 0
#define ACTIVATION_DELAY 3
/******************************/
bool state, monitoring;
double lecturaPirP1, lecturaEcoP1, lecturaPirP2, lecturaEcoP2;
double sensorPirP1, sensorEcoP1, sensorPirP2, sensorEcoP2;
int bluePin, redPin, vueltas;
SoftwareSerial *SIM900;
String incomingSMS;
void setup(){
state = OFF;
monitoring = OFF;
sensorPirP1 = A0;
sensorEcoP1 = A1;
lecturaPirP1 = 0;
lecturaEcoP1 = 0;
sensorPirP2 = A4;
sensorEcoP2 = A5;
lecturaPirP2 = 0;
lecturaEcoP2 = 0;
bluePin = 4;
vueltas = 0;
SIM900 = new SoftwareSerial(RX_pin, TX_pin);
pinMode(BUZZER, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(releR1, OUTPUT);
pinMode(sensorPirP1, INPUT);
pinMode(sensorEcoP1, INPUT);
pinMode(sensorPirP2, INPUT);
pinMode(sensorEcoP2, INPUT);
digitalWrite(releR1, HIGH);
delay(5000);
mySerialPower();
delay(10000);
GSM_init();
delay(15000);
countdown();
digitalWrite(bluePin, HIGH);
delay(2000);
digitalWrite(bluePin, LOW);
delay(1000);
Serial.println("AT+CMGD=1,4");
Serial.println("Alarma lista");
}
void loop(){
userSMSCheck();
delay(3000);
if(state == ON){
if(monitoring == ON){
lecturaPirP1 = analogRead(sensorPirP1);
lecturaEcoP1 = analogRead(sensorEcoP1);
delay(200);
if((lecturaPirP1 > 450) and (lecturaEcoP1 > 450)){
Serial.println("ALARMA ZONA Uno!!...");
activate_ALERT();
}
lecturaPirP2 = analogRead(sensorPirP2);
lecturaEcoP2 = analogRead(sensorEcoP2);
delay(200);
if((lecturaPirP2 > 450) and (lecturaEcoP2 > 450)){
Serial.println("ALARMA ZONA Dos!!...");
activate_ALERT();
}
}
else{
alertTimeOnCheck();
Serial.println("Resetada, alarma activa nuevamente.");
userSMSCheck();
}
}
}
void mySerialPower(){
pinMode(8, OUTPUT);
digitalWrite(8, LOW);
delay(1000);
digitalWrite(8, HIGH);
delay(2000);
digitalWrite(8, LOW);
delay(3000);
}
void GSM_init(){
Serial.begin(SERIAL_BAUDRATE);
SIM900->begin(GSM_BAUDRATE);
SIM900->println("AT");
updateSerial();
SIM900->println("AT+CREG=1");
updateSerial();
delay(10000);
SIM900->println("AT+CMGF=1");
updateSerial();
delay(100);
SIM900->println("AT+CNMI=1,2,0,0,0");
updateSerial();
SIM900->println("AT+CSQ");
updateSerial();
SIM900->println("AT+CREG?");
updateSerial();
}
void countdown(){
for(int i=ACTIVATION_DELAY;i>1;i--){
if(i>10){
beep(50,50,1);
delay(100);
}else{
beep(50,50,2);
}
delay(900);
}
beep(50, 50, 10);
}
void beep(int msON, int msOFF, int rep) {
for (int i = 0; i < rep; i++) {
digitalWrite(BUZZER, HIGH);
delay(msON);//wait for X ms
digitalWrite(BUZZER, LOW);
delay(msOFF);
}
}
void userSMSCheck(){
incomingSMS = "";
if(SIM900->available()){
incomingSMS = SIM900->readString();
}
if((incomingSMS.indexOf("+XXXXXXXXXXXXXX")>=0) or (incomingSMS.indexOf("+ZZZZZZZZZZZZZ")>=0)){
if(incomingSMS.indexOf("Reset")>=0){
Serial.println("Procesando Reseteo...");
RESET();
Serial.println("Alarma reactivada...");
}
if(incomingSMS.indexOf("Off")>=0){
Serial.println("Procesando desactivación...");
switch_OFF();
Serial.println("Desactivada");
}
if(incomingSMS.indexOf("On")>=0){
Serial.println("Procesando activación...");
switch_ON();
Serial.println("Activada");
}
}
}
void sendSMS(){
SIM900->println("AT");
updateSerial();
delay(500);
SIM900->println("AT+CMGS=\"+XXXXXXXXXXXX\"");
updateSerial();
SIM900->print("SE HA ACTIVADO LA ALARMA\n\"Resetear\"-> Reinio auto en 25seg.");
SIM900->write(26);
updateSerial();
}
void updateSerial(){
delay(500);
while (Serial.available())
{
SIM900->write(Serial.read());
}
if (SIM900->available()){
while(SIM900->available())
{
Serial.write(SIM900->read());
}
}
}
void activate_ALERT() {
monitoring = OFF;
//sendSMS();
//digitalWrite(releR1, LOW);
delay(25000);
//digitalWrite(releR1, HIGH);
}
void switch_ON(){
delay(200);
//digitalWrite(releR1, LOW);
delay(100);
//digitalWrite(releR1, HIGH);
delay(25000);
state = ON;
monitoring = ON;
}
void switch_OFF(){
delay(200);
//digitalWrite(releR1, LOW);
delay(100);
//digitalWrite(releR1, HIGH);
delay(500);
//digitalWrite(releR1, LOW);
delay(100);
//digitalWrite(releR1, HIGH);
delay(200);
state = OFF;
monitoring = OFF;
}
void RESET(){
switch_OFF();
delay(2000);
switch_ON();
}
void alertTimeOnCheck(){
RESET();
delay(3000);
}
Espero que alguien me pueda ayudar, la falla a mi entender no tiene lógica alguna dado que primero controlo la llegada de mensajes y luego controlo estado de los sensores, no se porque ante la llegada de un nuevo SMS y estando activa se dispara la alarma en Zona 2 y luego procesa el mensaje entrante.
Saludos y gracias de antemano!.

