Detector de caidas

 
          Muchas personas con movilidad reducida pueden pasar parte de su tiempo sin compañía que les pueda socorrer en caso de una caída de la que no puedan levantarse por su propia incapacidad o haberse lesionado.
          Detectar esta circunstancia y emitir una alerta puede ser una opción interesante y es de lo que trata este montaje.
          El principio de detección ha sido la utilización de un sensor de presión atmosférica de gran precisión basado en el chip MPL3115A2.
          Tiene una precisión de solo 10cm.  Si una persona lleva el detector a la altura de la solapa y tiene una caída, esto supone una variación de altura de más de un metro que es fácilmente detectable para dar una alarma.
          Estas son las especificaciones principales del chip.

   -Rango 50kPa a 110kPa de presión absoluta.
   -Altitud de -698 a 11.775 metros.
   -Temperatura -40ºC a 85ºC
   -Compensación por temperatura.
   -Salida I2C
   -Voltaje 1,9v a 3,6v

#include <ESP8266SMTP.h>
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <Adafruit_MPL3115A2.h>
float subtotal=0;
float altura=0;
float base=0;
float altm=0;
const char* ssid = "Jopapa";
const char* password = "xxxxxxxxxxxxxx";
Adafruit_MPL3115A2 baro = Adafruit_MPL3115A2();

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT); 
  if (! baro.begin()) {
   Serial.println("Couldnt find sensor");
   return;}  
  WiFi.forceSleepBegin();   //Apaga el wifi para reducir el consumo
  fbase();
  digitalWrite(LED_BUILTIN, HIGH); 
}

void loop() {
if (baro.begin()) {
  subtotal=0;
  for(int i=0; i<=4; i++){ 
   altm = baro.getAltitude();
   subtotal=subtotal+altm;
   delay(200);
  }
  altura=subtotal/5;  //Media de cinco lecturas de altura

  Serial.print("Altura: ");
  Serial.println(altura,1);
  if (base-altura > 1.0){    //Alarma si hay variación de >1 metro de altura
   Serial.print("base: ");
   Serial.print(base,1);   
   Serial.print("Altura: ");
   Serial.println(altura,1); 
   Serial.println("Caida");
   conectar();  //Conectar y enviar email 
   WiFi.forceSleepBegin();   
  }
  base=altura;   //Ajusta la base ante pequeñas derivas de la altura
  delay(4000);  //Da tiempo en una caida lenta sin actualizar variable base
  digitalWrite(LED_BUILTIN, LOW); delay(200); digitalWrite(LED_BUILTIN, HIGH);       
}
}


void conectar(){     //Conecta wifi y manda email
  Serial.print("Conectando a Jopapa");
  IPAddress ip(192, 168, 1, 126);  //si quieres ip fija
  IPAddress gateway(192,168,1,1);
  IPAddress subnet (255,255,255,0);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500); Serial.print("."); }
  Serial.println("WiFi conectada"); 
    SMTP.setEmail("micorreo@gmail.com")
    .setPassword("xxxxxxxxx")
    .Subject("Asunto: Caida")
    .setFrom("ESP8266SMTP")
    .setForGmail();         //puerto a 465 y setServer("smtp.gmail.com");          
                                 
  if(SMTP.Send("micorreo@gmail.com", "¡¡¡Me he caído!!!")) {
    Serial.println(F("Correo enviado"));
  } else {
    Serial.print(F("Error enviando correo: "));
    Serial.println(SMTP.getError());
  }
}

void fbase(){      //Asigna valor a base la primera vez
if (! baro.begin()) {
  Serial.println("Couldnt find sensor");
return;} 
while (! baro.begin()) {}
  for(int i=0; i<=4; i++){ 
  altm = baro.getAltitude();
   subtotal=subtotal+altm;
   delay(200);
  }  
  base=(subtotal/5);  //determina altura base
  Serial.print("base: ");
  Serial.println(base,1);
  delay(500);
}
   Aparte del chip MPL3115A2 usaremos un WeMoS D1 Mini para programa y wifi.

    En el código se realizan 5 lecturas de altura y se extrae la media que se compara con la variable base para emitir una alarma en forma de email.

     La presión atmosférica tiene una deriva que se traduce en una variación en la medida de la altura que mientras no supere un valor (> 100cm) se reasigna continuamente a la variable base.

     Por supuesto que la altura que nos marca el chip no corresponde con nuestra altura geográfica sino de la presión atmosférica/climatología de ese momento. Nos da igual que marque alturas negativas, lo importante es la variación a la baja que nosotros queramos detectar.

     La alarma se hace por medio de un email de Google.
     Personalmente no me gusta porque un email no se recibe de forma instantánea, pueden pasar varios minutos hasta que nuestro teléfono u ordenador lo lee. Y además, la recepción de este email Google lo considera de un origen no seguro, lo que nos obliga en nuestra cuenta de Google a permitir la recepción de mensajes de origen desconocido. Si no lo hacemos, el email nos dará error al enviarlo desde el esp8266.
      He puesto el email para mayor facilidad, pero...

     Prefiero la notificación por Telegram. Es instantáneo aunque un poco mas difícil de configurar. Pueden seguir estas páginas para hacerlo Notificación Telegram y Alarma radar.

     Ni que decir que este código es solo un concepto y que permite muchas variaciones y mejoras.

     Finalmente, he observado que en días de viento fuerte hay variaciones de presión que pueden dar falsos positivos, aunque normalmente son de corta duración. Es algo lógico, pero que habría que preveer y depurar de alguna forma en el código o trabajando simultáneamente con un giroscopio tipo MPU-6050 o similar.

     Veamos la salida serie típica en una caída:
          El circuito eléctrico es muy simple, solo los dos componentes y dos puentes.
          Como el sistema desconecta la Wifi del WEMOS y solo la activa para enviar el email (o un Telegram) el consumo es mínimo de solo 16mA.
         
          Con una sola batería de litio con un elevador a 5v tendrá una gran autonomía. Habría que poner un puente resistivo conectado a la entrada analógica del esp8266 para testear el voltaje de la batería y mandar un email cuando baje de niveles seguros.
Menu