Introduzione all’internet delle cose con Arduino, PHP e Mysql

Il termine ‘internet delle cose‘ sta diventando sempre più popolare per due motivi fondamentali, il primo riguarda la grande diffusione dei dispositivi programmabili come Arduino e Netduino (senza tralasciare  il sistema OpenPicus e il RaspberryPI) con la loro relativa semplicità di utilizzo, mentre il secondo motivo è dovuto alla necessità di conoscere in tempo reale cosa questo dispositivo sta facendo e come sia possibile controllarne le funzionalità, anche a distanza.
Tutto questo è strettamente legato alla diffusione della rete 3G e degli smartphone che permettono di avere una connessione ad internet pressoché ovunque.

Questo scenario rende interessante lo sviluppo di nuove tipologie di applicazioni legate appunto al controllo e allo scambio dati tra dispositivi hardware collegati ad internet.

Esistono numerosi prototipi ma anche esempi reali che dimostrano come l’utilizzo di sistemi embedded+internet creino infrastrutture, anche complesse, controllabili. Il classico esempio riguarda la gestione del traffico che nelle nostre città viene gestito da semplici semafori che regolano il traffico in modo statico. Utilizzando dispositivi smart è possibile ottimizzare questo sistema migliorando la viabilità, evitando ingorghi e facendo risparmiare energia e carburante. Ma le applicazioni sono davvero notevoli e sono tutte orientate al risparmio energetico e al migliorare il nostro modo di vivere.

Di seguito sono elencate le categorie dove maggiormente verranno sviluppati dispositivi riconducibili all’internet delle cose

  • Domotica
  • Controllo inquinamento ambientale cittadino
  • Monitoraggio Ambientale
  • Energie rinnovabili, Smart Grid
  • Illuminazione pubblica intelligente
  • Sistemi per il rilevamento tempestivo degli incendi
  • Controllo delle acque, tra cui livello degli argini.
  • Controllo e gestione degli accessi con tecnologia RFID
  • Agricoltura, irrigazione intelligente.
  • Sorveglianza di pazienti e anziani in abitazioni isolate.
  • Miglioramento processi industriali, gestione magazzino.

Gartner ha identificato l’IOT come una delle 10 tecnologiche trainanti per il 2013.

Per quello che ci riguarda dobbiamo dotarci di un dispositivo capace di connettersi ad internet, nel mio caso utilizzerò l’Arduino Ethernet, di una connessione internet e di un server web capace di elaborare le richieste inviate dall’Arduino.

INTERNET DELLE COSE
Il progetto di questo tutorial permette di acquisire un segnale analogico, di inviarne il valore al server remoto che lo memorizzerà in una tabella del database MySql.
L’invio dei dati avviene tramite architettura REST. Praticamente i valori acquisiti da Arduino verranno inviati utilizzando l’URL.
Lato server, uno script PHP recupererà i valori dall’url e li memorizzerà sul database.

se non disponete di un server web remoto potete installarne uno nella vostra macchina locale utilizzando XAMPP. Il pacchetto installa automaticamente il server web Apache, l’interprete PHP ed il server MySql.

Iniziamo subito con il codice che ho caricato sull’Arduino:

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//indirizzo server web (locale)
IPAddress server(192, 168, 0, 140);

//indirizzo ip dell'Arduino
IPAddress ip(192, 168, 0, 200);

EthernetClient client;

String strURL = "";
float temp = 0;

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

if (Ethernet.begin(mac) == 0)
{
Serial.println("Configurazione DHCP fallita!");
Ethernet.begin(mac, ip);
}

delay(1000);

}

void loop()
{
UpdateTemp();

while(client.available())
{
char c = client.read();
Serial.print(c);
}

if (!client.connected())
{
Serial.println();
Serial.println("Disconnesso.");
client.stop();
}

//esegui la richiesta ogni 10 secondi
delay(10000);
}

void UpdateTemp()
{
Serial.println("Connessione...");

if (client.connect(server, 80))
{
Serial.println("Connesso");
//acquisisco il valore analogico dal sensore MCP9700
//vedi questo articolo
//logicaprogrammabile.it/mcp9700a-netduino-sensore-temperatura-analogico
temp = analogRead(0);

//creo l'url utilizzanso una stringa
strURL = "GET /arduino/index.php?valore=";
strURL += (int)temp;
strURL += "&localita=Sardegna HTTP/1.1";

//invio la richiesta al server
client.println(strURL);
client.println("Host: localhost");
client.println("Connection: close");
client.println();
//chiudo la connessione
client.stop();
}
else
{
Serial.println("Errore Connessione");
}
}

 

Il codice esegue una connessione al server locale e, dopo aver acquisito il segnale proveniente dal sensore analogico, costruisce l’indirizzo URL inserendo due parametri, il valore analogico acquisito e la località:

/arduino/index.php?valore=120&localita=Sardegna

La pagina index.php ha il compito di recuperare i parametri e di caricarli sul database. Questo è il codice PHP:

<?php
//controllo se sono presenti i parametri valore e localita
if(isset($_GET['valore']) && isset($_GET['localita']))
{
//Recupero il valore del parametro "valore"
$valore = $_GET['valore'];

//Recupero il valore del parametro "localita"
$localita = $_GET['localita'];

//eseguo la connessione al database sul server locale
//inserendo nome utente e password
$link = mysql_connect('localhost', 'root', 'root');

//gestione degli errori
if (!$link) {die('Impossibile connettersi: ' . mysql_error());}

//seleziono il databse di nome arduino
mysql_select_db("arduino") or die( "Impossibile selezionare il database.");

//creo una stringa sql di inserimento con i valori
//recuperati dall'url
$sql = "INSERT INTO `arduino`.`tbl_temperature`
(
`ID` ,
`Tempo_Server` ,
`Tempo_Locale` ,
`Valore` ,
`Localita`
)
VALUES
(
NULL , CURRENT_TIMESTAMP , NULL , '" . $valore . "', '" . $localita . "'
);";

//eseguo la query
$retval = mysql_query( $sql, $link );

//gestione degli errori
if(! $retval ){die('Impossibile eseguire la query: ' . mysql_error());}

//chiudo la connessione al db
mysql_close($link);
}
?>

Tramite phpMyAdmin ho creato un database di nome Arduino e una tabella di nome tbl_Temperature. Il codice sql per creare la tabella è il seguente:

CREATE TABLE `tbl_temperature` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Tempo_Server` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`Tempo_Locale` datetime DEFAULT NULL,
`Valore` int(11) NOT NULL,
`Localita` varchar(50) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

Utilizzando Arduino, PHP e Mysql siamo riusciti a realizzare un piccolo sistema IOT. Certamente bisogna imparare ad utilizzare anche le tecnologie lato server per far interagire Arduino, ma con un po di impegno è possibile realizzare applicazione molto interessanti.

In questo tutorial non ho approfondito l’installazione e la configurazione di XAMPP, ne l’uso di PHP e MySql perché sarebbe stato necessario un tutorial dedicato, molto più lungo e forse dispersivo.