Sei sulla pagina 1di 26

Search Programmazione WxWidgets CodeBlocks Android Elettronica Arduino 1-Wire

AA

ott

13
2012

Arduino, sensore 1wire DS18B20 e shield Ethernet.


1-Wire, Arduino, Elettronica Add comments

69.164.218.62 Utente non autenticato Registrati Collegati

Oggi approfondiamo il precedente articolo e aggiungiamo lethernet shield in modo che il nostro Aruino possa inviare i dati via
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

Italiano English

pdfcrowd.com

ethernet. Lidea quella di usare il router di casa sia per la connessione tcp/ip che per lalimentazione visto che provvisto di una porta UBS. Prima di cominciare dobbiamo per dare uno sguardo all ethernet shield.

Ethernet Shield introduzione


Lethernet shield una scheda che si incastra sopra il nostro amato Arduino e ne espande le possibilit permettendo una connessione alla rete ethernet 10/100 con la possibilit di aprire fino a 4 connessioni contemporanee. Vi ho

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)

open in browser PRO version

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

pdfcrowd.com

WEB (1)

allegato una foto qui vicino per chi non la conoscesse. Si vedono chiaramente nella parte inferiori i pin che vanno ad accoppiarsi a quelli di Arduino, la replica degli stessi nella parte superiore della scheda, il connettore RJ45 per la connessione del cavo ethernet e, non meno importante, uno slot microSD nella parte posteriore che permette di usare una scheda per la memorizzazione di dati, ottima per tutti i ditpi di datalogger che possano venirci in mente. Come sempre essendo questo il primo articolo sullargomento ci accontenteremo delle funzionalit basilari per non mettere troppa carne al fuoco, ma avremo sicuramente occasione di approfondire e creare progetti sempre pi complessi. La shield permette di montare anche un modulo opzionale (si pu acuistare anche gi completa) per usufruire della Power Over Ethernet, ossia la possibilit di prelevare corrente per lalimentazione (fino 15W) direttamente dal cavo ethernet, cosa che in alcuni frangenti davvero utile dato che permette di alimentare il nostro Arduino senza ulteriori cavi aggiuntivi. Tutte queste meraviglie ovviamente vanno ad occupare alcuni dei pin di Arduino, pi precisamente parliamo del 4,10,11,12 e 13. Fra di essi il 4 condiviso dalla scheda ethernet e dalla microSD, ne
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

Wordpress (1)

Elettronica Sito ufficiale Arduino

Programmazione HomePage Code::Blocks HomePage wxWidgets

Blog QR Code

pdfcrowd.com

deriva che le due non possono essere usate in contemporanea ma solo alternativamente.

Iniziamo
Le prime cose da fare sono definire il MAC Address della scheda e lindirizzo IP. Questultimo pu essere anche ottenuto tramite DHCP ma per ora cerchiamo di mantenere le cose semplici. Io penso che chi legge questo tutorial abbia gi chiaro di cosa st parlando, nel caso non fosse cos fatemi sapere, magari ci scrivo un articolo di approfondimento. Per quanto riguarda il MAC Address, nelle versioni pi recenti dellethernet shield trovate unetichetta adesiva sul versante inferiore che lo riporta, in caso contrario dovrete inventarne uno. 1 byte mac[] = { 0x90, 0xA2, 0xDA, 0x00,0x46, 0xE6 }; 2 byte ip[] = {192, 168, 1, 15}; //nell'ultima versione della libreria possiamo utilizzare IPAddress ip(192,168,1,25); Fatto ci dobbiamo inizializzare il chip della Ethernet Shield con quei parametri e per farlo usiamo:

open in browser PRO version

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

pdfcrowd.com

1 Ethernet.begin(mac, ip); A questo punto dobbiamo decidere come procedere. Potremmo usare la scheda come un client che ad ogni lettura invia i dati di temperatura ad un server, oppure, viceversa, potremmo usare Arduino come server ed inviare i dati di temperatura quando giunge una richiesta dallesterno ad esempio da una pagina web o un software remoto. Nulla vieta di fare entrambe le cose, ma per ora manteniamo un profilo basso limitandoci a rispondere ad una richiesta da parte di una pagina web. Perusare Arduino come server usiamo listruzione: 1 EthernetServer ArduinoServer(80); che crea un oggetto EthernetServer dal nome ArduinoServer che star in ascolto sulla porta 80, ossia la classica porta http. Attenzione che in rete ho trovato alcuni esempi in cui usato Server anzich EthernetServer, probabilmente perch nel tempo hanno modificato il software. Una volta definito loggetto utilizziamo 1 ArduinoServer.begin(); per attivarlo e metterlo in ascolto.
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Ora mettiamo tutto insieme e prepariamo la piccola sketch qui sotto. Vi faccio notare anche le due librerie incluse, ossia la ovvia Ethernet e la meno ovvia SPI. Questultima indispensabile perh la comunicazione fra Arduino ed Ethernet Shield / MicroSD avviene tramite bus SPI, argomento che ignoreremo totalmente in quanto sar oggetto di articoli futuri. Mettiamo tutto insieme e carichiamo questa shield di prova: 01 #include <SPI.h> 02 #include <Ethernet.h> 03 04 byte mac[] = { 0x90, 0xA2, 0xDA, 0x00,0x46, 0xE6 }; // MAC Address 05 byte ip[] = {192, 168, 1, 25}; // Indirizzo IP 06 07 EthernetServer ArduinoServer(80); // creazione oggetto EthernetServer 08 09 void setup() 10 { 11 Ethernet.begin(mac, ip); // Inizializzo il chip della scheda ethernet 12 ArduinoServer.begin(); //Inizializzo il server in ascolto sulla porta 80 13 }
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

13 14 15 16 17

void loop() { delay(10); // non faccio nulla di particolare 18 } La sketch qui sopra non f nulla di particolare se si esclude lattivazione della scheda ethernet e lavvio del server che ascolta sulla porta 80. E comunque una base molto utile in quanto ci permette di fare un ping da PC e vedere se ci sono problemi di connessione.

Nel mio caso il ping mi restituisce quanto visibile nella foto sopra, quindi tutto funziona a dovere. A dirla tutta nel preparare questo articolo ho vuto un grosso problema che mi ha fatto perdere due giornate intere. In realt non cera modo di riuscire a fare il ping sulla scheda nonostante fossi
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

certo che era tutto fatto correttamente. Ho cercto in rete ma non ho trovato nessuna soluzione. Alla fine, casualmente, ho collegato un pc aggiuntivo via cavo al router, un pc che dovrei riparare e, da quando lho connesso, la ethernet shield diventata improvvisamente visibile. Non ho capito se il problema del mio router o meno. Tra le altre vi aggiungo che se invece di usare lip statico utilizzavo lassegnamento tramite DHCP, la scheda funzionava senza problemi motivo per cui il problema si verifica solamente con luso dellIP statico e nemmeno specificando subnet, dns e gateway le cose cambiavano (cosa che risulta ovvia andando a guardare il codice della libreria ethernet). Spero di non avervi annoiato con questo angolo di tecnicismi ma se vi ritrovate con lo stesso problema forse avete una soluzione: collegate un PC aggiuntivo al router (come se una persona normale avesse PC extra da attaccare per far funzionare Arduino ).

Rispondere alle richieste del client


Ora dobbiamo proseguire e creare la porzione di software che risponde al client, che nel nostro cso sar un webbrowser. In poche parole quando sul web broswer andiamo a scrivere lindirizzo IP della scheda ethernet, arriver una
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

richiesta ad Arduino alla quale dobbiamo rispondere in qualche modo. Per far questo usiamo la funzione available() che permette di conoscere se sul nostro server ci sono richieste client pendenti. In caso affermativo viene ritornato true per cui possiamo intercettare la richiesta esterna ed andare ad analizzarla: 1 Client pc_client = ArduinoServer.available(); 2 if (pc_client == true) { ....} A questo punto possiamo usare un un loop per continuare a leggere i dati in arrivo dal client finch questo rimane connesso: 1 while(pc_client.connected()){ ... } Verificato che il client connesso andiamo a vedere se ci sono dati da leggere, in caso affermativo, per questo step, scriviamo i dati su porta seriale cos possiamo verificare se i dati giungono correttamente al nostro sistema. Ora mettiamo tutto insieme e compiliamo la sketch cos modificata:
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

01 //Librerie impiegate per il progetto 02 #include <SPI.h> 03 #include <Ethernet.h> 04 05 byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x46, 0xE6 }; 06 IPAddress ip(192,168,1,25); // ho usato la nuova forma 07 char RX; 08 09 EthernetServer ArduinoServer(80); 10 11 void setup() 12 { 13 14 Serial.begin(9600); 15 Ethernet.begin(mac,ip); 16 Serial.println(Ethernet.localIP()); 17 ArduinoServer.begin(); 18 } 19 20 void loop() 21 { 22 EthernetClient pc_client = ArduinoServer.available(); 23 if (pc_client != false) 24 { 25 while(pc_client.connected()) 26 { 27 if (pc_client.available()) 28 { 29 RX = pc_client.read();
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

29 30 31 32 33 34 35

RX = pc_client.read(); Serial.write(RX); } } } delay(200); }

A questo punto se nella barra degli indirizzi del nostro browser inseriamo lindirizzo della scheda che nellesempio 192.168.1.15, nel monitor seriale di Arduino dovrebbe comparire una schermata simile a quella qui sotto:

open in browser PRO version

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

pdfcrowd.com

Queste scritte non sono altro che la richiesta da parte del browser di aprire una comunicazione http. Ora il nostro compito andare ad interpretare queste strighe e rispondere al browser in modo che possa visualizzare ci che noi vogliamo. In realt quanto vi dico non del tutto vero nel senso che a noi non interessa interpretare correttamente la richiesta del browser perch il nostro output sar sempre lo stesso. A noi interessa solamente che ci venga fatta una richiesta a cui inviare la risposta. Sarebbe invece molto diverso se creassimo una sorta di vero e proprio web server con pagine multiple e quindi risposte diverse a seconda dei casi. Quindi non facciamo altro che ignorare quanto ci giunge sino ad intercettare il carattere di fine richiesta (\n) a seguito del quale inviamo la nostra risposta. La risposta preveder una prima parte che lheader http e successivamente il codice html che vogliamo inviare per formare la pagina di risposta. A questo punto chiudiamo il client precedentemente aperto ed il gioco fatto. Vediamo la sketch completa: 01 //Librerie impiegate per il progetto
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

progetto 02 #include <SPI.h> 03 #include <Ethernet.h> 04 05 byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x46, 0xE6 }; 06 IPAddress ip(192,168,1,25); // ho usato la nuova forma 07 char RX; 08 09 EthernetServer ArduinoServer(80); 10 11 void setup() 12 { 13 14 Serial.begin(9600); 15 Ethernet.begin(mac,ip); 16 Serial.println(Ethernet.localIP()); 17 ArduinoServer.begin(); 18 } 19 20 void loop() 21 { 22 EthernetClient pc_client = ArduinoServer.available(); 23 if (pc_client != false) 24 { 25 while(pc_client.connected()) 26 { 27 if (pc_client.available()) 28 { 29 RX = pc_client.read(); 30 Serial.write(RX); 31 if (RX == '\n') //Richiesta
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

31 if (RX == '\n') //Richiesta terminata - Invio la risposta al client 32 { 33 pc_client.println("HTTP/1.1 200 OK"); //invio lo status code 34 pc_client.println("Content-Type: text/html"); //imposto il data type 35 pc_client.println(); 36 pc_client.print("<html><body><h1>"); //inizia codice html 37 pc_client.print("Ciao, io sono Arduino</h1></body></html>"); 38 delay(5); // piccolo ritardo 39 break; // e chiudiamo il ciclo 40 } 41 } 42 43 } 44 45 pc_client.stop(); // termino la comunicazione 46 } 47 delay(200); 48 } Bene, a queso punto se riprovate a scrivere nella barra dl vostro browser lindirizzo 192.168.1.25 otterrete il risultano che potete vedere nella prossima schermata.

open in browser PRO version

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

pdfcrowd.com

A questo punto la parte pi importante del lavoro fatta. Non ci resta che unire il lavoro di oggi con quello dello scorso articolo per fare in modo che al posto della scritta Ciao, io sono Arduino compaiano i valori di temperatura rilevati. Per far ci ho pensato di fare anche una modifica al precedente progetto. Infatti ci vuole mediamente un secondo per ogni misura su ogni sensore per cui, nel caso di una decina di secondi, ci vorrebbe tutto quel tempo prima di avere la pagina web pronta con le temperature. Per questo motivo mi pare pi saggio usre un array per memorizzare le temperature che poi vengono inviate in tempo reale qualora vengano richieste via web. Il progetto completo qui sotto. 001 #define N_SENSORI 10 002
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

002 003 004 005 006 007 008 009 010

#include <OneWire.h> #include <SPI.h> #include <Ethernet.h> byte G_addr[N_SENSORI][8]; //qui memorizzo fino a 10 indirizzi byte G_Devices; // variabile usata per tenere traccia del numero di sensori riconosciuti nel bus float temps[N_SENSORI]; // memorizzo i valori di temperatura OneWire ow(8); // inizializza il bus onewire sulla porta n8 (se avete collegato i sensori su un'altro pin dovete modificare qui) byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x46, 0xE6 }; IPAddress ip(192,168,1,25); // ho usato la nuova forma char RX; unsigned long tempo=0; float GetTemp(OneWire *,byte *); void PrintAddress(byte *); void lookUpSensors(); int CheckSensor(byte *); EthernetServer ArduinoServer(80); void setup(void) { Serial.begin(9600);// inizializza la porta seriale a 9600
Are you a developer? Try out the HTML to PDF API

011 012 013 014 015 016 017 018 019 020 021 022 023 024 025

open in browser PRO version

pdfcrowd.com

026 027 028 029 030

031 032 033 void lookUpSensors() 034 { 035 byte address[8]; // questo array conterr l'indirizzo locale dei sensori 036 037 Serial.print("--Ricerca avviata-"); // avvia la ricerca e lo scrive sulla porta seriale 038 039 while (ow.search(address)) // loop finch trova nuovi dispositivi 040 { 041 // Se il primo byte dell'indirizzo 0x10, si tratta di una sonda DS18S20 042 // il primo byte dell'indirizzo identifica il tipo di sensore 043 // se 0x10 un DS18S20, se 0x28 un DS18B20 (notare la S e B) 044 if (address[0] == 0x10 || address[0] == 0x28) 045 {
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

la porta seriale a 9600 Ethernet.begin(mac,ip); Serial.println(Ethernet.localIP()); ArduinoServer.begin(); G_Devices=0; // imposta a 0 il numero di sensori attualmente riconosciuti lookUpSensors(); // avvia la ricerca delle sonde di temperatura }

pdfcrowd.com

045 { 046 if(CheckSensor(address)==1) //crc ok 047 { 048 Serial.println(""); 049 if (address[0] == 0x10) Serial.print("Found DS18S20 : "); // notare che la S invece che la B 050 else if (address[0] == 0x28) Serial.print("Found DS18B20 : "); 051 PrintAddress(address); 052 for(int aa=0;aa<8;aa++) G_addr[G_Devices][aa]=address[aa]; // copia l'indirizzo 053 G_Devices++; // incrementa il numero di devices memorizzati 054 } 055 } 056 057 }//end while 058 Serial.println(""); 059 Serial.println("--Ricerca terminata--"); 060 } 061 062 void loop(void) 063 { 064 if(millis()>tempo+60000 || tempo==0) 065 { 066 067 float temperatura; // uso questa variabile per tenere la lettura della temperatura
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092

della temperatura for(int num=0;num<G_Devices;num++) // vado a leggere tutti i sensori registrati { temperatura=GetTemp(&G_addr[num][0]); // lego la temperatura PrintAddress(G_addr[num]); Serial.print(" -> "); Serial.println(temperatura); temps[num]=temperatura; } tempo=millis(); } EthernetClient pc_client = ArduinoServer.available(); if (pc_client != false) { while(pc_client.connected()) { if (pc_client.available()) { RX = pc_client.read(); Serial.write(RX); if (RX == '\n') //Richiesta terminata - Invio la risposta al client { pc_client.println("HTTP/1.1 200 OK"); //invio lo status code pc_client.println("Content-Type: text/html"); //imposto il data type
Are you a developer? Try out the HTML to PDF API

open in browser PRO version

pdfcrowd.com

text/html"); //imposto il data type 093 pc_client.println(); 094 pc_client.print("<html><body>"); //inizia codice html 095 096 pc_client.print("<h1>Arduino Misura temperature</h1>"); 097 for(int num=0;num<G_Devices;num++) // vado a leggere tutti i sensori registrati 098 { 099 pc_client.println("<br>Sensore "); 100 pc_client.print(num); 101 pc_client.print(" : "); 102 pc_client.print(temps[num]); 103 104 } 105 pc_client.print("</body></html>"); 106 107 delay(5); // piccolo ritardo 108 109 break; // e chiudiamo il ciclo 110 } 111 } 112 113 } 114 pc_client.stop(); // termino la comunicazione 115 } 116 117 delay(100); // aspetto 5 secondi prima di fare una nuova misurazione 118 } 119
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

119 120 121 122 123 124 125 126 127 128 129 130 131

132 133 present = ow.reset(); 134 135 ow.select(addr); 136 ow.write(0xBE); // Read Scratchpad 137 138 for ( i = 0; i < 9; i++) data[i] = ow.read();// we need 9 bytes //Serial.print(data[i], HEX); 139 140 int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract; 141 142 double result;
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

float GetTemp(byte * addr) { byte present = 0; byte data[12]; int i; byte address[8]; for(i=0;i<8;i++) address[i]=*(addr+i); //copia l'indirizzo nella stringa locale ow.reset(); ow.select(addr); ow.write(0x44,1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it.

pdfcrowd.com

142 143 144 145 146 147

double result; LowByte = data[0]; HighByte = data[1];

TReading = (HighByte << 8) + LowByte; 148 SignBit = TReading & 0x8000; // test most sig bit 149 150 if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp // negative 151 152 Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25 153 154 Whole = Tc_100 / 100; // separate off the whole and fractional portions 155 Fract = Tc_100 % 100; 156 157 result = Whole; 158 result += ((double)Fract/100); 159 160 if(SignBit) result *= -1; 161 162 return result; 163 164 } 165 166 void PrintAddress(byte * address) 167 {
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

167 168 169 170 171

172 173 174 175 176 177 int CheckSensor(byte * address) 178 { 179 if (OneWire::crc8(address, 7) != *(address+7)) return(-1);// faccio il controllo del CRC8, se fallito ritorno -1 180 else return(1); // cr8 OK, ritorno 1 181 } Per concludere vorrei sottolineare che abbiamo in parte sorvolato su alcuni dettagli come la possibilit di usare il DHCP, specificare il gateway, dns, subnet-mask cosa che andremo ad approfondire in prossimi articoli anche perch nelle ultime versioni della liberia ethernet ci sono state sostanziali modifiche rispetto al passato che di fatto rendono incompatibili gran parte delle sketch che trovate attualmente in rete. Nel prossimo articolo vediamo come inviare i dati ad un server esterno e fare in modo che uno
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

{ int i; for (i=0;i<8;i++) { if (address[i] < 9) Serial.print("0"); Serial.print(address[i],HEX); if (i<7) Serial.print("-"); } }

pdfcrowd.com

script php vada a preparare le pagine web per noi anzich farlo con Arduino. Be Sociable, Share!

Tw eet

Like

Share

Articoli correlati: 1. Arduino e sensore 1wire DS18B20 2. Arduino, 1wire DS18B20 e datalogger su internet 3. RS232 con bus 1Wire: leggere la temperatura dai sensori ds18b20 4. Arduino, primo progetto completo.
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

5. Arduino e gli ingressi analogici Articoli correlati elaborati dal plugin Yet Another Related Posts.

Stefano

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 19:03 Tagged w ith: arduino, ds18b20, ethernet shield, temperatura, w eb

One Response to Arduino, sensore 1wire DS18B20 e shield Ethernet.


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

pdfcrowd.com

1.

Arduino, 1wire DS18B20 e datalogger su internet | McMajan says:


%e %B %Y at %H:%M [...] Elettronica Add comments ott 172012 Oggi sviluppiamo ulteriore il precedente progetto e vediamo come inviare le letture delle temperature dei sensori DS18B20 su un server remoto [...]

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

Arduino e sensore 1wire DS18B20

Arduino, 1wire DS18B20 e datalogger su internet

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

Potrebbero piacerti anche