La razón oficial de este montaje era crear un sistema de alarma con sensor de movimiento que cuando detectase algo me enviara un notificación al movil. La razón real es que me habia comprado un nodeMCU y un HW-MS03 y algo tenia que hacer con ellos.
En principio el proyecto es sencillo. Conectar el radar al nodeMCU y cuadno detecte movmiento enviar una notificación através de un webhook de IFTTT para que apararezca una notificacion en el movil. Pero resulta que nada es tan sencillo como parece, pero asi es más divertido.
Lo primero es concetar el HW-MS03 al nodeMCU lo cual es facil porque solo tiene tres pines.
HW-MS03 | nodeMCU | Funcion |
---|---|---|
GND | GND | Tierra |
Vin | 3V | Alimentacion +3V (ojo no soporta +5V) |
Out | A0 | Señal del HW-MS03 al nodeMCU |
Cuando el HW-MS03 detecta algo que se mueve delante suyo (en teoria hasta 4 metros de distancia) manda la señal por el pin out. Basta con detectarla y realizar un http get contra la direccion que facilita IFTTT, facil. He usado al entrada analogica (A0) del nodeMCU porque no estaba segura si el voltaje de la patilla Out bastaria para activar las entradas digitales. Tras varias pruebas he fiajado el valor de umbral en 800.
if(analogRead(A0) > 800){ ... }
Pero volvamos un paso atras. resulta que concetar juntos ambas placas fue una mala idea, ambas trabajan en la misma frecuencia. Asi que cuando el nodeMCU esta usando el WiFi el HW-MS03 se vuelve loco. Tras realizar varias pruebas puede ver que esto solo pasa cuando la distancia entre ambos era de unaos 50 cm, pero con cables de esa longituda tambien tenia problemas para leer el estado del pin. La unica opción que me quedaba era encender el WiFi solo para enviar la notificación cuando detectase movimiento. Para ellos hice dos funciones una aque apaga el WiFi y otra que lo conecta. (En realida si que tenia otra opción usar un PIR en lugar de un radar y ya no tendria problemas con el WiFi pero seria menos divertido)
void onWiFi(){ WiFi.mode(WIFI_STA); WiFiMulti.addAP(ssid, password); // Wait for connection while((WiFiMulti.run() != WL_CONNECTED)) { delay(500); } } void offWiFi(){ WiFi.disconnect(); WiFi.mode(WIFI_OFF); WiFi.forceSleepBegin(); }
Por lo que caundo se detecte movimiento habra que conectar el WiFi, enviarle mensaje y deconectarlo para volver a tener la alarma lista.
if(analogRead(A0) > 800){ Serial.println("Alarm!!!!!!"); onWiFi(); sendMsg(); offWiFi(); firstStart = true; }
firstStart es una variable booleana cuya funcion es dar tiempo «a correr» una vez conectada la alarma ya que si no saltaria al detectarte a ti mismo nada más activar la alarma. Tambien permite un tiempo de «descanso» tras el disparo de la alarma para evitar estar dando alarmas sin para y saturar el movil de notificaciones.
if(firstStart){ Serial.println("Time to hide"); delay(60000); Serial.println("Watching..."); firstStart = false; }
Vamos aver como es el codigo que envia la notificacion. He optado por usar el servicio de IFTTT para ello hay que crearse una cuenta alli y activar un webhook, luego se crea una regla que lance una notificacion en el movil. O si se prefiere cualquiera de la opciones que disponibles.
void sendMsg(){ http.begin("http://maker.ifttt.com/[tu codigo]/alarm/with/key/[pon aqui tu key]"); //HTTP int httpCode = http.GET(); if(httpCode > 0){ Serial.println("Alarm send"); } else { Serial.println("Error send alarm"); } delay(1000); }
Mientras el nodeMCU este transmitiendo el radar queda inutilizado.
El codigo completo es:
#include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h> #include <ESP8266HTTPClient.h> const char* ssid = "[tu ssid]"; const char* password = "[password]"; bool firstStart = true; unsigned long timeNewMeasure = 0; HTTPClient http; ESP8266WiFiMulti WiFiMulti; void setup(void){ Serial.begin(115200); offWiFi(); //timeNewMeasure = millis()+1000; } void offWiFi(){ WiFi.disconnect(); WiFi.mode(WIFI_OFF); WiFi.forceSleepBegin(); } void sendMsg(){ http.begin("http://maker.ifttt.com/[tu codigo]/alarm/with/key/[pon aqui tu key]"); //HTTP int httpCode = http.GET(); if(httpCode > 0){ Serial.println("Alarm send"); } else { Serial.println("Error send alarm"); } delay(1000); } void onWiFi(){ WiFi.mode(WIFI_STA); WiFiMulti.addAP(ssid, password); // Wait for connection while((WiFiMulti.run() != WL_CONNECTED)) { delay(500); } } void loop(void){ if(firstStart){ Serial.println("Time to hide"); delay(60000); Serial.println("Watching..."); firstStart = false; } if(millis() > timeNewMeasure){ timeNewMeasure = millis()+100; if(analogRead(A0) > 800){ Serial.println("Alarm!!!!!!"); onWiFi(); sendMsg(); offWiFi(); firstStart = true; } } }
Pingback: Guardar datos de nodeMCU (o arduino) en la nube usando IFTTT | Construyendo a Chispas