Introduzione.
Nel precedente articolo Arduino Due Development, è stata fatta un introduzione su questa scheda, eseguita la configurazione iniziale partendo dall’installazione delle librerie necessarie, per terminare con la configurazione della scheda Ethernet shield, con la quale la scheda Arduino Due potrà accedere a Internet. In questo secondo articolo, vedremo come Arduino può interagire con i servizi di Microsoft Azure, precisamente con i Mobile Service. Partiremo dalla creazione di un Mobile Service, continueremo costruendoci un piccolo circuito usando il sensore di temperatura e umidità DHT11, terminando con la parte di codice che si occuperà di trasferire le informazioni rilevate dal sensore su Microsoft Azure. Vedremo nell’ordine:
- Creazione di un Mobile Service.
- Montaggio del circuito elettronico.
- Scrittura del codice per l’upload dei dati dal sensore a Microsoft Azure.
- Test dell’applicazione.
- Conclusioni.
Creazione di un Mobile Service.
La creazione di un Mobile service è molto semplice, per prima cosa occorre avere un account Microsoft e una sottoscrizione ad Azure. Entrati nel portale, alla schermata iniziale premiamo il tasto New che troviamo in basso a sinistra come mostrato in figura.
-
Scheda Arduino Due
-
Scheda Ethernet shield
-
Sensore DHT11
-
BreadBoard (base per il collegamento del sensore)
-
Colmeter (cavi per il collegamento tra la scheda Arduino Due e il sensore DHT11)
-
Alimentatore per il collegamento della scheda Arduino due
-
Estraendo i file all’interno del file .zip e copiarli manualmente nella directory C:Program Files (x86)Arduinolibraries
-
Seguire la seguente procedura, Avviare l’ide di Arduino, dal menù Sketch andiamo a selezionare il comando Include Library e successivamente Add .ZIP Library… come mostrato in figura.
#include <SPI.h>
#include <Ethernet.h>
#include <dht11.h>
// Ethernet shield MAC address (sticker in the back)
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
/*You can find this values in your Mobile Service dashboard
server = namemobileservice.azure-mobile.net
table_name = nametable
ams_key = your keyvalue, find in home page mobile service, with a click on button MANAGE KEYS*/
const char* server = “sensorfarm.azure-mobile.net”;
const char* table_name = “tabsensor”;
const char* ams_key = “NyWPlQgRcUWHsrGwcwhHMRxVLtnItA64”;
EthernetClient client;
char buffer[64];
dht11 DHT;
#define DHT11_PIN 4
/*This method use Mobile service REST API fot to write value*/
void write_sensorvalue(double tempvalue, double humidityvalue)
{
if (client.connect(server, 80)) {
/*Table name in Mobile service*/
sprintf(buffer, “POST /tables/%s HTTP/1.1”, table_name);
client.println(buffer);
/*Sever name in Mobile Service*/
sprintf(buffer, “Host: %s”, server);
client.println(buffer);
/*Mobile Services application key*/
sprintf(buffer, “X-ZUMO-APPLICATION: %s”, ams_key);
client.println(buffer);
// JSON content type for the information
client.println(“Content-Type: application/json”);
/*Write values of temperature and humidity from DHT11 sensor*/
sprintf(buffer, “{“tempvalue”:”%f”,”humidityvalue”:”%f”}”, tempvalue, humidityvalue);
// Content length
client.print(“Content-Length: “);
client.println(strlen(buffer));
// End of headers
client.println();
// Request body
client.println(buffer);
}
else
{
Serial.println(“no connection available!”);
}
client.stop();
}
/*——————————————————-*/
/*Setup method*/
/*——————————————————-*/
void setup()
{
Serial.begin(9600);
if (Ethernet.begin(mac) == 0)
{
Serial.println(“ethernet shield failed”);
for (;;);
}
// Ethernet shield initialization:
delay(1000);
}
/*——————————————————-*/
/*Loop method*/
/*——————————————————-*/
void loop()
{
/*Read value from sensor input*/
int chk = DHT.read(DHT11_PIN);
/*Call method writ_sensorvalue and pass sensor parameter for to save on mobile service*/
write_sensorvalue((DHT.temperature), (DHT.humidity));
/*Time wait for new input data*/
delay(10000);
}
const char* server = “sensorfarm.azure-mobile.net”;
const char* table_name = “tabsensor”;
const char* ams_key = “reperibile da portale”;
char buffer[64];
dht11 DHT;
#define DHT11_PIN 4
/*Table name in Mobile service*/
sprintf(buffer, “POST /tables/%s HTTP/1.1”, table_name);
client.println(buffer);
/*Sever name in Mobile Service*/
sprintf(buffer, “Host: %s”, server);
client.println(buffer);
/*Mobile Services application key*/
sprintf(buffer, “X-ZUMO-APPLICATION: %s”, ams_key);
client.println(buffer);
// JSON content type for the information
client.println(“Content-Type: application/json”);
/*Write values of temperature and humidity from DHT11 sensor*/
sprintf(buffer, “{“tempvalue”:”%f”,”humidityvalue”:”%f”}”, tempvalue, humidityvalue);
Con il codice precedente, specifichiamo in che formato stiamo inviando i dati, quindi tipo JSON, e nell’ultima parte di codice specifichiamo il pattern, ovvero cosa ritroveremo nella tabella tabsensor quando andremo a verificare se i dati sono stati caricati correttamente. Il metodo Setup lo abbiamo già visto nel precedente articolo, mentre più interessante e il metodo Loop.
void loop()
{
/*Read value from sensor input*/
int chk = DHT.read(DHT11_PIN);
/*Call method writ_sensorvalue and pass sensor parameter for to save on mobile service*/
write_sensorvalue((DHT.temperature), (DHT.humidity));
/*Time wait for new input data*/
delay(10000);
}
Dichiariamo una variabile di tipo int, che non fa altro che leggere lo stato del sensore di temperatura e umidità, questo mediante il metodo read che come parametro richiede il pin di ingresso. Richiamiamo poi il metodo write_sensorvalue passando come parametri i valori di temperatura e umidità tramite DHT.temperature e DHT.humidity. L’ultima istruzione di codice non e altro che un tempo di attesa di dieci secondi prima di avviare una nuova lettura. Abbiamo così terminato la parte relativa al codice, siamo ora pronti per eseguire le prove di funzionalità, ma prima dobbiamo caricare lo sketch di codice sulla scheda Arduino Due, per questa procedura rimando al precedente articolo.
Test dell’applicazione.
Diamo un occhiata adesso all’interno della tabella tabsensor, è troveremo questa situazione.
Notiamo dall’immagine che i servizi di Azure anno aggiunto per noi i campi tempvalue e humidityvalue, con altri campi, id, timestamp e version questi ultimi non fanno parte del nostro codice ma vengono aggiunti automaticamente al momento in cui viene inserito un nuovo record nella tabella tabsensor, in altre parole non ci siamo dovuti preoccupare noi di questo, ci ha pensato Azure per noi.
Conclusione.
In questo secondo articolo, abbiamo visto come da Arduino e possibile interagire con Microsoft Azure e i Mobile Service, creando un semplice circuito dove leggiamo mediante sensore dht11 i valori di temperatura e umidità, per poi andare a salvare i dati all’interno della tabella tabsensor. Nel prossimo articolo, creeremo un applicazione Windows Phone 8.1 che farà in modo di visualizzare i dati ed intraprendere poi un azione da eseguire.