viernes, 31 de julio de 2015

Práctica de IoT (Internet of Things) con Arduino

Construimos en esta ocasión una pequeña aplicación de ejemplo de IoT que registrará las medidas de intensidad de luz de una fotocélula esto lo podremos visualizar en tiempo real  mediante gráficas.









 Para realizar esta practica necesitamos:
-1 placa arduino (he usado la Uno).
-1 fotocélula.
-1 resistencia 1k ohm.
-1 protoboard.
-1 cable usb.
-5 jumper macho.
 -Un ordenador (en esta práctica he usado una distro de Ubuntu).

     Para capturar la intensidad de la luz usamos Arduino y la fotocélula pero se necesita que las medidas obtenidas sean enviadas a una aplicación , esto se implantará usando node.js también para visualizar en tiempo real las medidas he usado un servicio en la nube llamado Plotly.

     Antes de nada hay que configurar la placa Arduino, sobre todo tener en cuenta el puerto serial COM3 además también configurar el IDE Arduino correctamente con tu modelo de placa.

    Conectamos los componentes en la protoboard, la fotocélula y una resistencia de 1k , hago las conexiones con jumpers entre la protoboard y  la placa Arduino de la siguiente manera:
  


 
      Abrimos IDE Arduino, copiamos el siguiente trozo de código y lo subimos a nuestra placa:

#define CDS_INPUT 0 

void setup() {
  Serial.begin(9600);
}

void loop() {

  int value = analogRead(CDS_INPUT);
  Serial.println(value);

  delay(1000);
}

      El código leerá la intensidad de luz cada segundo desde la fotocélula e imprime las medidas,
estás se pueden ver pinchando en  tools ---> serial monitor en el Ide de Arduino.

      Extendemos la práctica y le damos mas funcionalidad, ahora construyendo un servidor node.js, para ello necesitamos instalar una librería Node llamada serialport ,desde la terminal Linux Ubuntu escribe el siguiente comando:
                                     npm install serialport

      Creamos un archivo que lo llamamos server.js y copiamos el siguiente código, teniendo precaución en introducir el puerto de serie correcto
     
var serialport = require('serialport');
var portName = '/dev/tty.usbmodem1411';
var sp = new serialport.SerialPort(portName, {
    baudRate: 9600,
    dataBits: 8,
    parity: 'none',
    stopBits: 1,
    flowControl: false,
    parser: serialport.parsers.readline("\r\n")
});

sp.on('data', function(input) {
    console.log(input);
});

     Para ejecutar el servidor node.js desde la terminal situate en la carpeta donde tienes salvado el archivo antes creado server1.js y ejecutalo escribiendo: node server1.js , visualizarás las medidas que recoge la fotocélula  en la terminal.

    Ahora vamos a usar Plotly para visualizar estas medidas de manera gráfica , uso Plotly porque tiene una interesante APi streaming perfecta para usar en este ejemplo práctico.
    Para ello hay que registrarse en plot.ly y configurar 3 partes de información como es un nombre de usuario , API key  y   el APi de streaming , también se necesita instalar la librería plotly para node.js desde la terminal escribimos : npm install plotly          
   Creamos un nuevo archivo server2.js copiamos el siguiente código, teniendo cuidado en poner nuestro username y apis plotly correctamente además de el puerto correcto de Arduino :
                 
var serialport = require('serialport'),
    plotly = require('plotly')('Plotly_UserName','Plotly_API'),
    token = 'Plotly_Token';

var portName = '/dev/tty.usbmodem1411';
var sp = new serialport.SerialPort(portName,{
    baudRate: 9600,
    dataBits: 8,
    parity: 'none',
    stopBits: 1,
    flowControl: false,
    parser: serialport.parsers.readline("\r\n")
});

function getDateString() {
    var time = new Date().getTime();
    // para tu zona horaria solo multiplica +/-GMT by 36000000
    var datestr = new Date(time +32400000).toISOString()
    .replace(/T/, ' ').replace(/Z/, '');
    return datestr;
}

var initdata = [{x:[], y:[], stream:{token:token, maxpoints: 500}}];
var initlayout = {fileopt : "extend", filename : "sensor-test"};

plotly.plot(initdata, initlayout, function (err, msg) {
    if (err) return console.log(err)

    console.log(msg);
    var stream = plotly.stream(token, function (err, res) {
        console.log(err, res);
    });

    sp.on('data', function(input) {
        if(isNaN(input) || input > 1023) return;

    var streamObject = JSON.stringify({ x :getDateString(),y :input });
    console.log(streamObject);
    stream.write(streamObject+'\n');
    });
});
 
      Podemos ejecutar como hicimos anteriormente desde la terminal, en la consola web de Plotly se crea un archivo llamado sensor-test que si pulsamos sobre el, obtenemos una gráfica que nos va a mostrar en tiempo real todos los valores de intensidad de luz que está capturando la fotocélula.

Saludos. 





No hay comentarios:

Publicar un comentario