Buenas a todos!! Hace un tiempo desarrollé una alarma hogareña usando una SIM900 en donde la misma la controlo por sms desde el celular.
Todo venía bien hasta que de pronto comencé a tener falsas alarmas, me costo encontrar el motivo de las mismas pero ya lo logré, ahora el tema es como evitarlo.
La falla o falsa alarma: si alguien (como alguna operadora ofreciendo promociones) llama al número de la SIM me genera un positivo o high en los pines digitales 6 y 7 dado que la que se alarma es la ZONA 2 (incluso ya probé dejando solo habilitados dichos pines quitando la ZONA 1 y al llamar al número me genera el falso positivo).
Como evitar entonces el ruido o falso positivo ante la recepción de una llamada?.
Este es básicamente el codigo (se puede mejorar? Si, pero de momento solo preciso centrarme en solucionar esas falsas alarmas):
#include <SoftwareSerial.h>
#include <Arduino.h>
/*** PARÁMETROS ***/
/******************************/
#define BUZZER 5
#define releR1 2
#define bluePin 4
#define SERIAL_BAUDRATE 9600
#define GSM_BAUDRATE 9600
#define RX_pin 10
#define TX_pin 11
#define ON 1
#define OFF 0
#define sensorPirP1 A0
#define sensorEcoP1 A1
#define sensorPirP2 6
#define sensorEcoP2 7
/******************************/
bool state, monitoring;
int lecturaPirP1, lecturaEcoP1, lecturaPirP2, lecturaEcoP2;
int x = 0;
SoftwareSerial *SIM900;
String incomingSMS, msessage;
void setup(){
state = OFF;
monitoring = OFF;
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);
pinMode(8, OUTPUT);
mySerialPower();
GSM_init();
delay(15000);
countdown();
digitalWrite(bluePin, HIGH);
delay(2000);
digitalWrite(bluePin, LOW);
delay(1000);
Serial.println("Alarma lista para ser activada...");
}
void loop(){
userSMSCheck();
if(state == ON){
if(monitoring == ON){
lecturaPirP1 = analogRead(sensorPirP1);
lecturaEcoP1 = analogRead(sensorEcoP1);
if((lecturaPirP1 > 450) and (lecturaEcoP1 > 450)){
Serial.println("ALARMA ZONA Uno!!...");
activate_ALERT("1");
}
lecturaPirP2 = digitalRead(sensorPirP2);
lecturaEcoP2 = digitalRead(sensorEcoP2);
if((lecturaPirP2 == HIGH) and (lecturaEcoP2 == HIGH)){
Serial.println("ALARMA ZONA Dos!!...");
activate_ALERT("2");
}
}
else{
alertTimeOnCheck();
Serial.println("Alarma auto-reactivada.");
}
}
}
void mySerialPower(){
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=3;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("+zzzzzzzzzzzzzzz")>=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");
msessage = "ALARMA DESACTIVADA.";
sendSMS(msessage);
}
if(incomingSMS.indexOf("On")>=0){
Serial.println("Procesando activación...");
switch_ON();
Serial.println("Activada");
}
}
}
void sendSMS(String mensajeSale){
SIM900->println("AT");
updateSerial();
delay(500);
SIM900->println("AT+CMGS=\"+xxxxxxxxxxxxxx\"");
updateSerial();
SIM900->print(mensajeSale);
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(String zona){
monitoring = OFF;
msessage = "SE HA ACTIVADO LA ALARMA EN ZONA " + zona + ". AutoReseteo en 25seg.";
sendSMS(msessage);
digitalWrite(releR1, LOW);
x = 0;
do
{
delay(200);
userSMSCheck();
if(state == OFF) break;
x = x + 1;
}while (x < 99);
digitalWrite(releR1, HIGH);
}
void switch_ON(){
digitalWrite(releR1, LOW);
delay(100);
digitalWrite(releR1, HIGH);
x = 0;
do
{
delay(100);
x = x + 1;
}while (x < 249);
state = ON;
monitoring = ON;
}
void switch_OFF(){
state = OFF;
monitoring = OFF;
digitalWrite(releR1, HIGH);
delay(500);
digitalWrite(releR1, LOW);
delay(100);
digitalWrite(releR1, HIGH);
delay(500);
digitalWrite(releR1, LOW);
delay(100);
digitalWrite(releR1, HIGH);
delay(200);
}
void RESET(){
switch_OFF();
delay(2000);
switch_ON();
}
void alertTimeOnCheck(){
RESET();
}