{"id":1582,"date":"2014-06-19T18:55:19","date_gmt":"2014-06-19T16:55:19","guid":{"rendered":"https:\/\/www.giannifavilli.it\/blog\/?p=1582"},"modified":"2022-02-22T16:10:51","modified_gmt":"2022-02-22T15:10:51","slug":"arduino-parser","status":"publish","type":"post","link":"https:\/\/www.giannifavilli.it\/blog\/arduino-parser\/","title":{"rendered":"Arduino Parser, leggere un file sul web (fare il parsing di un file)"},"content":{"rendered":"<p>Arduino pu\u00f2 diventare un Parser, ovvero uno strumento che riesce a legge una struttura grammaticale di un file e con essa il contenuto al suo interno.<br \/>\nPer un progetto che sto realizzando, <a title=\"Arduino Management System: Sistema di Gestione e Controllo di Arduino con Sketch Unico\" href=\"https:\/\/www.giannifavilli.it\/blog\/arduino-management-system\/\">ArduinoHRC<\/a>, sono &#8220;inciampato&#8221; in questa necessit\u00e0. Avevo bisogno che Arduino riuscisse al leggere un file remoto (salvato su un server web) e i valori contenuti al suo interno.<br \/>\nPer fare questo tipo di operazione utilizzeremo\u00a0 principalemente queste 3 classi:<\/p>\n<div style=\"backgroung: #fdfdfd; margin: 5px; padding: 5px; border: solid 1px #ddd; width: 97%;\">client.<span style=\"color: #cc6600;\">find<\/span>(); <span style=\"color: #7e7e7e;\">\/\/ cerca una determinata stringa<\/span><\/div>\n<div style=\"backgroung: #fdfdfd; margin: 5px; padding: 5px; border: solid 1px #ddd; width: 97%;\">client.<span style=\"color: #cc6600;\">parseInt<\/span>(); <span style=\"color: #7e7e7e;\">\/\/ legge il numero intero dopo la stringa ricercata<\/span><\/div>\n<div style=\"backgroung: #fdfdfd; margin: 5px; padding: 5px; border: solid 1px #ddd; width: 97%;\">client.<span style=\"color: #cc6600;\">parseFloat<\/span>(); <span style=\"color: #7e7e7e;\">\/\/ legge il numero con virgola dopo la stringa ricercata<\/span><\/div>\n<p>Attraverso la lettura di questi valori letti da Arduino, possiamo cambiare lo stato degli attuatori, scrivere qualcosa sulla seriale, ecc.<br \/>\nLe applicazioni per questo tipo di lavoro sono una moltitudine, uno di questi pu\u00f2 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.<br \/>\nEcco 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.<\/p>\n<p><!--more--><\/p>\n<div class=\"alert alert-error fade in\" style=\"text-align: center;\"><strong>Attenzione questo articolo non \u00e8 pi\u00f9 valido!<br \/>\n<\/strong>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 <a href=\"https:\/\/openweathermap.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Open Weather Map.<\/a><br \/>\nTutto l&#8217;articolo che segue \u00e8 da leggera a solo scopo didattico o per prendere spunto. gli esempi che seguono non funzioneranno.<\/div>\n<h4>Esempio 1 &#8211; Step 1 &#8211; Lettura di un semplice file di testo<\/h4>\n<p>Supponiamo di avere un semplicissimo file di testo denominato <code>FileDati.txt<\/code> all&#8217;interno della cartella <code>CartellaWeb<\/code> sul server web <code>www.dominio.it<\/code> sul quale dobbiamo leggere dei semplici valori di questo tipo<\/p>\n<pre class=\"toolbar:2 nums:false lang:default decode:true\">ud5=1\nud6=0\n<\/pre>\n<p>La parte dello sketch sotto, apre il file e cerca determinate parole chiave all&#8217;interno del documento. In questo caso cerca le parola chiave sono <code>ud5=<\/code> e <code>ud6=<\/code>. Se Arduino trova queste parole chiave, legge il carattere successivo (nell&#8217;esempio, un numero intero) e lo confronta con un ciclo <code>if<\/code>. Se il valore Intero \u00e8 uguale ad uno Arduino attiva l&#8217;attuatore altrimenti lo lascia inattivo. Con il file del nostro esempio Arduino attiverebbe ud5 e lascerebbe inattiva ud6.<br \/>\nNB <code>ud5<\/code> e <code>ud6<\/code> sono inizializzate come uscite digitali <code>pinMode(#, OUTPUT);<\/code><br \/>\nDi seguito lo spezzone di sketch<\/p>\n<pre class=\"toolbar:1 lang:arduino decode:true\" title=\"Lettura di un semplice file di testo\">if (client.connect(server,80)&gt;0) { \/\/ connessione al file sul server web \n  client.print(\"GET \/\");\n  client.print(file); \/\/ persorso e file su cui fare il parsing, in questo caso potrebbe essere \"\/CartellaWeb\/FileDati.txt\"\n  client.println(\" HTTP\/1.0\");\n  client.println(host); \/\/ Host: www.dominio.it  \n  client.println();\n  Serial.println(\"leggo file su server web\");\n}\nelse {\n  Serial.println(\"connessione al file sul server web fallita\");\n}\n\nif (client.connected()) { \/\/ se sono connesso\n\n  if(client.find(\"ud5=\")) { \/\/ se trovo la stringa ud5=\n    ud5 = client.parseInt();\n    Serial.print(\"valore ud5: \"); \n    Serial.print(ud5);\n    if (ud5 == 1) { \/\/ se ud5=1 accendo l'uscita digitale 5 e scrivo in seriale ud5 accesa\n      digitalWrite(5, HIGH);\n      Serial.println(\"ud5 accesa\");\n    }\n    else { \/\/ altrimenti l'uscita digitale 5 rimane spenta\n      digitalWrite(5, LOW);\n      Serial.println(\"ud5 spenta\");\n    }\n  }\n  else {\n    Serial.println(\"non trovo ud5\");\n  }\n  \/\/ come sopra ma con ud6\n  if(client.find(\"ud6=\")) { \n    ud6 = client.parseInt();\n    Serial.print(\"valore ud6: \");\n    Serial.print(ud6);\n    if (ud6 == 1) {\n      digitalWrite(6, HIGH);\n      Serial.println(\"ud5 accesa\");\n    }\n    else {\n      digitalWrite(6, LOW);\n      Serial.println(\"ud5 spenta\");\n    }\n  }\n  else {\n    Serial.println(\"non trovo ud6\");\n  }\n  \/\/ NB e' possibile cercare tutte le parole o stringhe che desideriamo e comandare Arduino con le azioni necessarie\n  Serial.println(\"\");\n}\nelse {\n  Serial.println(\"Disconnsso\");\n}\nclient.stop(); \/\/ ferma il client\nclient.flush(); \/\/ svuota i dati del client\n<\/pre>\n<div class=\"alert alert-info fade in\">Continua a leggere, il prossimo esempio ha sicuramente una vera e propria utilit\u00e0 ai fini pratici.<br \/>\nSe desideri scaricare lo sketch completo <a href=\"#infodonazione\">leggi qui come fare<\/a>.<\/div>\n<h4>Esempio 2 &#8211; Step 2 &#8211; Lettura di un file XML Meteo<\/h4>\n<p>Supponiamo di dover leggere un file meteo fornito da <a href=\"http:\/\/weather.com\" target=\"_blank\" rel=\"noopener noreferrer\">Weather.com<\/a> o Yahoo! Weather e far fare ad Arduino delle azioni quando determinati valori meteo si verifichino.<\/p>\n<p>Il file meteo in formato XML che analizzeremo \u00e8 il seguente.<\/p>\n<p><a href=\"http:\/\/wxdata.weather.com\/wxdata\/weather\/local\/ITXX0067?cc=*&amp;unit=m\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/wxdata.weather.com\/wxdata\/weather\/local\/ITXX0067?cc=*&amp;unit=m<\/a><\/p>\n<p>La localit\u00e0 \u00e8 impostata su Roma e pu\u00f2 essere modificata cambiando nell&#8217;URL questo codice <code>ITXX0067<\/code>.<br \/>\nPer trovare il codice della vostra localit\u00e0 potete utilizzare il servizio <a href=\"https:\/\/www.edg3.co.uk\/snippets\/weather-location-codes\/\" target=\"_blank\" rel=\"noopener noreferrer\">Weather Location Codes\/IDs<\/a><\/p>\n<p>Nell&#8217;esempio sotto, cercheremo il valore della temperatura, che nel file XML fornito da Weather.com \u00e8 compreso nel tag<\/p>\n<pre class=\"toolbar:2 lang:xhtml decode:true  \">&lt;tmp&gt;??&lt;\/tmp&gt;<\/pre>\n<p>Ecco lo spezzone dello sketch che permette di leggere il valore della temperatura dal file XML.<\/p>\n<pre class=\"toolbar:1 lang:arduino decode:true\" title=\"Lettura di un file XML Meteo\">\/\/inizializzazione\nchar server[] = \"wxdata.weather.com\";\n\n\/* \n *** *** ***\n *\/\n\n\/\/loop con un delay o un millis abbastanza lungo\nif (client.connect(server,80)&gt;0) { \/\/ connessione al file sul server web \n  client.print(\"GET \");\n  client.print(\"\/wxdata\/weather\/local\/ITXX0067?cc=*&amp;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\n  client.println(\" HTTP\/1.0\");\n  client.println(\"Host: wxdata.weather.com\");   \n  client.println();\n  Serial.println(\"leggo file su server web\");\n}\nelse {\n  Serial.println(\"connessione al file sul server web fallita\");\n}\n\nif (client.connected()) { \/\/ se sono connesso\n\n  if(client.find(\"&lt;tmp&gt;\")) { \/\/ cerchiamo il valore &lt;tmp&gt; nel file xml fornito da weather.com\n    tmp = client.parseInt(); \/\/ salvo nella variabile tmp il numero intero dopo la stringa ricercata\n    Serial.print(\"valore temperatura in Celsius: \"); \n    Serial.println(tmp);\n    if (tmp &gt;= 25) { \n      Serial.println(\"E' Caldo!!!\");\n    }\n    if (tmp &lt;= 15) { \n      Serial.println(\"E' Freddo!!!\");\n    }\n    if ((tmp &gt; 15) &amp;&amp; (tmp &lt; 25) {\n      Serial.println(\"Temperatura Ottimale!!!\");\n    }\n  }\n  else {\n    Serial.println(\"non trovo &lt;tmp&gt;\");\n  }\n  \/\/ \/\/ potete cercare tutte le parole che desiderate e mettere le azioni di cui necessitate\n  Serial.println(\"\");\n}\nelse {\n  Serial.println(\"Disconnesso\");\n}\nclient.stop(); \/\/ ferma il client\nclient.flush(); \/\/ svuota i dati del client<\/pre>\n<p>Weather.com fornisce oltre alla temperatura molti altri valori meteorologici. E&#8217; possibile leggere all&#8217;interno del file XML anche l&#8217;orario di alba e tramonto, l&#8217;umidit\u00e0, 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 \u00e8 possibili fargli fare quello che desiderate in base alle condizioni climatiche del momento \ud83d\ude09<\/p>\n<div class=\"alert fade in\"><strong>Nello sketch scaricabile<\/strong>, Arduino, oltre che leggere i dati di Temperatura, Pressione Atmosferica, Umidit\u00e0, Direzione e Forza del Vento, Visibilit\u00e0 e Raggi UV, \u00e8 programmato in modo da abilitare o disabilitare le uscite digitali 5 e 6 in base alla lettura della temperatura. Con dei rel\u00e8 \u00e8 possibile accendere o spengere condizionatore e\/o riscaldamento a seconda delle condizioni climatiche e della temperatura fornita da weater.com. Oltremodo \u00e8 possibile, seguendo l&#8217;esempio dello sketch scaricabile, inserire altri attuatori da controllare a piacimento se determinate condizioni climatiche si verificano.<\/div>\n<div class=\"alert alert-info fade in\">\n<p>Se desideri scaricare lo sketch completo, funzionante e ampiamente commentato fai una piccola donazione <em>offrendomi un caff\u00e8<\/em> utilizzando il pulsante Donazione di PayPal qui sotto. Potrai scaricare il progetto completo che legge i dati di Temperatura, Pressione Atmosferica, Umidit\u00e0, Direzione e Forza del Vento, Visibilit\u00e0 e Raggi UV dal file meteo fornito da Weather.com con l&#8217;attivazione di determinate uscite digitali in base alle condizioni climatiche fornite.<\/p>\n<p><strong>Il tuo cappuccino sar\u00e0 di enorme aiuto a mantenere <em>sveglio<\/em> e attivo questo blog \ud83d\ude09<\/strong><\/p>\n<\/div>\n<p>Se desideri avere maggiori nozioni sul Parsing dei file meteo in formato XML puoi leggere anche questi due articoli:<br \/>\n<a title=\"Parser da XML a PHP del File Meteo (Yahoo! Weather, Weather.com)\" href=\"https:\/\/www.giannifavilli.it\/blog\/parser-xml-php-googlemeteo\/\">Parser da XML a PHP del File Meteo (Yahoo! Weather, Weather.com)<\/a><br \/>\n<a title=\"Parser da XML a ASP del File Meteo (Yahoo! Weather, Weather.com)\" href=\"https:\/\/www.giannifavilli.it\/blog\/parser-xml-asp-googlemeteo\/\">Parser da XML a ASP del File Meteo (Yahoo! Weather, Weather.com)<\/a><\/p>\n<h4>Reference<\/h4>\n<p><a href=\"http:\/\/arduino.cc\/en\/Reference\/StreamFind\" target=\"_blank\" rel=\"noopener noreferrer\">find()<\/a>, <a href=\"http:\/\/arduino.cc\/en\/Reference\/StreamParseInt\" target=\"_blank\" rel=\"noopener noreferrer\">parseInt()<\/a>, <a href=\"http:\/\/arduino.cc\/en\/Reference\/StreamParseFloat\" target=\"_blank\" rel=\"noopener noreferrer\">parseFloat()<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Arduino pu\u00f2 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 &#8220;inciampato&#8221; in questa necessit\u00e0. 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\u00a0 principalemente queste 3 classi: client.find(); \/\/ cerca una determinata stringa client.parseInt(); \/\/ legge il numero intero dopo la stringa ricercata client.parseFloat(); \/\/ legge il numero con virgola dopo la stringa ricercata 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\u00f2 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.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[16,3,17],"tags":[67,69,63,28,68,26],"class_list":["post-1582","post","type-post","status-publish","format-standard","hentry","category-arduino","category-informatica","category-programmazione","tag-arduino","tag-domotica","tag-informatica","tag-parse","tag-programmazione","tag-xml"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4SGGs-pw","_links":{"self":[{"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/posts\/1582","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/comments?post=1582"}],"version-history":[{"count":0,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/posts\/1582\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/media?parent=1582"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/categories?post=1582"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/tags?post=1582"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}