Search Programmazione WxWidgets CodeBlocks Android Elettronica Arduino 1-Wire

AA

A

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 l’ethernet 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. L’idea è quella di usare il router di casa sia per la connessione tcp/ip che per l’alimentazione visto che è provvisto di una porta UBS. Prima di cominciare dobbiamo però dare uno sguardo all’ ethernet shield.

Ethernet Shield – introduzione
L’ethernet 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

Tutte queste meraviglie ovviamente vanno ad occupare alcuni dei pin di Arduino. ossia la possibilità di prelevare corrente per l’alimentazione (fino 15W) direttamente dal cavo ethernet. 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. La shield permette di montare anche un modulo opzionale (si può acuistare anche già completa) per usufruire della “Power Over Ethernet”. ma avremo sicuramente occasione di approfondire e creare progetti sempre più complessi. cosa che in alcuni frangenti è davvero utile dato che permette di alimentare il nostro Arduino senza ulteriori cavi aggiuntivi.12 e 13. non meno importante. il connettore RJ45 per la connessione del cavo ethernet e. la replica degli stessi nella parte superiore della scheda.11. più precisamente parliamo del 4. ottima per tutti i ditpi di datalogger che possano venirci in mente. uno slot microSD nella parte posteriore che permette di usare una scheda per la memorizzazione di dati.WEB (1) allegato una foto qui vicino per chi non la conoscesse.10.com . Come sempre essendo questo il primo articolo sull’argomento ci accontenteremo delle funzionalità basilari per non mettere troppa carne al fuoco. Si vedono chiaramente nella parte inferiori i pin che vanno ad accoppiarsi a quelli di Arduino.

0x00. 1. Iniziamo Le prime cose da fare sono definire il MAC Address della scheda e l’indirizzo IP.0x46. 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. 2 byte ip[] = {192. Quest’ultimo può essere anche ottenuto tramite DHCP ma per ora cerchiamo di mantenere le cose semplici. magari ci scrivo un articolo di approfondimento. nel caso non fosse così fatemi sapere.168. 15}.deriva che le due non possono essere usate in contemporanea ma solo alternativamente. 0xA2. 1 byte mac[] = { 0x90. nelle versioni più recenti dell’ethernet shield trovate un’etichetta adesiva sul versante inferiore che lo riporta.25). Per quanto riguarda il MAC Address.com . in caso contrario dovrete inventarne uno. Io penso che chi legge questo tutorial abbia già chiaro di cosa stò parlando. 0xE6 }. 168.1. //nell'ultima versione della libreria possiamo utilizzare IPAddress ip(192. 0xDA.

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

Mettiamo tutto insieme e carichiamo questa shield di prova: 01 #include <SPI. 1. // creazione oggetto EthernetServer 08 09 void setup() 10 { 11 Ethernet.h> 03 04 byte mac[] = { 0x90. 0xDA.h> 02 #include <Ethernet.com . Quest’ultima è 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.begin().0x46. // Indirizzo IP 06 07 EthernetServer ArduinoServer(80). 0xE6 }. Vi faccio notare anche le due librerie incluse.begin(mac.Ora mettiamo tutto insieme e prepariamo la piccola sketch qui sotto. ip). 25}. 168. 0xA2. ossia la ovvia Ethernet e la meno ovvia SPI. //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. // MAC Address 05 byte ip[] = {192. // Inizializzo il chip della scheda ethernet 12 ArduinoServer. 0x00.

13 14 15 16 17 } void loop() { delay(10). In realtà non c’era 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. quindi tutto funziona a dovere. Nel mio caso il ping mi restituisce quanto visibile nella foto sopra. E’ comunque una base molto utile in quanto ci permette di fare un ping da PC e vedere se ci sono problemi di connessione.com . // non faccio nulla di particolare 18 } La sketch qui sopra non fà nulla di particolare se si esclude l’attivazione della scheda ethernet e l’avvio del server che ascolta sulla porta 80. A dirla tutta nel preparare questo articolo ho vuto un grosso problema che mi ha fatto perdere due giornate intere.

Non ho capito se il problema è del mio router o meno. che nel nostro cso sarà un webbrowser. ho collegato un pc aggiuntivo via cavo al router. Tra le altre vi aggiungo che se invece di usare l’ip statico utilizzavo l’assegnamento tramite DHCP. Alla fine.com . la scheda funzionava senza problemi motivo per cui il problema si verifica solamente con l’uso dell’IP statico e nemmeno specificando subnet. In poche parole quando sul web broswer andiamo a scrivere l’indirizzo IP della scheda ethernet. Ho cercto in rete ma non ho trovato nessuna soluzione. la ethernet shield è diventata improvvisamente visibile. da quando l’ho connesso. 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. un pc che dovrei riparare e.certo che era tutto fatto correttamente. arriverà una open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. casualmente. dns e gateway le cose cambiavano (cosa che risulta ovvia andando a guardare il codice della libreria ethernet).

} 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. in caso affermativo. In caso affermativo viene ritornato true per cui possiamo intercettare la richiesta esterna ed andare ad analizzarla: 1 Client pc_client = ArduinoServer.com .. scriviamo i dati su porta seriale così possiamo verificare se i dati giungono correttamente al nostro sistema..connected()){ . } Verificato che il client è connesso andiamo a vedere se ci sono dati da leggere. 2 if (pc_client == true) { . Per far questo usiamo la funzione available() che permette di conoscere se sul nostro server ci sono richieste client pendenti. 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. per questo step.available().richiesta ad Arduino alla quale dobbiamo rispondere in qualche modo....

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

Serial.168.write(RX).com . 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.15.read(). } A questo punto se nella barra degli indirizzi del nostro browser inseriamo l’indirizzo della scheda che nell’esempio è 192. } } } delay(200).29 30 31 32 33 34 35 RX = pc_client.1.

Ora il nostro compito è andare ad interpretare queste strighe e rispondere al browser in modo che possa visualizzare ciò che noi vogliamo.com . 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.Queste scritte non sono altro che la richiesta da parte del browser di aprire una comunicazione http. A questo punto chiudiamo il client precedentemente aperto ed il gioco è fatto. 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. La risposta prevederà una prima parte che è l’header http e successivamente il codice html che vogliamo inviare per formare la pagina di risposta. 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. 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.

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

31 if (RX == '\n') //Richiesta terminata .Invio la risposta al client 32 { 33 pc_client. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.print("<html><body><h1>"). 38 delay(5).print("Ciao.25 otterrete il risultano che potete vedere nella prossima schermata.println("Content-Type: text/html").stop().1. // piccolo ritardo 39 break.1 200 OK"). 48 } Bene. a queso punto se riprovate a scrivere nella barra dl vostro browser l’indirizzo 192.168.com . // e chiudiamo il ciclo 40 } 41 } 42 43 } 44 45 pc_client. //imposto il data type 35 pc_client. // termino la comunicazione 46 } 47 delay(200). //inizia codice html 37 pc_client. 36 pc_client. io sono Arduino</h1></body></html>"). //invio lo status code 34 pc_client.println("HTTP/1.println().

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. 001 #define N_SENSORI 10 002 open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. nel caso di una decina di secondi. ci vorrebbe tutto quel tempo prima di avere la pagina web pronta con le temperature.com .A questo punto la parte più importante del lavoro è fatta. io sono Arduino” compaiano i valori di temperatura rilevati. Per far ciò ho pensato di fare anche una modifica al precedente progetto. Non ci resta che unire il lavoro di oggi con quello dello scorso articolo per fare in modo che al posto della scritta “Ciao. Infatti ci vuole mediamente un secondo per ogni misura su ogni sensore per cui. Il progetto completo è qui sotto.

0xA2.begin(9600).25). //qui memorizzo fino a 10 indirizzi byte G_Devices. void lookUpSensors(). 0xDA.byte *). unsigned long tempo=0.h> #include <SPI. EthernetServer ArduinoServer(80). void PrintAddress(byte *). float GetTemp(OneWire *. // variabile usata per tenere traccia del numero di sensori riconosciuti nel bus float temps[N_SENSORI]. // ho usato la nuova forma char RX.h> byte G_addr[N_SENSORI][8]. int CheckSensor(byte *). void setup(void) { Serial.// 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. // inizializza il bus onewire sulla porta n°8 (se avete collegato i sensori su un'altro pin dovete modificare qui) byte mac[] = { 0x90.002 003 004 005 006 007 008 009 010 #include <OneWire.h> #include <Ethernet.168.1.com . // memorizzo i valori di temperatura OneWire ow(8). 0xE6 }. 0x00. IPAddress ip(192. 0x46.

begin(mac.begin(). Serial.search(address)) // loop finchè trova nuovi dispositivi 040 { 041 // Se il primo byte dell'indirizzo è 0x10.026 027 028 029 030 031 032 033 void lookUpSensors() 034 { 035 byte address[8].println(Ethernet.print("--Ricerca avviata-"). // avvia la ricerca delle sonde di temperatura } pdfcrowd. // imposta a 0 il numero di sensori attualmente riconosciuti lookUpSensors(). // avvia la ricerca e lo scrive sulla porta seriale 038 039 while (ow. // questo array conterrà l'indirizzo locale dei sensori 036 037 Serial.localIP()). si tratta di una sonda DS18S20 042 // il primo byte dell'indirizzo identifica il tipo di sensore 043 // se 0x10 è un DS18S20.com . ArduinoServer. 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. G_Devices=0.ip).

println(""). // 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. // copia l'indirizzo 053 G_Devices++. 052 for(int aa=0.println("--Ricerca terminata--").print("Found DS18B20 : ").print("Found DS18S20 : ").com . 051 PrintAddress(address). // notare che la S invece che la B 050 else if (address[0] == 0x28) Serial.println(""). 049 if (address[0] == 0x10) Serial.045 { 046 if(CheckSensor(address)==1) //crc ok 047 { 048 Serial. // incrementa il numero di devices memorizzati 054 } 055 } 056 057 }//end while 058 Serial.aa++) G_addr[G_Devices][aa]=address[aa].aa<8. 059 Serial. 060 } 061 062 void loop(void) 063 { 064 if(millis()>tempo+60000 || tempo==0) 065 { 066 067 float temperatura.

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

println("<br>Sensore "). // piccolo ritardo 108 109 break.text/html"). //imposto il data type 093 pc_client. 103 104 } 105 pc_client.print(temps[num]).print("<h1>Arduino Misura temperature</h1>"). 106 107 delay(5). // e chiudiamo il ciclo 110 } 111 } 112 113 } 114 pc_client. 097 for(int num=0.print(" : ").print("</body></html>").print(num).com .print("<html><body>"). 100 pc_client. 101 pc_client. // 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.num<G_Devices. 094 pc_client. // termino la comunicazione 115 } 116 117 delay(100).println(). 102 pc_client. //inizia codice html 095 096 pc_client.num++) // vado a leggere tutti i sensori registrati 098 { 099 pc_client.stop().

1). with parasite power on at the end delay(1000). ow. ow.depower() here. int i. SignBit. TReading. pdfcrowd.119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 present = ow. byte data[12]. 134 135 ow. Tc_100.reset(). HEX). 139 140 int HighByte. LowByte. byte address[8].write(0xBE).print(data[i]. // Read Scratchpad 137 138 for ( i = 0. i < 9. 141 142 double result. Fract. //copia l'indirizzo nella stringa locale ow. Whole.com . open in browser PRO version Are you a developer? Try out the HTML to PDF API float GetTemp(byte * addr) { byte present = 0. maybe not // we might do a ds.select(addr). but the reset will take care of it.i<8.read(). i++) data[i] = ow.// we need 9 bytes //Serial.select(addr). // start conversion.write(0x44.reset(). for(i=0. 136 ow. // maybe 750ms is enough.i++) address[i]=*(addr+i).

// test most sig bit 149 150 if (SignBit) TReading = (TReading ^ 0xffff) + 1. 158 result += ((double)Fract/100). 156 157 result = Whole. 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. 161 162 return result.25 153 154 Whole = Tc_100 / 100.com . 148 SignBit = TReading & 0x8000. LowByte = data[0].0625) or 6. TReading = (HighByte << 8) + LowByte. // separate off the whole and fractional portions 155 Fract = Tc_100 % 100. // multiply by (100 * 0.142 143 144 145 146 147 double result. // 2's comp // negative 151 152 Tc_100 = (6 * TReading) + TReading / 4. HighByte = data[1]. 159 160 if(SignBit) result *= -1.

i<8. ritorno 1 181 } Per concludere vorrei sottolineare che abbiamo in parte sorvolato su alcuni dettagli come la possibilità di usare il DHCP. if (i<7) Serial.com . specificare il gateway.167 168 169 170 171 172 173 174 175 176 177 int CheckSensor(byte * address) 178 { 179 if (OneWire::crc8(address. se fallito ritorno -1 180 else return(1).print("0"). } } pdfcrowd.i++) { if (address[i] < 9) Serial. 7) != *(address+7)) return(-1).print("-"). for (i=0.print(address[i]. dns. 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. // cr8 OK.HEX). 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.// faccio il controllo del CRC8. Serial.

RS232 con bus 1Wire: leggere la temperatura dai sensori ds18b20 4. Arduino. Arduino. 1wire DS18B20 e datalogger su internet 3. Arduino e sensore 1wire DS18B20 2. Share! Tw eet 0 Like 0 0 Share Articoli correlati: 1.script php vada a preparare le pagine web per noi anzichè farlo con Arduino. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. primo progetto completo.com . Be Sociable.

5. l'impianto elettrico e domotico. idraulico. Gli piace cucinare ma ha poco tempo per applicarvisi. Ha realizzato da solo un piano della propria casa. Stefano Stefano Smania. php.” open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. html. Possiede approfondite conoscienze sullo standard DICOM. w eb One Response to “Arduino. Scrive questi articoli nella speranza che servano a qualcuno Posted by Stefano at 19:03 Tagged w ith: arduino. ai muri interni. infissi e quant'altro vi venga in mente. medico radiologo Programma in C dalla fine degli anni 80. riscaldamento a pavimento. ds18b20.com . Arduino e gli ingressi analogici Articoli correlati elaborati dal plugin Yet Another Related Posts. temperatura. Bazzica con l'elettronica e unisce le diverse passioni in un progetto di domotica. ethernet shield. dal rivestimento termico. Ha conoscenze discrete di C++. javascript. sql. sensore 1wire DS18B20 e shield Ethernet.

] 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 [..com . Arduino.. 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.] Leave a Reply You must be logged in to post a comment. 1wire DS18B20 e datalogger su internet | McMajan says: %e %B %Y at %H:%M [...1.