IoT: d'Arduino al núvol passant per Processing

IoT: d’Arduino al núvol passant per Processing

Per treballar continguts relacionats amb les Smart Cities, Internet de les Coses i Big Data necessitem pujar al núvol les dades generades pels nostres sensors.
Al núvol hi ha molts serveis d’emmagatzematge de dades de sensors, el que m’ha semblat més adient per a nosaltres és dweet.io.

El problema és que l’Arduino UNO que nosaltres utilitzem no té capacitat de connexió a Internet per enviar aquestes dades, i els mòduls i shields WiFi amb els que podem connectar-lo impliquen una certa complexitat de programació.
Peró podem simplificar utilitzant Processing com a pont entre Arduino i el núvol: les dades generades pels sensors connectats a Arduino s’enviaran a Processing a través del port sèrie, i Processing definirà la connexió a Internet del PC per pujar aquestes dades:

IoT_esq


Allotjament de dades de sensors a dweet.io

dweet.io és un servei molt senzill que permet pujar al núvol dades de sensors i visualitzar-les en temps real. Podem utilitzar-lo de manera gratuïta i sense necessitat de registrar-nos. Això si, les dades només es guarden durant 24 hores.

* Creació de l’espai d’emmagatzematge: dweet.io/play
* L’únic paràmetre que he definit és el nom del meu dweet (sense espais).
* Definició de les dades a emmagatzemar: https://dweet.io/dweet/for/nom?variable=valor 
* nom del dweet creat (en el meu cas: ProbaCarol)
* variable: nom de la variable de la qual definim el valor
* En cas que vulguem definir el valor de dos variables:
* https://dweet.io/dweet/for/nom?variable1=valor1&variable2=valor2
* Visualització de les dades emmagatzemades: http://dweet.io/follow/nom

Enviament de dades a dweet.io amb Processing

Processing és un entorn de desenvolupament de codi obert molt relacionat amb Arduino, tant en aparença com en llenguatge.
La instrucció loadStrings(); si té com a paràmetre una URL, en executar-se connectarà amb el lloc web definit.
La URL en el nostre cas ha de ser https://dweet.io/dweet/for/nom?variable=valor
En el meu cas, el nom del dweet és ProbaCarol, a la variable dweet l’he anomenat sensor1, i he definit el valor com una variable a Processing que he anomenat dada:

Generació de dades amb Arduino i recepció amb Processing

Per fer la meva recerca he creat un sketch Arduino amb una variable que he anomenat lectura_sensor, la qual va incrementant el seu valor cada cert temps.
El valor de lectura_sensor és el que vull per la variable sensor1 a dweet.io. Per fer-ho, primer s’ha d’enviar a Processing a través del port sèrie.

Per tal que Processing pugui comunicar-se pel port sèrie cal inserir la llibreria processing.serial, definir el port de connexió amb Arduino, i enviar les dades rebudes per aquest port a l’espai creat a dweet.io. Veieu com ho he fet al vídeo:  

L’sketch Processing:

import processing.serial.*;  // llibreria per treballar amb ports sèrie
Serial myPort;  // creació d'objecte serial al que he anomenat myPort
String dada;  // variable per desar la dada rebuda pel port sèrie

void setup()
{
  println(Serial.list());  // llista tots els ports disponibles
  myPort = new Serial(this, Serial.list()[0], 9600); // configuració de l'objecte serial
}
void draw()
{
  while (myPort.available() > 0)  // mentre la connexió estigui oberta ...
  {
    dada = myPort.readStringUntil(10);  // dada = al que arrivi per port serie
    if (dada != null)  // si es reb una dada ...
    {
      print(dada);  // mostra el seu valor per la consola de l'IDE
      loadStrings ("https://dweet.io/dweet/for/ProbaCarol?sensor1="+dada);  //URL
      delay(100);  // interval d'actualització
    }
  }
}

Creació del panell de visualització amb Freeboard

Freeboard és un servei de visualització de dades connectat amb dweet.io, en el que podem crear un espai web amb un disseny personalitzat. Veieu al vídeo com he creat el meu:

Connexió Arduino – PC amb Bluetooth

La connexió física de la placa Arduino al PC a través del cable USB és engorrosa. Amb un mòdul bluetooth podem fer aquesta connexió sense fils. Aquest és el procés que he seguit:

Connexió del mòdul BT a la placa Arduino:
He utilitzat un mòdul HC-06. Per alliberar els pins 0 i 1 de la placa he utilitzat la llibreria SoftwareSerial, que permet definir un port sèrie entre dos pins qualsevol de la placa Arduino; he connectat el pin RXD del mòdul al pin 2 de la placa, i el pin TXD del mòdul al pin 3 de la placa.

ArduinoBT

Aparellament del mòdul BT al PC:
Des de l’administrador de bluetooth del PC he aparellat el mòdul (HC-06). El codi d’aparellament sol ser 1234.
Un cop aparellat l’he buscat a l’administrador de dispositius del PC, on he trobat el port COM que se li ha assignat (en el meu cas, COM4).

L’sketch Arduino:

#include <SoftwareSerial.h>
SoftwareSerial BT (3, 2);  // objecte serial al que he anomenat BT. 3: RX | 2: TX
int lectura_sensor = 0;    // dada a enviar a Processing per bluetooth

void setup()
{
  BT.begin(9600);         // inici de la comunicació sèrie
}
void loop()
{
  BT.println(lectura_sensor);  // enviament de la dada pel port sèrie definit
  lectura_sensor++;            // increment del valor de la dada
  delay(100);                  // interval d'actualització de la dada    
}

L’sketch Processing:
És el mateix que abans. L’única diferència és que ara es llisten dos ports sèrie, i el del bluetooth és el segón de la llista (posició [1] de l’array de ports llegits):

myPort = new Serial(this, Serial.list()[1], 9600);

App de consulta de les dades

He creat una aplicació amb App Inventor que, a través d’un component WebViewer, es connecta a una URL en iniciar-se. La URL és la del meu espai Freeboard de visualització de les dades allotjades a dweet.io, enviades amb Processing i generades pel meu Arduino.
Prova IoT superada!