Marco Pucci

personal website

Tutorial Arduino #10: download dati RSS da internet

Tutorial #10 – Internet e i Feed Rss

materiale utilizzato – Arduino Ethernet o Arduino UNO con Ethernet shield o Arduino UNO con Wifi shield.

 

Per vedere tutti i tutorial: www.marcopucci.it/arduino/

images (1)
Segui la pagina Tutorial Arduino su Facebook

 

 

In questo tutorial vediamo come scaricare dati da un sito internet tramite il servizio Feed Rss. Cos’è un rss? Si tratta di un formato per la distribuzione di contenuti web grazie al quale è possibile catturare contenuti da siti diversi e visualizzarli all’interno del nostro sito.
Ad esempio Google rilascia le proprie news in formato rss. Se vogliamo, possiamo visualizzare queste news all’interno del nostro blog inserendo un codice che si collega con il sito di Google.
A differenza del tutorial “Xively” (clicca qui per leggerlo), dove uplodiamo con Arduino un dato su un sito di appoggio e lo downlodiamo con un altro Arduino, in questo prendiamo dei dati da altri siti che forniscono informazioni relative a meteo, politica, news, ecc… Nei prossimi tutorial vedremo come analizzare questi dati. Per ora studiamo il modo di scaricare queste informazioni da tre siti diversi: Google News, Corriere della Sera e wunderground.com.

Come colleghiamo Arduino alla rete? Per procedere con questo tutorial dobbiamo acquistare dei componenti aggiuntivi denominati SHIELD che si collegano direttamente alla nostra scheda Arduino aumentandone le funzioni. Qui sotto alcune soluzioni acquistabili online:

 

ethshield

Ethernet Shield

Si posiziona sopra il nostro Arduino e permette il collegamento alla rete grazie a un cavo Lan.
Prezzo indicativo: 33 euro Acquistabile su: arduino store – robot-italy – futurashop – arduiner

 

 

 

 

wifiWiFi Shield

Si posiziona sopra il nostro Arduino e permette il collegamento alla rete grazie alla connessione
WiFi. Prezzo indicativo: 60 euro Acquistabile su: arduino store – robot-italy – futurashop – arduiner

 

 

 

ARDUIN~3

Arduino Ethernet + USB

Questa soluzione non è una shield ma un vero e proprio Arduino UNO con la connessione LAN.
Per programmarlo dobbiamo acquistare anche il Convertitore USB.
Prezzo indicativo: 33 euro + 12 euro (covertitore USB)
Acquistabile su: arduino store – robot-italy – futurashop – arduiner

 

 

 

La scelta dell’hardware da acquistare dipende soprattutto dal tipo di connessione che abbiamo a disposizione o dall’utilizzo che dobbiamo farne. Se ad esempio il nostro progetto è studiato per stare all’esterno, dobbiamo prendere una WiFi shield, se siamo in casa  in un luogo con connessione via cavo possiamo decidere di acquistare la shield ethernet (se già abbiamo Ardunio UNO) altrimenti possiamo acquistare Arduino Ethernet. In questo ultimo caso ricordiamoci di comprare anche il convertitore USB, altrimenti non possiamo programmarlo. In fondo a questo tutorial spiego come programmare la scheda Arduino Ethernet senza il convertitore USB ma con un Ardunio UNO di appoggio.

 

Google News – https://news.google.it/

 

Iniziamo a prelevare dati da Google News.
I tre codici che analizziamo ora si collegano a tre siti diversi scaricando il file xml delle news eseguono una ricerca all’interno di questo file e lo stampano sul Serial Monitor di Arduino.
È possibile che alcuni dei siti che vediamo in questo tutorial, tra qualche mese non siano più attivi. È già capitato che il meteo di Google e di Yahoo da un giorno all’altro abbiano interrotto il servizio rss mettendo in difficoltà tutte le applicazioni che prendevano dati da questi siti.
I codici che vediamo nei tre esempi sono comunque applicabili a tutti i siti che rilasciano informazioni RSS in formato xml.
rssPer trovare una pagina web che rilascia informazioni tramite RSS dobbiamo cercare l’icona qui a fianco, solitamente molto comune in quasi tutti i portali di informazione.
A questo punto dobbiamo trovare la pagina xml relativa alle news di Google: nel motore di ricerca inseriamo “google news rss feed xml”; l’indirizzo web trovato è questo qui: “https://news.google.it/?output=rss”.

 

Qui sotto la pagina di Google News e a fianco la stessa pagina in formato xml.

google_rss

ATTENZIONE: QUESTO CODICE VIENE VISUALIZZATO SOLAMENTE SE APRIAMO LA PAGINA CON GOOGLE CHROME – clicca qui per scaricarlo oppure guarda il prossimo esercizio dove effettueremo la stessa operazione con EXPLORER e FIREFOX.

 

Anche se non siamo esperti di linguaggio xml possiamo vedere che all’interno del codice è presente una scritta <title> seguita dal testo relativo alla prima news, esempio: “Italia, economia torna a debole crescita in quarto trimestre 2013 – Reuters Italia”.
Subito dopo abbiamo diversi campi come <link>, dove è inserito il link a cui si collega la news, e <description>, che contiene tutto il contenuto della news. Questi campi si ripetono per tutta la lunghezza del file xml.
Lo scopo è quello di collegarsi con Arduino a questa pagina xml, cercare all’interno di questa il campo “title” e stampare sul Monitor Seriale di Arduino tutti i titoli delle news presenti sul sito di Google.

 

Elettronica – Per questo progetto non dobbiamo costruire nessun circuito, colleghiamo la nostra shield sopra Arduino e colleghiamo il cavo LAN (nel caso di shield wireless dobbiamo segnarci il nome della rete e la password).

 

 Informatica

libraries_arduinoScarichiamo le tre librerie Ethernet, Wifi e TextFinder per connettere Arduino a Internet ed eseguire ricerche all’interno del file xml – clicca qui.

Estrai le cartelle e copiale all’interno della cartella “libraries” di Arduino (se non la trovi esegui una ricerca all’interno del computer).
Riavvia il software di Arduino.
A fianco l’immagine di come appare la mia cartella “libraries” con le varie librerie.

 

 

 

 

 

 

 

 Informatica Ethernet

Analizziamo di seguito il codice relativo alla Shield Ethernet o ad Arduino Ethernet. Il codice rigurdante la WiFi Shield verrà analizzato in fondo al tutorial.
Prima di aprire il software di Arduino dobbiamo cercare l’indirizzo IP del nostro computer.
Possiamo farlo in questo modo: click su Start / Accessori / Prompt dei comandi. Se avete un mac o un pc con Window 8 fate una ricerca su Google su come trovare il vostro indirizzo IP.
Quando il Prompt dei Comandi si apre scriviamo: ipconfig e premiamo INVIO.
Il numero che stiamo cercando è indicato dopo la scritta IP ed è simile a questo: 10.0.4.222
Nota bene: non utilizzate il mio altrimenti non funziona.

 

Clicca qui per scaricare lo sketch di Arduino.
Una volta scaricato inserite il vostro indirizzo IP nel codice IPAddress ip, senza punti tra un numero e l’altro ma con le virgole, e uplodate. Se tutto è andato bene aprendo il Serial Monitor e apparirà la scritta “news oggi: Prima pagina – Google News”.
Qui sotto una breve descrizione del codice che verrà implementato un pò alla volta fino ad arrivare alla visualizzazione di tutte le news del giorno.

 

#include <SPI.h>
#include <Ethernet.h>
#include <TextFinder.h>
Includiamo le tre librerie SPI, Ethernet e TextFinder.

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
Inseriamo il MacAddress della scheda Ethernet (adesivo sotto la scheda) se lo avete perso inserite questo generico dell’esempio.

IPAddress server(173,194,40,24);

IPAddress server è l’indirizzo ip del sito googlenews. In fondo le istruzioni per trovare l’indirizzo Ip di un sito.

IPAddress ip(10,0,4,222);
IPAddress Ip è il nostro indirizzo IP, quello che abbiamo cercato nel Prompt dei Comandi.

//byte gateway[]={192,168,0,1};
gateway (se la connessione è normale lasciare commentato) da aggiungere se la connessione avviene tramite router o gateway (per trovare il numero di gateway cercarlo sotto l’indirizzo IP precedentemente trovato)

EthernetClient client;
client – variabile per connettersi

TextFinder finder(client);

finder(client) – variabile per eseguire la ricerca
String responseString;

boolean startCapture;
la variabile startCapture verifica se la connessione è avvenuta (boolean vuol dire che il suo valore può essere VERO o FALSO)

char buffer_news[300];
buffer_news è la variabile dove inseriamo il testo del titolo della news catturata, 300 è il numero di caratteri che possiamo ricevere all’interno della variabile (modificabile a vostro piacimento)

void setup() {
Serial.begin(9600);
// start the Ethernet connection:
if (Ethernet.begin(mac) == 0)
{
Serial.println(“Failed to configure Ethernet using DHCP”);
Ethernet.begin(mac,ip);
Se come descritto prima stiamo utilizzando il gateway, questa linea di codice diventa Ethernet.begin(mac,ip,gateway);

}
delay(500);
if (client.connect(server, 80)) {
Serial.println(“Connected!”);

Controlli per verificare se la connessione è avvenuta
Attiva la Ethernet utilizzando l’indirizzo mac e IP
Nella variabile “richiesta” assegno l’indirizzo del file xml di Google preceduto dal comando GET

String richiesta = “GET http://news.google.it/?output=rss”;
Effettuiamo una richiesta alla pagina web

String chiusura_connessione = “Connection: close”;
client.println(richiesta);
client.println(chiusura_connessione);
client.println();
responseString = “”;
startCapture = false;
}
else
{
Serial.println(“Connection failed!”);
}
}

void loop()

{
if (client.available())
Se ci sono byte in entrata a disposizione dal server allora iniziamo ad inserirli nel buffer.

{
char c = client.read();
if(c == ‘{‘)
startCapture=true;
if(startCapture)
responseString += c;
}
if (client.connected())
Se la connessione è avvenuta iniziamo ad eseguire la ricerca della news. Questa è la fase più importante del tutorial perchè vi permette di individuare qualsiasi dato all’interno di un file xml.

{
Serial.println(“news oggi: “);
Stampiamo sul Serial Monitor la scritta “news oggi:”

finder.find(“title”);
Cerchiamo all’interno del file xml la scritta “title”

finder.getString(“>”,”<”,buffer_news, sizeof(buffer_news));

Con il comando finder.getString eseguiamo la seguente operazione: “>”,”<” vuol dire prendiamo tutto il testo presente tra il simbolo > e < (sotto lo schema grafico per capire meglio questa operazione), buffer_news vuol dire che tutti i caratteri trovati devono finire nella variabile buffer_news, sizeof(buffer_news) riempie la variabile finché non arriva alla sua fine (in questo caso 300 caratteri).
char *news =buffer_news;
Con questo comando *news importo dentro la variabile news tutta la serie di caratteri presenti nella variabile buffer_news

Serial.println(news);
Stampiamo sul Serial Monitor il valore della variabile news

client.stop();
client.flush();
}
}

 

 println_arduino_news  

 

Sopra la schermata che ci appare se, dopo aver uplodato il codice, apriamo il Serial Monitor.

google_rss_2

A lato possiamo vedere cosa è successo durante le fasi di ricerca e stampa della news.

Con il comando finder.find(“title”); abbiamo cercato la parola title all’interno dell’xml. La prima che appare partendo dall’alto verso il basso del testo è quella evidenziata nell’immagine sopra.

 

 

 

 

Con il secondo comando finder.getString(“>”,”<”,buffer_news, sizeof(buffer_news)); gli abbiamo detto di prendere tutti i caratteri presenti all’interno dei due simboli > e <. In questo caso sono stati prelevati i caratteri relativi alla frase “Prima pagina – Google News”.

google_rss_3

 

 

 

 

 

 

 

google_rss_4
Abbiamo visto fino ad ora come trovare e catturare il titolo della pagina news di Google. Vediamo ora come trovare i titoli delle news successive.

Dato che la parola chiave per la ricerca è sempre la stessa, “title”, cerchiamo qualche altra parola chiave che può indicarci solamente le altre news.

 

Qui appare un’altra volta la parola “title” però prima è preceduta dalla parola “item”.
Come possiamo vedere anche le news successive hanno in comune la scritta <item> seguita da <title>.
Per trovare i titoli delle altre news dobbiamo solamente fare una doppia verifica sulle due parole chiave.

 

 

 

Proviamo a sostituire la nuova parte di codice qui sotto relativa alla ricerca e alla stampa delle news, con quella precedente.

Serial.println(“news oggi: “);

finder.find(“item”);
finder.find(“title”);
finder.getString(“>”,”<”,buffer_news, sizeof(buffer_news));
char *news =buffer_news;
Serial.println(news);

L’unica modifica è questo comando qui: finder.find(“item”)

Gli stiamo dicendo di cercare nel file xml la parola “item”, poi la parola “title” e a quel punto di stampare tutto quello appare tra i caratteri “>” e “<”.
In questo modo verrà visualizzato solamente il titolo della prima news (non più il titolo della pagina Google News).

google_rss_5

 

 

Completiamo questo primo esercizio facendo visualizzare le prime 4 news di Google.
Per compiere questa operazione dobbiamo utilizzare un CICLO. In informatica esistono moltissimi modi per realizzare un ciclo di operazioni senza doverle riscriverle ripetutamente.
Qui sotto sono presenti due codici che eseguono la stessa identica operazione: stampare sul monitor seriale di Arduino le prime 4 news. La differenza è che nel codice di sinistra non è presente nessun ciclo. Le operazioni sono ripetute per 4 volte. Nel codice di destra invece il ciclo FOR ci permette con poche righe di codice di arrivare allo stesso identico risultato.

Serial.println(“news oggi: “);
finder.find(“item”);
finder.find(“title”);
finder.getString(“>”,”<”,buffer_news, sizeof(buffer_news));
char *news =buffer_news;
Serial.println(news); Serial.println(“news oggi: “);
finder.find(“item”);
finder.find(“title”);
finder.getString(“>”,”<”,buffer_news, sizeof(buffer_news));
char *news2 =buffer_news;
Serial.println(news2);
Serial.println(“news oggi: “);
finder.find(“item”);
finder.find(“title”);
finder.getString(“>”,”<”,buffer_news, sizeof(buffer_news));
char *news3 =buffer_news;
Serial.println(news3);
Serial.println(“news oggi: “);
finder.find(“item”);
finder.find(“title”);
finder.getString(“>”,”<”,buffer_news, sizeof(buffer_news));
char *news4 =buffer_news;
Serial.println(news4);                                              
for (int i=0; i<4; i++){
Serial.println(“news oggi: “);
finder.find(“item”);
finder.find(“title”);
finder.getString(“>”,”<”,buffer_news, sizeof(buffer_news));
char *news =buffer_news;
Serial.println(news);
}

 

Come possiamo vedere grazie al ciclo FOR scriviamo meno codice. Come funziona?
Questo è la sintassi giusta per il ciclo FOR:
for (int i=0; i<4; i++) {

 

}
Ogni volta che il ciclo inizia vengono svolte tutte le operazioni in esso contenute (tra le due parentesi graffe). Ogni volta che il ciclo riparte, un contatore segna le volte che le operazioni sono state compiute. Quando questo contatore raggiunge un valore che abbiamo impostato, il ciclo si ferma e Arduino può continuare le operazioni fuori dal ciclo.
In questo caso il contatore è una variabile intera chiamata “i”. Con il comando int i=0; impostiamo la variabile a 0. i<4; il ciclo continua finchè il contatore “i” è minore di 4, i++ incrementa il contatore “i” ad ogni passaggio. All’inizio è uguale a 0, appena svolte tutte le operazioni viene incrementato di 1. Al secondo passaggio “i” sarà uguale a 2…fino ad arrivare a 4 dove esce dal ciclo.

 

Uplodiamo il nuovo codice e apriamo il Serial Monitor. Qui sotto la schermata con le prime 4 news di Google.

google_rss_7

Prima di continuare vediamo una parte di codice che non abbiamo approfondito.
Nella parte iniziale del codice c’è il comando IPAddress server(173,194,116,23); che si riferisce all’indirizzo IP del sito di Google News. Per trovare questo numero dobbiamo collegarci al sito
http://www.mostraip.it/LocalizzaSito.aspx e inserire il nome del sito che stiamo cercando. In questo caso se mattiamo news.google.it/ uscirà come indirizzo IP: 173.194.40.24

 

 

Corriere della Sera – http://www.corriere.it/rss/

Clicca qui per scaricare lo sketch di Arduino.

 

Vediamo ora un secondo esempio su come prelevare dati da un file xml di un alro sito. Per questo tutorial utilizziamo gli Rss Feed del sito del Corriere della Sera. Come prima operazione dobbiamo trovare i file xml messi a disposizione dal Corriere.
Apriamo Google e scriviamo nel motore di ricerca: corriere della sera rss fedd xml
La prima soluzione della ricerca ci porta al sito: http://www.corriere.it/rss/
Qui possiamo scegliere tra diverse tipologie di Rss, selezioniamo ad esempio gli Rss di Cinema e Tv.
corriere_arduino

 

Nell’immagine a sinistra la pagina che appare aprendo il link con Explorer o FireFox.
Nella pagina xml che si apre non abbiamo alcun riferimento alle parole chiave per rintracciare il titolo delle news come abbiamo visto con il file di Google.
Nell’immagine di destra come appare la pagina aprendola con Google Chrome. In questo caso possiamo rintracciare le parole chiave per evidenziare le varie news come abbiamo visto prima.
Se utilizziamo FireFox clicchiamo con il tasto destro del mouse e selezioniamo Visualizza Sorgente Pagina. In questo modo si aprirà il file xml.
Questo esercizio proseguirà aprendo la pagina con Explorer per differenziare il tutorial dall’esercizio precedente.
In questo modo possiamo vedere metodi differenti per arrivare alla stessa soluzione.

Per trovare qualche riferimento alle parole chiave da cercare, dobbiamo visualizzare il codice della pagina che abbiamo appena aperto con Explorer.
Clicchiamo con il tasto destro del mouse su una parte qualsiasi della pagina e clicchiamo su HTML.

corriere_arduino2

 

Questo è il file che si apre. Per prima cosa cerchiamo all’interno di questo file il titolo della prima news apparsa sul sito http://xml.corriereobjects.it/rss/cinema.xml. Nel mio caso il titolo è: Due Coco Chanel, duello al cinema. Copio il titolo e faccio una ricerca all’interno del file html.

corriere_arduino3

Qui sopra il titolo all’interno del file html. In questo caso si vede che il titolo è preceduto da un campo chiamato title e da un secondo campo chiamato CDATA. Come nell’esercizio precedente la ricerca verrà effettuata con queste due parole chiave.

 

#include <SPI.h>

#include <Ethernet.h>
#include <TextFinder.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(89,31,55,103); //ip www.corriere.it
Indirizzo IP di www.corriere.it

IPAddress ip(10,47,151,229);
//byte gateway[]={192,168,0,1};
EthernetClient client;
TextFinder finder(client);
String responseString;
boolean startCapture;
char buffer_news[300];
void setup() {
Serial.begin(9600);
if (Ethernet.begin(mac) == 0)
{
Serial.println(“Failed to configure Ethernet using DHCP”);
Ethernet.begin(mac,ip);
}
delay(500);
if (client.connect(server, 80)) // that you want to connect to (port 80 is default for HTTP):
{
Serial.println(“Connected!”);
String richiesta = “GET http://xml.corriereobjects.it/rss/cinema.xml”;
Pagina web xml con le novità sul cinema

// String nomeHost = “Host:http://news.google.it/”;
String chiusura_connessione = “Connection: close”;
// Make a HTTP request:
client.println(richiesta);
client.println(chiusura_connessione);
client.println();
responseString = “”;
startCapture = false;
}
else
{
Serial.println(“Connection failed!”);
}
}
void loop()
{
if (client.available())
{
char c = client.read();
if(c == ‘{‘)
startCapture=true;
if(startCapture)
responseString += c;
}
if (client.connected())
{
for (int i=0; i<5; i++){
Serial.println(“news oggi: “);
finder.find(“title>”);
finder.find(“<![CDATA”);
finder.getString(“[“,”]”,buffer_news, sizeof(buffer_news));
char *news =buffer_news;
Serial.println(news);
}

Ciclo FOR per visualizzare le prime 4 news
Cerco il testo <title>
Cerco il testo <![CDATA
tutto quello che appare tra “[“ e “]” viene memorizzato nel buffer_news

client.stop();
client.flush();
Serial.println();
}

 

 

Wunderground.com – http://www.wunderground.com/
Clicca qui per scaricare lo sketch di Arduino.

 

Il sito Wunderground.com è uno dei migliori siti per la ricezioni di informazioni meteo in formato xml. Oltre a essere uno dei pochi a fornire questo servizio (Yahoo e Google lo hanno chiuso) ci dà l’opportunità di scegliere tra moltissimi dati come temperatura, previsioni, neve, vento, ecc…
Il software è quasi identico a quello utilizzato fino ad ora; l’unica novità è che bisogna registrasi, prendere nota della nostra Key (un numero univoco che appartiene solo a noi) e segnarsi il codice della località scelta. Tutti questi dati devono essere inseriti nel comando GET di Arduino quando facciamo la richiesta per connetterci al server.
Vediamo tutti i passaggi da compiere:

Registarsi

Colleghiamoci al sito https://www.wunderground.com/members/signup.asp e clicchiamo su Join with New Account – Riempite tutti i campi (tranne quello Upgrade my membership for only $10 per year ) e cliccate su Become a Member.
Apriamo la posta in arrivo e clicchiamo sul link per attivare l’account.
Torniamo sul sito www.wunderground.com e clicchiamo su Weather e poi su Weather API for Develop (in fondo a destra)

 

wunder

 

Nella nuova pagina che si apre, fare click su Explore My Options.
Nella nuova finestra lasciamo attivo STRATUS PLAN e clicchiamo su Purchase Key (a sinistra).
Riempiamo tutti i campi del modulo e poi di nuovo su Purchase Key.
Nel campo KEY ID è presente il nostro codice. Copiamolo in un file di testo perchè poi dovremo inserirlo nel codice di Arduino.
Siamo quasi pronti per programmare Arduino con i dati prelevati dal sito wunderground.com. Prima di continuare vediamo quali tipo di dati possiamo scaricare.
In questo link http://www.wunderground.com/weather/api/d/docs?d=data/index trovate la spiegazione delle varie possibilità offerte dal sito.
Il codice che dobbiamo inserire per fare la richiesta al serve è questo qui:
GET http://api.wunderground.com/api/25919a47893f9ca1/features/q/query.xml
Vediamo come riempire questi campi.

api/25919a47893f9ca1 – In questo campo inseriamo la nostra API KEY appena creata al posto di quella dell’esempio.

features – In questo campo possiamo decidere il tipo di dati che ci occorrono, ad esempio mettendo al posto di feature la parola conditions, possiamo scaricare le condizioni meteo come temperatura, pressione, condizioni meteo, umidità, ecc..
Inserendo la parola forecast possiamo ottenere le previsioni meteo dei prossimi 3 giorni,
con forecast10days quelle relative ai prossimi 10 giorni, ecc..
La lista completa è qui: http://www.wunderground.com/weather/api/d/docs?d=data/index
query – dobbiamo indicare il luogo che vogliamo monitorare.
Per trovare la località geografica dobbiamo fare questa ricerca.
Andiamo nella homepage del sito, http://www.wunderground.com/ , inseriamo nel box di ricerca la città scelta, ad esempio”Milano”, e aspettiamo i suggerimenti del menù a tendina. Selezioniamo Milano, Italia e clicchiamo su ok.
Della pagina che si apre, segnamoci il numero che appare nel link del browser.

 

wunder2

 

Il codice di Milano è zmw:00000.1.16066.
Abbiamo tutti i dati per completare la nostra richiesta al server:
GET http://api.wunderground.com/api/inserite la vostra APIKEY/conditions/q/zmw:00000.1.16066.xml
Stiamo dicendo di connettersi al sito wunderground.com con il nostro codice e di visualizzare le condizioni meteo di Milano.
Vediamo ora quale tipo di variabili dobbiamo cercare all’interno del link che abbiamo costruito.
Apriamo una pagina web e inseriamo il link: http://api.wunderground.com/api/inserite la vostra APIKEY/conditions/q/zmw:00000.1.16066.xml

 

wunder3

 

Facendo scorrere la pagina possiamo vedere tutti i risultati della richiesta.
Nel nostro esercizio vogliamo stampare sul monitor di Arduino la temperatura attuale.
Questo dato è fornito dalla variabile temp_c come indicato sopra. Se volete potete utilizzare qualsiasi altro dato presente nel file xml.
Qui sotto il codice completo. Aprite il programma di Arduino e aprite lo sketch che avete scaricato all’inizio del terzo esercizio.

 

#include <SPI.h>
#include <Ethernet.h>
#include <TextFinder.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//const char server[] = “api.wunderground.com”;
IPAddress server(2,23,104,120); // IP 2,23,104,120 di api.wunderground.com
Indirizzo IP del sito api.wunderground.com

IPAddress ip(10,0,3,127);
Vostro indirizzo IP

EthernetClient client;
TextFinder finder( client );
String responseString;
boolean startCapture;
String readString = String(100);
void setup() {
Serial.begin(9600);
if (Ethernet.begin(mac) == 0)
{
Serial.println(“Failed to configure Ethernet using DHCP”);
Ethernet.begin(mac,ip);
}
delay(500);
Serial.print(“My IP Address is: “);
Serial.println(Ethernet.localIP());
Serial.println(“Connecting…”);
if (client.connect(server, 80))
{
Serial.println(“Connected!”);
String richiesta = “GET http://api.wunderground.com/api/xxxxxxxxxxx/conditions/q/zmw:00000.1.16080.xml HTTP/1.0”;

Richiesta di collegamento al server (inserite la vostra API KEY)

String chiusura_connessione = “Connection: close”;
client.println(richiesta);
client.println(chiusura_connessione);
client.println();
responseString = “”;
startCapture = false;
}
else
{
Serial.println(“Connection failed!”);
}
}
void loop()
{
if (client.available())
{
char c = client.read();
if(c == ‘{‘)
startCapture=true;
if(startCapture)
responseString += c;
}
if (client.connected())
{
finder.find(“temp_c>”);
Cerchiamo la parola “temp_c>”

float value = finder.getFloat();
Nella variabile “value” inseriamo il valore della temperatura.

Serial.print(“Temperatura oggi “);
Serial.print(value);
Stampiamo il valore di “value”

Serial.println(“ C”);
….

In questo caso non abbiamo utilizzato una variabile di tipo char perchè il valore della temperatura è un numero.

Nel prossimo esempio oltre a visualizzare il valore della temperatura stampiamo anche le previsioni del giorno successivo. Dato che le previsioni sono delle parole come “Sun”, “Clear”, “Rain”, ecc… dobbiamo utilizzare delle variabili di tipo char per catturare queste informazioni. Il codice utilizzato è identico a quello dei due esercizi precedenti.
Per ricevere anche le previsioni meteo dobbiamo ricostruire il comando GET.
http://api.wunderground.com/api/inserite la vostra APIKEY/conditions/q/zmw:00000.1.16066.xml
Questo qui sopra è il codice che abbiamo utilizzato per scaricare il dato della temperatura di oggi. Per le previsioni dei prossimi tre giorni dobbiamo inserire il codice forecast.
La nuova richiesta è così composta:
http://api.wunderground.com/api/inserite la vostra APIKEY/conditions/forecast/q/zmw:00000.1.16066.xml
Anche in questo caso andiamo a vedere quali tipi di variabili dobbiamo cercare all’interno del link che abbiamo costruito.
Apriamo una pagina web e inseriamo il link: http://api.wunderground.com/api/inserite la vostra APIKEY/conditions/forecast/q/zmw:00000.1.16066.xml

 

wunder4

 

 

La prima parte del codice si riferisce alle condizioni meteo di oggi. Dopo la scritta <forecast>
appaiono le informazioni delle previsioni meteo per i prossimi tre giorni. Se analizziamo il codice notiamo che dopo la scritta icon appare “chancerain” ovvero possibilità di pioggia e qualche riga sotto Sunday.
Questa è la previsione per Domenica, in questo caso è la previsione del giorno stesso in cui sto facendo la richiesta (chiaramente la vostra previsione sarà differente a seconda del giorno in cui fate la ricerca).

Se continiuamo a scorrere il file xml notiamo altri campi <icon> riferiti a Sunday Night, Monday, Monday Night, ecc…
Quindi per ricapitolare: la prima informazione all’interno del primo <icon> si riferisce al giorno stesso. La seconda alla previsione meteo della notte del giorno stesso.
La terza alla previsione del giorno dopo. La quarta alla notte del giorno dopo, ecc…
Per rilevare le informazioni sul meteo di oggi dobbiamo aggiungere al codice due variabili: char buffer_meteo[31]; e char tempo_oggi[31]; inseriamole nella parte iniziale del codice di Arduino dove vengono dichiarate le variabili.
Una seconda da modificare è la richiesta del server: aggiungere forecast dopo  conditions.
La terza è la fase di ricerca della parola icon e la stampa del risultato.
Subito dopo la stampa del valore della temperatura aggiungete questo codice:

 

Serial.print(“tempo oggi: “);
finder.find(“icon”);
finder.getString(“>”,”<”,buffer_meteo,sizeof(buffer_meteo));
char *tempo_oggi =buffer_meteo;
Serial.println(tempo_oggi);

 

N.B: se dopo aver copiato questo codice vi dà errore, è per le virgolette. Dovete cancellarle e rimetterle. È un errore dovuto al copia e incolla dal pdf.

Per stampare le previsioni del giorno dopo, aggiungiamo altre due variabili:
char buffer_domani[31]; e char tempo_domani[31];
In questo caso se la ricerca avviene sempre per la parola <icon> stampiamo sempre lo stesso valore. Dobbiamo aggiungere una parola chiave che ci permette di spostarci più in basso all’interno del file xml. Se guardate il file l’unico elemento che cambia tra una previsione e l’altra è la scritta <period> in <period>1</period> , <period>2</period>, <period>3</period>, ecc…
Basta fare una doppia verifica su icon e period per ottenere la previsione scelta.
Copiate questo codice sotto quello precedente:

 

Serial.print(“tempo domani: “);
if ( finder.find(“<period>2</period>”) && finder.find (“icon”)){
finder.getString(“>”,”<”,buffer_domani,sizeof(buffer_domani));
char *tempo_domani =buffer_domani;
Serial.println(tempo_domani);

 

Clicca qui per scaricare il codice completo. Caricate sulla scheda Arduino e Aprite il Serial Monitor. Nel prossimo tutorial vedremo come analizzare questi dati e realizzare un progetto con i dati delle previsioni meteo.

 

wunde5

 

Ti è piaciuto il tutorial? Se ti va offrimi un caffè…[paypal-donation]

 

I tutorial sono liberamente scaricabili e condivisibili sotto l’etichetta Creative Commons (non è possibile commercializzarli e modificarli)
Licenza Creative Commons

 

 

Scarica il Pdf del tutorial di Arduino  “download dati RSS da internet”

icona_pdf

 

Succ Articolo

Precedente Articolo

© 2024 Marco Pucci

Tema di Anders Norén