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.
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.
Related posts
16 Comments
Lascia un commento Annulla risposta
Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.
Articoli popolari
Sorry. No data so far.
.Net micro framework Arduino Arduino Webserver Domotica Flyport I2C IOT Netduino OpenPicus raspberry RTC Speed Test
ciao Marco,
il tuo articolo è molto interessante; potresti indicarmi in che modo far girare il file .php; o già installato xampp e crearo il databese e relativa tabella.
grazie
Ciao Mauro,
sotto la directory xampp, trovi una cartella htdocs. in questa cartella vanno copiati i file php. Crea prima una directory ad esempio ‘prova’ e qui copia il file index.php (otterrai quindi qualcosa del genere c:\xampp\htdocs\prova\index.php)
Ora per richiamare la pagina apri un browser e digita localhost/prova/index.php
a presto
Marco
grazie Marco,
ho seguito le tue indicazioni e il file .php “gira” ma ricevo il seguente errore:
“Impossibile selezionare il database.”
Confermo che esiste il db Arduino con la tabella tbl_temperature creata con il SQL della guida.
ciao
controlla il nome del database deve essere scritto allo stesso modo, nel file php, rispettando le maiuscole e le minuscole.
… il nome db era corretto ma dato che non avevo impostato la password ho erroneamente omesso anche l’utente root.
Ora funziona correttamente.
grazie e ciao
Mauro
perfetto,
buon lavoro
Marco
ciao,
durante i test manuali tutto funzionava nel senso che scrivendo manualmente nel browser la stringa veniva aggiunto il record nel db; ora che la stringa viene generata da arduino con il metodo GET non riesco a farlo funzionare; noto che nel tuo sketch il server ha un suo IP:
//indirizzo server web (locale)
IPAddress server(192, 168, 0, 140);
nel mio caso vorrei scrivere su localhost pertanto arduino si connette correttamente solo se imposto tale IP:
//indirizzo server web (locale)
IPAddress server(127, 0, 0, 1);
Pur essendo connesso non aggiunge la riga del db; ho provato a vreare un virtul host nel dile httpd.conf ma non c’è verso.
Non riesco a capire dove sto sbagliando
ciao
Mauro
Ciao prova a mettere come indirizzo ip del server quello del tuo pc (puoi ricavarlo tramite ipconfig). Inoltre assicurati che il tuo ip sia fisso e non assegnato via dhcp.
Se hai problemi mandami tutto il codice via mail
Marco
Grazie Marco, era proprio quello indicato da te il problema!!!!
Ora tutto funziona correttamente
grazie ancora
Mauro
Ciao,bel lavoro il tuo e ben spiegato. Ho verificato che viene correttamente costruito il data base in un server locale Xamp e viene correttamente aggiornato ad intervalli di tempo regolari.
Adesso però mi serve un’appicazione che vada a recuperare i dati e me li presenti in una tabella inserita in una pagina web. Pensavo inizialmente che il file index.php servisse a questo ma quando lo apro da browser non mi dà errori, segno che il file esiste nella cartella htdox, ma è vuoto.
Hai qualche consiglio?
Ciao
il file index.php contiene il codice php che recuperai parametri dall’url e salva i valori nel db. Per creare una tabella puoi usare un altro file php che recuperi i dati e li disponga in una tabella html.
Scrivimi una mail in privato cosi posso mandarti il codice
a presto
Marco
Ciao,se volessi usare un mio sito su server tipo aruba o simili cosa devo mettere su ip server?
grazie
devi mettere l’indirizzo il del dominio. per trovare l’ip del tuo dominio devi usare un servizio ti po questo http://www.hcidata.info/host2ip.htm oppure utilizzare il dns scivendo questa istruzione
char server[] = “www.miodominio.it”;
saluti
Marco
altra cosa il byte mac dove lo trovo?sulla scheda non e vi è etichetta.
grazie
.
il mac lo trovi stampato sulla sulla Arduino Ethernet oppure sulla Arduino Shield.
Bella guida,
ma se volessi inviare i dati ad uno script php in rete come potrei fare?
(utilizzo Intel Galileo)
Grazie
Saluti
Federico