sábado, 14 de enero de 2017

Stream de datos con thinger.io

En el artículo Introducción a thinger.io se indica que es la propia plataforma thinger quien solicita los datos a periodos determinados a nuestro módulo ESP8266 (el módulo actúa en modo esclavo) pero también podemos hacer que sea nuestro módulo quien tenga el control en el envío de los datos a la plataforma para su almacenamiento o visualización.

La limitación que nos ofrece thinger.io, es que solo almacena datos en los data buckets en periodos superiores a 55 segundos si utilizamos este procedimiento. En el caso de que no almacenemos la información y queramos visualizarla en un dashboard la recepción es prácticamente instantánea.

En nuestro ejemplo vamos programar nuestro módulo para que envíe información a thinger.io cada 10 segundos ya que esta información no vamos a almacenarla, solo la mostraremos en el dashboard.

El esquema del circuito es el mismo que en ejemplos anteriores:


Para que sea el módulo quien controle el envío de información, los widget del dashboard se configuran con el modo de refresco en "Update by Device"

Por último, modificamos nuestro código para enviar la información cada 10 segundos.Esto se realiza utilizando stream()

void loop() {
  thing.handle();
  thing.stream(thing["sensores"]);
  delay(10000);
}


El código completo es el siguiente:

#include <ESP8266WiFi.h> // ESP8266
#include <ThingerESP8266.h> // thinger.io
#include "DHT.h" //Sensor DHT
#include <Wire.h> // I2C
#include <Adafruit_BMP085.h> // Sensor BMP180

// thinger.io
// Parámetros del dispositivo ESP8266
#define username "USERNAME"
#define deviceId "DEVICE_ID"
#define deviceCredential "DEVICE_CREDENTIAL"

// Parámetros de nuestra red wifi
#define wifi_ssid "SSID"
#define wifi_password "PASSWORD"

// Parámetros del sensor DHT11
#define dht_pin D7 // GPIO13
#define dht_type DHT22 // Seleccionamos el sensor
DHT dht(dht_pin, dht_type);

// Creamos una instancia de la clase Adafruit_BMP085
Adafruit_BMP085 bmp;

ThingerESP8266 thing(username, deviceId, deviceCredential);

void setup() {
  dht.begin(); //Inicializamos el sensor de temperatura
  Wire.pins(D2, D3);
  Wire.begin(D2, D3); //Inicializa I2C en NodeMCU
  bmp.begin(); // Inicializamos el BMP180

  thing.add_wifi(wifi_ssid, wifi_password);
  thing["sensores"] >> [](pson & out) {
    out["dht_humedad"] = dht.readHumidity();
    out["dht_temperatura"] = dht.readTemperature();
    out["bmp180_presion"] = bmp.readPressure();
    out["bmp180_temperatura"] = bmp.readTemperature();
    out["bmp180_altitud"] = bmp.readAltitude(101500);  
  };
}

void loop() {
  thing.handle();
  thing.stream(thing["sensores"]);
  delay(10000);
}

El resultado es el siguiente:


Que sea el propio módulo el que controle el envío de información puede ser interesante en proyectos donde, por ejemplo, solo se envíe información en el caso de que se supere cierto umbral en cualquiera de los parámetros medidos.

Fuente:
Enlaces:

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.