Alarma activada por ausencia de Ping
Es fácil que al salir de casa se nos olvide activar la alarma o cualquier otra acción. En mi caso tengo una por radar y activada vía Telegram que olvido activar. Por ello he realizado otra con un PIR y que se activa automáticamente cuando mi mujer y yo dejamos el hogar.
El método es sencillo, un esp8266 hace constantemente un ping a ambos teléfonos. Si ninguno de los dos contesta se tiene en cuenta el estado del sensor PIR y envía una notificación con la API de Telegram. si hay una intrusión.
Los teléfonos han de tener IP fija configurada en el setup del móvil o por MAC en el Router.
En mi caso, al regresar a casa el esp8266 tarda más de un minuto en detectar el ping. Si el sensor PIR está en la entrada puede dar una false notificación. No tiene importancia porque sabemos que somos nosotros.
Pongo un código orientativo de la parte fundamental que yo uso.
//Hece ping a las IP de los telefonos en domicilio para detectar ausencia de todos y hacer acciones
#include <ESP8266WiFi.h>
#include <ESP8266Ping.h>
const char* ssid = "********";
const char* password = "*********";
const IPAddress remote_ipJo(192, 168, 1, 50); //Telefono Joaquin
const IPAddress remote_ipAm(192, 168, 1, 51); //Telefono Amparo
boolean FlagAlarma=false;
int sensorPIR= D7; //Sensor PIR
boolean FlagJo=false;
boolean FlagAm=false;
unsigned long lastTime = 0;
unsigned long timerDelay = 120000; // Set timer a 2 minutos o más
void setup() {
Serial.begin(115200);
delay(10);
Serial.println();
IPAddress ip(192, 168, 1, 150);
IPAddress gateway(192,168,1,1);
IPAddress subnet (255,255,255,0);
Serial.println("Connecting to WiFi");
WiFi.begin(ssid, password);
// WiFi.config(ip,gateway,subnet);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
pinMode(sensorPIR, INPUT);
Serial.println();
Serial.print("WiFi conectad con ip ");
Serial.println(WiFi.localIP());
}
void loop() {
Serial.print(remote_ipJo); Serial.print(": ");
if(Ping.ping(remote_ipJo,4)){ //4 intentos de respuesta ping
Serial.print("Ping: "); Serial.print(Ping.averageTime()); Serial.println("ms");
lastTime = millis(); //Pone a cero el retardo de 2 minutos
FlagAlarma=false;
FlagJo=false;
} else {
FlagJo=true;
Serial.println("Ausente");
}
Serial.print(remote_ipAm); Serial.print(": ");
if(Ping.ping(remote_ipAm,4)) {
Serial.print("Ping: "); Serial.print(Ping.averageTime()); Serial.println("ms");
FlagAlarma=false;
FlagAm=false;
} else {
FlagAm=true;
Serial.println("Ausente");
}
if (FlagJo==true and FlagAm==true){
digitalWrite(camara, HIGH); //enciende la cámara a través de un transistor
}
//Si hay una detección, evita que lo ponga a false mientras pasan los 2' del millis
if(FlagAlarma==0){FlagAlarma=digitalRead(sensorPIR);};
Serial.print("FlagAlarma: ");Serial.println(FlagAlarma);
//Delay de 2,5 minutos para obtener Ping de algún telefono al regresar a casa
if ((millis() - lastTime) > timerDelay) { //Delay de 2,5 minutos para obtener Ping de algun telefono
if (FlagAlarma){
//Activar sirena
//Enviarnos aviso por API Telegram, email, API de Whatsap...
//etc.
FlagAlarma=false; //Evita avisos continuos
}
if (FlagJo==true and FlagAm==true){ //Cualquier acción
Serial.println("Activando sistemas por ausencia en domicilio");
//Activar simulador de presencia
//Apagar luces
//Encender cámara de vigilancia
//etc
}
else{
Serial.println("Desactivando sistemas por presencia en domicilio");
//Desactivar cosas
}
lastTime = millis();
}
}