viernes, 8 de septiembre de 2017

Conectar sensores meteorológicos de 433Mhz con Blynk vía ESP8266

La mayoría de estaciones meteorológicas inalámbricas  se comunican en la frecuencia e 433MHz. En China es fácil encontrar sensores baratos para estas estaciones. Para que un ESP8266 pueda recibir los datos de estos sensores basta con conectarle un receptor de 433MHz.





Software

Para programar el ESP8266 emplearé Arduino IDE y la librería ESPiLight, que se puede instalar desde el gestor de librerías de Arduino IDE. Aunque la librería use el formato JSON, no será necesario usar ninguna librería JSON.

Hardware

Vista frontal SRX882
Vista trasera SRX882
Como tarjeta ESP8266 yo he usado una Wemos D1 mini, naturalmente se pueden usar otras tarjetas.

Como sensor he usado uno comprado en Aliexpress por alrededor de 6€, incluyendo portes.
Sensor de 6€

Como receptor conviene comprar uno que sea superheterodino, para tener mejor calidad de recepción, además es recomendable que venga con una antena, para facilitarnos las cosas. He comprado, en Aliexpress también, un kit de receptor y transmisor (transmisor STX882 + receptor SRX882), junto con sus respectivas antenas por unos 2€, incluyendo portes. Solo hay que soldarles las antenas y unos pines.

Las conexiones se indican a continuación:

D1 mini SRX882
3V3VCC
GGND
D5DATA

D1 mini - SRX882
He alimentado al SRX822 a 3,3V, aunque habría sido posible hacerlo con 5V, admite una tensión en el rango de 2,4V a 5,5V.

Identificación del sensor

En primer lugar, es necesario tener instalada la librería ESPiLight, que como ya he dicho, se instala fácilmente desde el gestor de librerías de Arduino IDE.

En los ejemplos de la librería hay uno, llamado Receive, que nos mostrará todo lo que recibe. Solo tenemos que  modificar el valor de RECEIVER_PIN por el pin al que hemos conectado los datos del receptor, en mi caso ha sido D5.

Al ejecutar el sketch obtenemos la siguiente lectura por el puerto serie:


Al ampliar la imagen se puede ver que hay mucha basura, hemos de identificar los datos que sean coherentes con nuestro sensor. La siguiente linea es la que se corresponde con una emisión de nuestro sensor:

RF signal arrived [alecto_ws1700][11] (3){"id":11,"temperature":26.7,"humidity":70.0,"battery":1}

Sacamos dos datos importantes: el protocolo es el alecto_ws1700 y el identificador es el 11. El identificador varía cada vez que se reinicia el sensor, por lo menos en el que yo tengo.

Programación del ESP8266

Doy por hecho que ya se sabe programar un ESP8266 con Arduino IDE, si no fuera el caso se puede consultar mi articulo titulado 'Programar ESP8266 con Arduino IDE'.

Es necesario tener instaladas la librerías de Blynk, además de la de ESPiLight que ya tenemos instalada en el paso anterior.

El Sketch es el siguiente:

#define BLYNK_PRINT Serial 
#define RECEIVER_PIN D5
#define TRANSMITTER_PIN -1

#include <ESPiLight.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

const char auth[] = "tu_token_blynk";
const char* ssid = "tu_ssid";
const char* password = "tu_password";

ESPiLight rf(TRANSMITTER_PIN);

String getValue(String id, String message) {
  String value = "";
  int idIndex = message.indexOf('"' + id + '"' + ':');

  if (idIndex != -1) {
    int valueIndex = idIndex + id.length() + 3;
    value = message.substring(valueIndex, message.indexOf(",", valueIndex));  
  } 
  return value;
}

void rfCallback(const String &protocol, const String &message, int status, int repeats, const String &deviceID) {
  if (status == VALID && protocol.equals("alecto_ws1700")) {
    
    float t = getValue("temperature", message).toFloat();
    Blynk.virtualWrite(V0, t);
    Serial.println("Temperature: " + String(t, 1) + " °C");
    
    float h = getValue("humidity", message).toFloat();
    Serial.println("Humidity: " + String(h, 1) + " %");
    Blynk.virtualWrite(V1, h);
  }
   Serial.println("rfCallback ends");

}

void setup() {
  Serial.begin(115200);
  
  Blynk.begin(auth, ssid, password);
  
  rf.setCallback(rfCallback);
  rf.initReceiver(RECEIVER_PIN);
}

void loop() {
  rf.loop();
  Blynk.run();
}

El sketch hay que personalizarlo con el token de Blynk, así como con el identificador y password de la red Wifi.

Hay que notar que, para identificar el sensor, solo uso el protocolo . Si hay que leer los datos de varios sensores que usen el mismo protocolo habrá la dificultad de que el identificador va variando cada vez que reiniciemos el sensor, es decir, cada vez que le cambiemos las pilas.

Configuración de Blynk

No voy a extenderme sobre esto, porque no hay mucha complicación y ya trate sobre como configurar Blynk en otro artículo.

He usado Value Display para visualizar los valores de los pines virtuales V0 y V1 que es donde el sketch escribe los valores de temperatura y humedad respectivamente.



Resultado

El resultado es que desde cualquier lugar del mundo podemos ver en nuestro dispositivo móvil los valores de temperatura y humedad de nuestro sensor.



No hay comentarios:

Publicar un comentario