Arduino può diventare un Parser, ovvero uno strumento che riesce a legge una struttura grammaticale di un file e con essa il contenuto al suo interno.
Per un progetto che sto realizzando, ArduinoHRC, sono “inciampato” in questa necessità. Avevo bisogno che Arduino riuscisse al leggere un file remoto (salvato su un server web) e i valori contenuti al suo interno.
Per fare questo tipo di operazione utilizzeremo principalemente queste 3 classi:
Attraverso la lettura di questi valori letti da Arduino, possiamo cambiare lo stato degli attuatori, scrivere qualcosa sulla seriale, ecc.
Le applicazioni per questo tipo di lavoro sono una moltitudine, uno di questi può essere la lettura di un file meteo in formato XML fornito da un servizio meteorologico online (es. weather.com) e comandare Arduino in base alle condizioni climatiche del momento.
Ecco un paio di esempi per questo tipo di applicazione, il primo che legge un semplicissimo file di testo, il secondo che legge le informazioni meteorologiche e attiva/disattiva, per esempio, condizionatore o riscaldamento in base alle condizioni climatiche del momento.
I servizi che offrivano le previsioni sono stati chiusi ma puoi prendere spunto su come funziona il parsing per fartene uno tutto tuo o provare ad utilizzare Open Weather Map.
Tutto l’articolo che segue è da leggera a solo scopo didattico o per prendere spunto. gli esempi che seguono non funzioneranno.
Esempio 1 – Step 1 – Lettura di un semplice file di testo
Supponiamo di avere un semplicissimo file di testo denominato FileDati.txt
all’interno della cartella CartellaWeb
sul server web www.dominio.it
sul quale dobbiamo leggere dei semplici valori di questo tipo
0 1 2 3 |
ud5=1 ud6=0 |
La parte dello sketch sotto, apre il file e cerca determinate parole chiave all’interno del documento. In questo caso cerca le parola chiave sono ud5=
e ud6=
. Se Arduino trova queste parole chiave, legge il carattere successivo (nell’esempio, un numero intero) e lo confronta con un ciclo if
. Se il valore Intero è uguale ad uno Arduino attiva l’attuatore altrimenti lo lascia inattivo. Con il file del nostro esempio Arduino attiverebbe ud5 e lascerebbe inattiva ud6.
NB ud5
e ud6
sono inizializzate come uscite digitali pinMode(#, OUTPUT);
Di seguito lo spezzone di sketch
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
if (client.connect(server,80)>0) { // connessione al file sul server web client.print("GET /"); client.print(file); // persorso e file su cui fare il parsing, in questo caso potrebbe essere "/CartellaWeb/FileDati.txt" client.println(" HTTP/1.0"); client.println(host); // Host: www.dominio.it client.println(); Serial.println("leggo file su server web"); } else { Serial.println("connessione al file sul server web fallita"); } if (client.connected()) { // se sono connesso if(client.find("ud5=")) { // se trovo la stringa ud5= ud5 = client.parseInt(); Serial.print("valore ud5: "); Serial.print(ud5); if (ud5 == 1) { // se ud5=1 accendo l'uscita digitale 5 e scrivo in seriale ud5 accesa digitalWrite(5, HIGH); Serial.println("ud5 accesa"); } else { // altrimenti l'uscita digitale 5 rimane spenta digitalWrite(5, LOW); Serial.println("ud5 spenta"); } } else { Serial.println("non trovo ud5"); } // come sopra ma con ud6 if(client.find("ud6=")) { ud6 = client.parseInt(); Serial.print("valore ud6: "); Serial.print(ud6); if (ud6 == 1) { digitalWrite(6, HIGH); Serial.println("ud5 accesa"); } else { digitalWrite(6, LOW); Serial.println("ud5 spenta"); } } else { Serial.println("non trovo ud6"); } // NB e' possibile cercare tutte le parole o stringhe che desideriamo e comandare Arduino con le azioni necessarie Serial.println(""); } else { Serial.println("Disconnsso"); } client.stop(); // ferma il client client.flush(); // svuota i dati del client |
Se desideri scaricare lo sketch completo leggi qui come fare.
Esempio 2 – Step 2 – Lettura di un file XML Meteo
Supponiamo di dover leggere un file meteo fornito da Weather.com o Yahoo! Weather e far fare ad Arduino delle azioni quando determinati valori meteo si verifichino.
Il file meteo in formato XML che analizzeremo è il seguente.
http://wxdata.weather.com/wxdata/weather/local/ITXX0067?cc=*&unit=m
La località è impostata su Roma e può essere modificata cambiando nell’URL questo codice ITXX0067
.
Per trovare il codice della vostra località potete utilizzare il servizio Weather Location Codes/IDs
Nell’esempio sotto, cercheremo il valore della temperatura, che nel file XML fornito da Weather.com è compreso nel tag
0 1 2 |
<tmp>??</tmp> |
Ecco lo spezzone dello sketch che permette di leggere il valore della temperatura dal file XML.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
//inizializzazione char server[] = "wxdata.weather.com"; /* *** *** *** */ //loop con un delay o un millis abbastanza lungo if (client.connect(server,80)>0) { // connessione al file sul server web client.print("GET "); client.print("/wxdata/weather/local/ITXX0067?cc=*&unit=m"); // url per meteo Roma, per altre localita' utilizzare questo motore di ricerca https://www.edg3.co.uk/snippets/weather-location-codes/ e sostituire il codice ITXX0062 con quello della localita' che desiderate client.println(" HTTP/1.0"); client.println("Host: wxdata.weather.com"); client.println(); Serial.println("leggo file su server web"); } else { Serial.println("connessione al file sul server web fallita"); } if (client.connected()) { // se sono connesso if(client.find("<tmp>")) { // cerchiamo il valore <tmp> nel file xml fornito da weather.com tmp = client.parseInt(); // salvo nella variabile tmp il numero intero dopo la stringa ricercata Serial.print("valore temperatura in Celsius: "); Serial.println(tmp); if (tmp >= 25) { Serial.println("E' Caldo!!!"); } if (tmp <= 15) { Serial.println("E' Freddo!!!"); } if ((tmp > 15) && (tmp < 25) { Serial.println("Temperatura Ottimale!!!"); } } else { Serial.println("non trovo <tmp>"); } // // potete cercare tutte le parole che desiderate e mettere le azioni di cui necessitate Serial.println(""); } else { Serial.println("Disconnesso"); } client.stop(); // ferma il client client.flush(); // svuota i dati del client |
Weather.com fornisce oltre alla temperatura molti altri valori meteorologici. E’ possibile leggere all’interno del file XML anche l’orario di alba e tramonto, l’umidità, la pressione barometrica, la temperatura massima, quella minima, il la forza e la direzione del vento, i raggi UV ecc. Facendo leggere questi dati da Arduino è possibili fargli fare quello che desiderate in base alle condizioni climatiche del momento 😉
Se desideri scaricare lo sketch completo, funzionante e ampiamente commentato fai una piccola donazione offrendomi un caffè utilizzando il pulsante Donazione di PayPal qui sotto. Potrai scaricare il progetto completo che legge i dati di Temperatura, Pressione Atmosferica, Umidità, Direzione e Forza del Vento, Visibilità e Raggi UV dal file meteo fornito da Weather.com con l’attivazione di determinate uscite digitali in base alle condizioni climatiche fornite.
Il tuo cappuccino sarà di enorme aiuto a mantenere sveglio e attivo questo blog 😉
Se desideri avere maggiori nozioni sul Parsing dei file meteo in formato XML puoi leggere anche questi due articoli:
Parser da XML a PHP del File Meteo (Yahoo! Weather, Weather.com)
Parser da XML a ASP del File Meteo (Yahoo! Weather, Weather.com)
I commenti sono chiusi.