viernes, 13 de abril de 2018

Thinger.io, el Internet de las cosas (IoT) (III)

Continuamos con nuestra serie sobre Thinger.io y el "Internet de las Cosas" (IoT).
Pero hoy cambiamos de tema, hoy toca analizar el desarrollo del Sketch para el control de los sensores.

Arduino, es un proyecto "open source" tanto de hardware (placas de desarrollo) y software, dispone de una gran comunidad, tanto oficial, como de usuarios que comparten sus creaciones y conocimientos.
y vamos a empezar por un "Sketch" de un nivel, digamos que medio, vamos a usar una placa Arduino Uno junto con una "Shield" Ethernet, con ello vamos a conectar una variedad de sensores y vamos a publicar sus valores en la plataforma de "IoT"(Internet de las cosas) Thinger.io.

¿Que vamos a utilizar? esta es la lista de componentes, creo que todos se puede encontrar fácilmente.
  • Arduino Uno (o compatible)
  • Ethernet Shield (Mochila que se conecta a la placa arduino y nos provee de conexión a Internet mediante RJ-45)
  • Sensores de temperatura DS18B20 (he usado 5)
  • Sensor de luz (LDR)
  • Sensor DHT 22 (temperatura y humedad)
  • Led
  • Led RGB
  • Resistencias
    • 1.- 4,7K ohm
    • 2.- 10Kohm
    • 4.- 220 ohm
  • Cables de conexión Macho/macho
con estas sensores pretendo mostrar los diferentes funcionamientos de cada uno de ellos, por supuesto que podemos simplificar y no utilizar algunos en los diferentes montajes que se hagan.

Vamos a ver el esquema de conexiones:


detalles:
- los 5 sensores DS18B20, tiene 3 pines, usaremos GND, 5v y como se puede observar, el tercer pin de cada sensor se conecta en serie, pudiendo leer varios sensores en una sola entrada, para ello se utiliza un protocolo de comunicación llamado "1-Wire".
- El sensor DHT-22 nos facilita la lectura de temperatura y humedad.
- El sensor LDR básicamente es una resistencia que se ve afectada por la luz que incide en ella.
- Led es un diodo emisor de luz.
- Led RGB es un Led "especial", emite, dependiendo de donde intervenimos, diferente color de luz (Rojo, Verde, Azul) para ello tiene un pin asociado a cada color y el pin correspondiente a GND.

El código:
 Vamos por partes.

En esta primera parte lo que hacemos es llamar a las librerías necesarias para conectar Ethernet y Thinger.io

#include <SPI.h>
#include <Ethernet.h>
#include <ThingerEthernet.h>

En esta otra llamamos las librerias para el funcionamiento de los sensores DS18b20

#include <OneWire.h>
#include <DallasTemperature.h>


En el siguiente apartado, llamamos las librerías para el sensor DHT 22

#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

Ahora lo que hacemos es conectar con Thinger.io mediante Usuario, dispositivo y credencial, las tres las hemos obtenido al dar de alta el dispositivo.

// Parametros conexion Thinger.io
#define USERNAME "TU_USUARIO"
#define DEVICE_ID "TU_DISPOSITIVO"
#define DEVICE_CREDENTIAL "TU_CREDENCIAL"

Hasta aquí los parámetros necesarios para Thinger.io, a continuación vamos a definir los parámetros necesarios para los sensores.
Caso especial es el de los sensores DS18B20, siendo 5 sensores, se conectan en un solo pin, gracias al protocolo 1-Wire y la librería especifica, se consigue que cada sensor transmita sus valores.

int Led = 8; //inizializamos pin LED

//Inicializamos pines para RGB
int Rojo = 6; //Pin Led Rojo
int Verde = 5; //Pin Led Verde
int Azul = 3; //Pin Led Azul

#define DHTPIN 2     // Definimos pin para DHT
#define DHTTYPE DHT22   // definimos tipo DHT22
DHT dht(DHTPIN, DHTTYPE); //// Inicializamos sensor
ThingerEthernet thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL); // Realizamos conexion con parametros a Thinger.io

// definimos sensores DS18B20

#define Pin 9 //Se declara el pin donde se conectará la DATA

OneWire ourWire(Pin); //Se establece el pin declarado como bus para la comunicación OneWire

DallasTemperature sensorDS18B20(&ourWire); //Se instancia la librería DallasTemperature

void setup() {
  pinMode(Led, OUTPUT); // Pin LED en salida

  // pines RGB en salida
  pinMode (Rojo, OUTPUT);
  pinMode (Verde, OUTPUT);
  pinMode (Azul, OUTPUT);

  sensorDS18B20.begin(); //Se inician los sensores

A continuación comenzamos con la transmisión de datos, para los DS18b20.
La función "thing" define el recurso, ">>" define que es un recurso de salida "(pson & out)" el tipo de variable y a continuación hacemos la llamada de los dispositivos en Thinger y el valor obtenido de la lectura de los cinco sensores.
 


  //realizamos llamada de datos DS18B20 y enviamos a Thnger.io
  thing["temperatura"] >> [](pson & out) {
    sensorDS18B20.requestTemperatures(); // Obtenemos valores
    out["Sensor 0"]  = sensorDS18B20.getTempCByIndex(0); // Enviamos valor Sensor 0
    out["Sensor 1"]  = sensorDS18B20.getTempCByIndex(1); // Enviamos valor Sensor 1
    out["Sensor 2"]  = sensorDS18B20.getTempCByIndex(2); // Enviamos valor Sensor 2
    out["Sensor 3"]  = sensorDS18B20.getTempCByIndex(3); // Enviamos valor Sensor 3
    out["Sensor 4"]  = sensorDS18B20.getTempCByIndex(4); // Enviamos valor Sensor 4
  };

De manera parecida, realizamos la lectura del sensor DHT
Definimos el recurso "dht22" y los valores que obtenemos de el.

  //realizamos llamada de datos DHT 22 y enviamos a Thinger.io
  thing["dht22"] >> [](pson & out) {
    out["Humedad"] = dht.readHumidity();
    out["Temperatura"] = dht.readTemperature();
  };

Para el sensor de luz (LDR) realizamos la misma llamada, únicamente, como diferencia con los anteriores sensores, al ser este un sensor analógico y sus valores comprendidos entre 0 y 1023, el valor que se pasa a Thinger es  mediante la función "map" con la que correspondemos con valores entre 0 y 100, así los llevamos a porcentaje.
Comentar también que al ser una resistencia, su funcionamiento es a mas luz menor valor entregado con lo que la correspondencia es de 0 -> 100 y 1023-> 0.

  //realizamos llamada de datos LDR y enviamos a Thnger.io
  thing["LDR"] >> [](pson & out) {
    out["Luz"] = map (analogRead(A0), 0, 1023, 100, 0); //obtenemos valor y mapeamos para ir en %
  };

Con el LED y el RGB, muy parecido, unicamente, mediante "<<" definimos que son de entrada y, en el caso del LED hacemos una llamada de datos sencilla.
En el caso del RGB definimos el tipo de variable (pson & in) para indicar que el valor es de entrada.
 // recibimos parametro para LED
  thing["Led"] << digitalPin(Led);

  // Recibimos parametros para RGB
  thing["Led_RGB"] << [](pson & in) {
    analogWrite (Rojo, in["Rojo"]);
    analogWrite (Verde, in["Verde"]);
    analogWrite (Azul, in["Azul"]);
  };

Hasta aquí el Sketch, hemos realizado un ejemplo sencillo, solo queda por comentar que todos estos parámetros se definen en el "void setup", como podéis observar, el "void loop" esta prácticamente vacío, salvo una linea que hace la llamada a "thing.handle", mas adelante avanzaremos en esta función.

void loop() {

  // more details at http://docs.thinger.io/arduino/
  thing.handle();
}

En la próxima entrada avanzaremos con la configuración de nuestros datos en Thinger.io mediante los tableros de datos, pero esto sera en:

Thinger.io, el Internet de las cosas (IoT) (IV)

 A continuación, os dejo el Sketch completo:

// Librerias generales Ethernet, Thinger.io y SPI
#include <SPI.h>
#include <Ethernet.h>
#include <ThingerEthernet.h>

//Librerías para sensor DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>

//Librerias para DHT
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

// Parametros conexion Thinger.io
#define USERNAME "TU_USUARIO"
#define DEVICE_ID "TU_DISPOSITIVO"
#define DEVICE_CREDENTIAL "TU_CREDENCIAL"
int Led = 8; //inizializamos pin LED //Inicializamos pines para RGB int Rojo = 6; //Pin Led Rojo int Verde = 5; //Pin Led Verde int Azul = 3; //Pin Led Azul #define DHTPIN 2     // Definimos pin para DHT #define DHTTYPE DHT22   // definimos tipo DHT22 DHT dht(DHTPIN, DHTTYPE); //// Inicializamos sensor ThingerEthernet thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL); // Realizamos conexion con parametros a Thinger.io // definimos sensores DS18B20 #define Pin 9 //Se declara el pin donde se conectará la DATA OneWire ourWire(Pin); //Se establece el pin declarado como bus para la comunicación OneWire DallasTemperature sensorDS18B20(&ourWire); //Se instancia la librería DallasTemperature void setup() {  pinMode(Led, OUTPUT); // Pin LED en salida  // pines RGB en salida  pinMode (Rojo, OUTPUT);  pinMode (Verde, OUTPUT);  pinMode (Azul, OUTPUT);  sensorDS18B20.begin(); //Se inician los sensores  //realizamos llamada de datos DS18B20 y enviamos a Thnger.io  thing["temperatura"] >> [](pson & out) {    sensorDS18B20.requestTemperatures(); // Obtenemos valores    out["Sensor 0"]  = sensorDS18B20.getTempCByIndex(0); // Enviamos valor Sensor 0    out["Sensor 1"]  = sensorDS18B20.getTempCByIndex(1); // Enviamos valor Sensor 1    out["Sensor 2"]  = sensorDS18B20.getTempCByIndex(2); // Enviamos valor Sensor 2    out["Sensor 3"]  = sensorDS18B20.getTempCByIndex(3); // Enviamos valor Sensor 3    out["Sensor 4"]  = sensorDS18B20.getTempCByIndex(4); // Enviamos valor Sensor 4  };  //realizamos llamada de datos DHT 22 y enviamos a Thnger.io  thing["dht22"] >> [](pson & out) {    out["Humedad"] = dht.readHumidity();    out["Temperatura"] = dht.readTemperature();  };  //realizamos llamada de datos LDR y enviamos a Thnger.io  thing["LDR"] >> [](pson & out) {    out["Luz"] = map (analogRead(A0), 0, 1023, 100, 0); //obtenemos valor y mapeamos para ir en %  };  // recibimos parametro para LED  thing["Led"] << digitalPin(Led);  // Recibimos parametros para RGB  thing["Led_RGB"] << [](pson & in) {    analogWrite (Rojo, in["Rojo"]);    analogWrite (Verde, in["Verde"]);    analogWrite (Azul, in["Azul"]);  }; } void loop() {  // more details at http://docs.thinger.io/arduino/  thing.handle(); }

No hay comentarios:

Publicar un comentario