Sei sulla pagina 1di 22

Search Programmazione WxWidgets CodeBlocks Android Elettronica Arduino 1-Wire

AA

ott

17
2012

Arduino, 1wire DS18B20 e datalogger su internet


1-Wire, Arduino, Elettronica Add comments

69.164.218.62 Utente non autenticato Registrati Collegati

Oggi sviluppiamo ulteriormente il precedente progetto e vediamo come inviare le letture delle temperature dei sensori DS18B20
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

Italiano English

pdfcrowd.com

su un server remoto delegando alle tecnologie web la rappresentazione dei dati.Si noti che non andiamo a sostituire le funzionalit gi implementate ma le andiamo ad integrare. Il funzionamento finale prevede che Arduino a tempi regolari rileva le temperature su tutti i sensori, le invia su server remoto e, se interrogato sulla rete locale, invia una pagina web con le letture memorizzate. La prima cosa da fare utilizzare lEthernetClient che permette di collegarsi al server remoto per inviare i dati che ci interessano. Nellesempio qui sotto ho usato come server il portatile da cui scrivo questo articolo sul quale installato un web server. Lindirizzo IP perci un indirizzo locale (192.168.1.8) ma su server remoto la cosa del tutto identica. Laltra grossa differenza rispetto il precedente articolo nella gestione della tempistica dei dati. Prima infatti inviavamo le temperatura quando giungeva una specifica richiesta, ma ora le cose sono diverse e stabiliamo noi quando inviare i dati. Nel nostro caso, trattandosi di temperature, logico inviarle ogni tot tempo, ma le cose potrebbero essere diverse in altri casi, ad esempio potremmo avere un sistema che segnala via web
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

RSS McMajan Libreria Ss_TFT Arduino, rel e infrarossi. IteadStudio 2.8 TFT Display shield: Una nuova libreria Arduino e RS485: piccoli approfondimenti Arduino cos? (per principianti e anche meno)

Categorie Elettronica (36) 1-Wire (8) Arduino (30) Programmazione (26) Android (7) CodeBlocks (9) wxWidgets (11) Senza categoria (1)

pdfcrowd.com

esempio potremmo avere un sistema che segnala via web quando piove, quando viene aperta una porta, quando qualcuno preme un pulsante o quantaltro. Vediamo come fare il tutto. 1) inizializziamo il client 1 byte remote[]={192,168,1,8}; 2 EthernetClient ArduinoClient; 2) allinterno del loop eseguire la connessione al server remoto e, in caso di successo, inviare i dati: 01 if (ArduinoClient.connect(remote, 80)) 02 { 03 Serial.println("connected"); // scrive sul monitor seriale, utile per il debug dell'applicazione 04 ArduinoClient.print( "HEAD /test/myscript.php?c1=10"); 05 ArduinoClient.println(" HTTP/1.1"); // attenzione allo spazio iniziale 06 ArduinoClient.println(Host: 192.168.1.25"); 07 ArduinoClient.println("UserAgent:Arduino"); 08 ArduinoClient.println("Accept: text/html"); 09 ArduinoClient.println("Connection:
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

WEB (1) Wordpress (1)

Elettronica Sito ufficiale Arduino

Programmazione HomePage Code::Blocks HomePage wxWidgets

Blog QR Code

pdfcrowd.com

09 ArduinoClient.println("Connection: close"); 10 ArduinoClient.println(); 11 ArduinoClient.stop(); 12 } 13 else Serial.println("connection failed"); Nella prima riga viene effettuata la connessione al server remoto sulla porta 80, se lesito positivo ritornato true e si entra nellif.Tramite le istruzioni print e pintln del client vengono inviati i dati al server remoto. Nellesempio, in particolare, viene richiamato lo script myscript.php che si trova su /test, nel server remoto 192.168.1.8. Vediamo che come dati viene inviato unicamente c1=10, cosa che ho fatto unicamente per semplificare il listato in questa fase della descrizione. Nel listato definitivo i dati inviati saranno diversi in base al numero di sensori e ai valori di temperatura rilevati. Ovviamente dovr essere scritto anche lo script php e qui si potrebbe aprire un capitolo di proporzioni sconfinate in quanto vi sono infinite possibilit sulla gestione dei dati in arrivo. Questi potrebbero essere infatti inviati ad un database, a uno o pi files di testo o utilizati per creare pagine web dinamiche o altro ancora.Nel listato qui
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

riportato viene semplicemente scritto il dato su un file di testo tempdata.txt 01 <?php 02 03 if ($_SERVER['REQUEST_METHOD'] == 'HEAD') // se ricevi una richiesta di tipo "HEAD" 04 { 05 06 $fields = explode("&", $_SERVER['QUERY_STRING']); 07 $values = array(); 08 09 foreach ($fields as $field) { 10 $keyval = explode("=", $field); 11 $values[$keyval[0]] = $keyval[1]; 12 } 13 14 $file = fopen('tempdata.txt','a+'); 15 if ($file) 16 { 17 fwrite($file, time() . ':' . $values['c1']); // marcatura temporale in secondi e temperatura "c1" 18 fwrite($file, "\n"); 19 fclose($file); 20 } 21 } 22 23 ?>
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Fin qui dovrebbe essere tutto abbastanza semplice. Ora dobbiamo decidere esattamente come stutturare i dati e come visualizzarli. Ad esempio dobbiamo prevedere la possibilit di aggiungere o rimuovere sensori nel tempo senza sballare tutto il sistema, pensare allopportunit di tracciare grafici real-time, giornalieri, settimanali, mensili o annuali, calcolare il valore medio o quanto ci venga in mente. Una volta stabilito cosa e come memorizzare i dati sorge il problema della visualizzazione. Non voglio per rendere le cose complicate per cui al fine di non perdere di vista lobiettivo prefissato preferisco mantenere le cose semplici motivo limitandoci ad inviare le letture solo del primo sensore, le memorizziamo sul file testuale e le visualizziamo in una pagina dedicata. Un approccio di questo tipo ha linconveniente di accumulare una gran quantit di dati sullo stesso file, cosa che col tempo diventa scarsamente gestibile, motivo per il quale un sistema applicabile come esercizio ma non certo come monitoraggio per lunghi periodi. La prima modifica riguarda linvio del dato di temperatura: 1 Serial.println("connected");
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

1 Serial.println("connected"); 2 ArduinoClient.print("HEAD /test/myscript.php?c1="); 3 ArduinoClient.print(temps[1]); Lo script invece gi a posto per cui c solo da scrivere il software per visualizzare il grafico con le temperature. A dirla tutta, lispirazione per questo progetto lho presa da qui che a sua volta una rielaborazione di quanto troviamo a questo articolo. Purtoppo in entrambi i casi lo script di visualizzazione dei dati molto riduttivo e presenta alcuni errori di programmazione per cui sono intervenuto con pesanti modifiche che portano allo script qui sotto: 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 <?php define('WIDTH', 1600); //>=320 define('HEIGHT', 1000); //>=200 define('FONT', 1); define('FONT2',2); define('UP',20);//>=20 define('DOWN',20);//>=20 define('DX',20);//>=20 define('SN',20);//>=20 // Prelvo i dati dal file $data = array(); $file = fopen("tempdata.txt","r"); if ($file) {
Are you a developer? Try out the HTML to PDF API

open in browser PRO version

pdfcrowd.com

016 017 018 019 020 021 022 023 024 025 026 027 028 029 030

if ($file) { while (!feof($file)) { $line = trim(fgets($file)); if (strlen($line)) { $fields = explode(":", $line); $keyval = array(); $keyval['time'] = $fields[0]; $keyval['c1'] = $fields[1]; $data[] = $keyval; } } fclose($file); } $datapoints = count($data); // conto il numero di valori

031 032 // Lines are chronological 033 $mintime = $data[0]['time']; 034 $maxtime = $data[$datapoints 1]['time']; 035 036 $mintemp = 250; 037 $maxtemp = -250; 038 $avgtemp=0; 039 040 foreach ($data as $datapoint) // trovo il valore minimo e massimo di temperatura 041 { 042 if($datapoint['c1']<$mintemp) $mintemp=$datapoint['c1']; 043 if($datapoint['c1']>$maxtemp) $maxtemp=$datapoint['c1'];
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

044 045 046 047

048 049 $lowtime = intval($mintime / 3600) * 3600; 050 $hightime = (intval($maxtime / 3600) + 1) * 3600; 051 $difftime = $hightime - $lowtime; // ore 052 053 $lowtemp = intval($mintemp)-1; 054 $hightemp = intval($maxtemp)+1; 055 $difftemp = $hightemp - $lowtemp; 056 057 // Create the image 058 $image = imagecreate(WIDTH, HEIGHT); 059 if ($image) { 060 $background = imagecolorallocate($image, 255, 255, 255); 061 $black = imagecolorallocate($image, 0, 0, 0); 062 $red = imagecolorallocate($image, 255, 0, 0); 063 $blue = imagecolorallocate($image, 0, 0, 255);
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

$maxtemp=$datapoint['c1']; $avgtemp += $datapoint['c1']; $curtemp = $datapoint['c1']; } $avgtemp = round(($avgtemp / $datapoints),2);

pdfcrowd.com

255); 064 $green = imagecolorallocate($image, 0, 195, 5); 065 $grey = imagecolorallocate($image, 210,210,210); 066 067 imageline($image, SN, UP-5, SN, HEIGHT-DOWN+5, $black); // asse Y 068 imageline($image, SN-5, HEIGHTDOWN, WIDTH-DX, HEIGHT-DOWN, $black); // asse X 069 imageline($image, SN+1, UP, WIDTHDX, UP, $grey); // linea di chiusura superiore 070 imageline($image, WIDTH-DX, UP, WIDTH-DX, HEIGHT-DOWN-1, $grey); // linea di chiusura destra 071 072 for ($i = 3600; $i < $difftime; $i += 3600) // va da un'ora all'altra 073 { 074 $x = SN + (($i * WIDTH-(SN+DX)) / $difftime); 075 imageline($image, $x, HEIGHT-DOWN, $x, HEIGHT-DOWN+3, $black); // Tacche verticali 076 imageline($image, $x, HEIGHT-DOWN1, $x, UP, $grey); // Linee Verticali 077 } 078 $temp = intval($lowtemp); 079
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

079 080 $dx=(WIDTH-(SN+DX)) / $difftime; // coefficienti per il disegno 081 $dy=(HEIGHT-(UP+DOWN)) / $difftemp; 082 083 for ($i = 1; $i < $difftemp; $i++) 084 { 085 $y = HEIGHT-DOWN - ($i * $dy ); 086 imageline($image, SN-3, $y, SN, $y, $black); // Tacche verticali 087 imageline($image, SN+1, $y, WIDTHDX, $y, $grey); // Linee verticali 088 $temp = intval($temp) + 1; 089 $ytemp = intval($y) - 5; 090 if((HEIGHT-DOWN-UP)/$difftemp<17) // se le scritte sono troppo ravvicinate visualizza solo i gradi pari 091 { 092 if($temp % 2 == 0) imagestring($image, FONT, SN-7(imagefontwidth(FONT) * strlen($temp)), $ytemp, $temp , $black); 093 } 094 else imagestring($image, FONT, SN7-(imagefontwidth(FONT) * strlen($temp)), $ytemp, $temp , $black); 095 } 096 097 imagestring($image, FONT, SN-12, HEIGHT-DOWN+10, date("H:i", $lowtime), $black); // ora minore
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

$lowtime), $black); // ora minore 098 imagestring($image, FONT, WIDTH-DX15, HEIGHT-DOWN+10, date("H:i", $hightime), $black); // ora maggiore 099 imagestring($image, FONT, SN-7(imagefontwidth(FONT) * strlen($lowtemp)), HEIGHT-DOWN-5, $lowtemp, $blue); // temperatura minima 100 imagestring($image, FONT, SN-7(imagefontwidth(FONT) * strlen($hightemp)), UP-5, $hightemp, $red); // temperatura massima 101 102 // temperature minima, corrente, massima e media 103 imagestring($image, FONT2, WIDTH290, HEIGHT-DOWN-35, "Cur. temp : " . $curtemp . " C",$black); 104 imagestring($image, FONT2, WIDTH290, HEIGHT-DOWN-20, "Avg. temp : " . $avgtemp . " C",$green); 105 imagestring($image, FONT2, WIDTH150, HEIGHT-DOWN-35, "Min. temp : " . $mintemp . " C",$blue); 106 imagestring($image, FONT2, WIDTH150, HEIGHT-DOWN-20, "Max. temp : " . $maxtemp . " C",$red); 107 108 $avgtemp = HEIGHT-DOWN - (($avgtemp - $lowtemp) * $dy); // linea media 109 imageline($image,SN+1, $avgtemp,
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

109 imageline($image,SN+1, $avgtemp, WIDTH-DX-1, $avgtemp, $green); 110 111 // posizionamento al primo punto 112 $prevx = ($data[0]['time'] $lowtime) * $dx; 113 $prevy = ($data[0]['c1'] $lowtemp) * $dy; 114 115 $pp=intval(0.5*(HEIGHT-DOWNUP)/$difftemp); 116 //$pp=1; // togli commento per visualizzare i dati grezzi 117 imagestring($image, FONT2, SN+20, 8, "Risoluzione: " . $pp,$grey); 118 119 $prevym=$prevy; 120 if($i<$datapoints-$pp) $prevxm=($data[intval($pp/2)]['time' - $lowtime) * $dx; 121 // Draw line from previous point to current point 122 for ($i = 1; $i < $datapoints; $i++) { 123 124 $x = ($data[$i]['time'] - $lowtime) * $dx; 125 $y = ($data[$i]['c1'] - $lowtemp) * $dy; 126 //imageline($image, $prevx + SN, HEIGHT-DOWN - $prevy, $x + SN, HEIGHT-DOWN - $y, $red); // dato grezzo 127
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

127 128 129 130 131

if($i<$datapoints-$pp) { $ym=0; $xm= ($data[$i+$pp/2]['time'] $lowtime) * $dx; 132 for($k=0;$k<$pp;$k++) $ym+=$data[$i+$k]['c1']; // sommo i dati 133 $ym=$ym/$pp; // e divido per fare la media 134 135 $ym=($ym - $lowtemp) * $dy; 136 imageline($image, $prevxm + SN, HEIGHT-DOWN - $prevym, $xm + SN, HEIGHT-DOWN - $ym, $blue); // dato medio 137 138 $prevym=$ym; 139 $prevxm=$xm; 140 } 141 142 $prevx = $x; 143 $prevy = $y; 144 } 145 146 // ora e data del grafico 147 $generated = 'Data e Ora: ' . date("r"); 148 imagestring($image, 149 FONT, 150 WIDTH/2 - (imagefontwidth(FONT) * strlen($generated)/2), 151 HEIGHT -DOWN+8,
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

151 152 153 154 155 156 157 158 159 160 161 162 163 164

HEIGHT -DOWN+8, $generated, $blue); // Output the image header('Content-Type: image/png'); imagepng($image); // Destroy it imagedestroy($image); } ?>

Purtoppo non posso descriverlo nei dettagli, ci vorebbe un intero articolo solo per questo. Ho comunque commentato estesamente il listato e qui vi sottolineo alcune delle pi importanti caratteristiche. Innanzitutto nelle prime righe c la definizione della grandezza dellimmagine (larghezza e altezza) che a differenza dello script originale modifica anche la grandezza del grafico contenuto e non solo larea bianca sullo sfondo. Inoltre sono impostabili i 4 bordi in modo indipendente, in questo modo possibile ad esempio modificare lo script per inserire un logo, un titolo o quanto vogliate. Lintero script unottima partenza per una funzione che disegna grafici generici per cui spero possiate apprezzare lo sforzo che ho fatto per darvi un
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

listato di buon livello. Laltra modifica importante che ho voluto apportare riguarda la visualizzazione. Qui sotto vi mostro la visualizzazione originale di un campione di dati raccolto:

Come potete vedere se lescursione termica piccola si nota vistosamente il rumore di fondo delle misurazioni il che decisamente brutto da vedersi. Lo stesso comportamento lo potete vedere negli articoli da cui ho preso ispirazione. A tal proposito ho creato un semplice
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

algoritmo che visualizza non il dato grezzo com acquisito ma mostra la media di tot punti che lo succedono, fatto che per impedisce di visualizzare gli ultimi dati acquisiti in quanto non hanno un campione dati sufficiente per creare la media. Quanti punti dobbiamo usare per la media? Pi ne usiamo e pi il grafico lineare ed omogeneo ma meno sensibile alle variazioni termiche e in pi si riduce il campione dati utilizzabile. Ho fatto perci delle prove ed ho automatizzato il processo facendo in modo che il numero di punti varia al variare dellescursione termica da visualizzare in modo da ottenere sempre il miglior bilanciamento. Il risultato il seguente:

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

E per finire vi mostro la sovrapposizione dei due grafici. Per fare ci non dovete far altro che intervenire sulle linee di listato che sono commentate ed autoesplicative. Vi faccio notare che in alto a sinistra, sotto la voce risoluzione scritto il numero di punti interpolati.

Purtoppo nel grafico a bassa risoluzione la linea blu viene


open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

sovrastata e si vede male, ma vi assicuro che su un grafico 14001000 f decisamente unaltro effetto. Ultima modifica fatta riguarda la visualizzazione dei gradi celsius sullasse Y, infatti se ci sono grosse escursioni termiche i numeri si avvicinano al punto da non essere pi leggibili per la loro sovrapposizione, motivo per cui nel caso ci sia uneccessiva vicinanza vengono visualizzati solo i numeri pari, olte alla temperatura minima in blu e massima in rosso. Come sempre vi faccio notare che anche se non capite nulla del listato, potete semplicemente metterlo cos com su un server, nella stessa cartella in cui ci sono i dati di temperatura raccolti, e lo richiamate via web per avere il grafico bello che pronto. Be Sociable, Share!

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Tw eet

Like

Share

Articoli correlati: 1. Arduino e sensore 1wire DS18B20 2. Arduino, sensore 1wire DS18B20 e shield Ethernet. 3. RS232 con bus 1Wire: leggere la temperatura dai sensori ds18b20 4. RS232 con bus 1wire: dalla teoria alla pratica 5. 1wire microlan introduzione e convertitore seriale Articoli correlati elaborati dal plugin Yet Another Related Posts.

Stefano

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Stefano Smania, medico radiologo Programma in C dalla fine degli anni 80. Ha conoscenze discrete di C++, php, javascript, html, sql. Possiede approfondite conoscienze sullo standard DICOM. Bazzica con l'elettronica e unisce le diverse passioni in un progetto di domotica. Ha realizzato da solo un piano della propria casa, dal rivestimento termico, ai muri interni, l'impianto elettrico e domotico, idraulico, riscaldamento a pavimento, infissi e quant'altro vi venga in mente. Gli piace cucinare ma ha poco tempo per applicarvisi. Scrive questi articoli nella speranza che servano a qualcuno
Posted by Stefano at 13:39 Tagged w ith: arduino, dallas, ds18b20, ethernet, grafico, maxim, temperatura, w eb

Leave a Reply
You must be logged in to post a comment.

Arduino, sensore 1wire DS18B20 e shield RS232: interagire con il bus Ethernet. 1wire

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

2011 McMajan

Suffusion theme by Sayontan Sinha

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com