Sei sulla pagina 1di 21

Search Programmazione WxWidgets CodeBlocks Android Elettronica Arduino 1-Wire

AA

ott

07
2012

Arduino e sensore 1wire DS18B20


1-Wire, Arduino, Elettronica Add comments

69.164.218.62 Utente non autenticato Registrati Collegati

Nella scorso articolo abbiamo visto come creare un convertitore 1wire- RS232, oggi estendiamo largomento e colleghiamo il
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

Italiano English

pdfcrowd.com

sensore DS18B20 direttamente ad Arduino. Se ricordate, avevamo detto che le porte digitali di Arduino sono lideale per collegare direttamente questo tipo di sensori dato che forniscono segnali da 0 a 5V nativamente, senza nessuna interposizione di alcun tipo di adattatore. Tutto ci che ci servir sar, oltre ad Arduino, il sensore, qualche centimetro di cavo e una resistenza da 4.7K. In questo primo articolo vediamo come fare i collegamenti ed il software mentre in un secondo articolo vedremo come usare lethernet shield per inviare i dati ad un web-server per visualizzare i dati raccolti tramite una pagina web. Lo schema di collegamento molto semplice ed riassunto qui sotto; in particolare vi ho allegato sia lo schema con alimentazione diretta del sensore che con alimentazione parassita. Mi raccomando, in questultimo caso, di mettere a massa il pin Vdd (il terzo), ve lo dico perch in rete ho trovato degli schemi sbagliati in cui questo pin lasciato vuoto, senza collegamenti.
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) Wordpress (1)

Elettronica Sito ufficiale Arduino

Programmazione HomePage Code::Blocks HomePage wxWidgets

Blog QR Code

Come vedete nulla di complicato, con una bradbord ci vuole davvero pochissimo tempo per collegare il sensore. Il software invece un po pi complicato rispetto ai precedenti esempi di base. Se ricordt larticolo introduttivo u 1-wire, ricorderete che accennavo ai timing nella comunicazione con il sensore. Infatti la comunicazione avviente inviando sequenze di bit con tempistiche ben precise. Non preoccupatevi, non mia intenzione entrare in questo lungo capitolo, ma capirete che se dovessimo fare tutto da noi dovremmo iniziare a studiare il bus 1wire, i suoi timing ed iniziare a preparare il software di comunicazione, lavoro tuttaltro che semplice. Per fortuna per c chi
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

questo lavoro lha gi fatto per cui non ciresta che scaricare la libreria gi pronta. Per farlo andate sulla pagina per il download, scaricate la libreria e scompattatela direttamente nella directory libraries che trovate nel toolkit di sviluppo di arduino, quindi ci sar una nuova cartella OneWire in mezzo alle pre-esisteniti SPI,SD,Ethernet,Servo,etc. Il software funziona in questo modo: nella fase di inizializzazione scansiona il bus 1wire alla ricerca dei sensori connessi. Fra essi verifica quali sono i sensori di temperatura e ne memorizza gli indirizzi in un array. Finita questa fase entra nel loop principale nel quale v a leggere la temperatura di tutti i sensori per poi attendere 5 secondi e riprendere il ciclo di lettura. Le temperature vengono inviate sulla porta seriale dopo il codice esadecimale del singolo sensore. Nella parte iniziale del software vediamo linclusione di OneWire.h che va appunto ad includere la libreria 1Wire che avevamo scaricato precedentemente. Nelle riche successive vengono definite alcune variabili globali che sono G_addr dimensionata per memorizzare gli indirizzi di 10 sensori e G_Devices che memorizza quanti sensori
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

sono presenti nel bus. Si noti, poche istruzioni pi in basso, il costruttore OneWire ow(8); che definisce loggetto per la comunicazione col bus 1wire e che nello specifico caso indica essere collegato al pin digitale numero 8. Il software utilizza la funzione lookUpSensors per la ricerca dei sensori sul bus. Purtroppo non abbiamo ancora sufficienti conoscenze sul funzionamento del bus per poter comprendere esattamente come funziona, vedremo in uno specifico articolo i dettagli pi complessi, per ora basti comprendere che questa funzione memorizza gli indirizzi dei sensori trovati sul bus durante linizializzazione. Altre funzioni presenti nel software sono PrintAddress che si occupa di stampare lindirizzo esadecimale di un sensore sulla porta seriale e GetTemp che dato lindirizzo di un sensore e loggetto OneWire associato, restituisce la temperatura rilevata. Anche questa funzione risulta incomprensibile senza aver prima approfondito il funzionamento del bus, per cui per ora non ci resta che adattarci al semplice copia e incolla. Ho commentato i punti salienti del listato per migliorarne la comprensione. 001 #include <OneWire.h> 002
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

002 003 byte G_addr[10][8]; //qui memorizzo fino a 10 indirizzi 004 byte G_Devices; // variabile usata per tenere traccia del numero di sensori riconosciuti nel bus 005 OneWire ow(8); // inizializza il bus onewire sulla porta n8 (se avete collegato i sensori su un'altro pin dovete modificare qui) 006 007 float GetTemp(OneWire *,byte *); 008 void PrintAddress(byte *); 009 void lookUpSensors(); 010 int CheckSensor(byte *); 011 012 void setup(void) 013 { 014 Serial.begin(9600);// inizializza la porta seriale a 9600 015 G_Devices=0; // imposta a 0 il numero di sensori attualmente riconosciuti 016 lookUpSensors(); // avvia la ricerca delle sonde di temperatura 017 } 018 019 void lookUpSensors() 020 { 021 byte address[8]; // questo array conterr l'indirizzo locale dei sensori 022 023 Serial.print("--Ricerca avviata-open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

023 Serial.print("--Ricerca avviata-"); // avvia la ricerca e lo scrive sulla porta seriale 024 025 while (ow.search(address)) // loop finch trova nuovi dispositivi 026 { 027 // Se il primo byte dell'indirizzo 0x10, si tratta di una sonda DS18S20 028 // il primo byte dell'indirizzo identifica il tipo di sensore 029 // se 0x10 un DS18S20, se 0x28 un DS18B20 (notare la S e B) 030 if (address[0] == 0x10 || address[0] == 0x28) 031 { 032 if(CheckSensor(address)==1) //crc ok 033 { 034 Serial.println(""); 035 if (address[0] == 0x10) Serial.print("Found DS18S20 : "); // notare che la S invece che la B 036 else if (address[0] == 0x28) Serial.print("Found DS18B20 : "); 037 PrintAddress(address); 038 for(int aa=0;aa<8;aa++) G_addr[G_Devices][aa]=address[aa]; // copia l'indirizzo 039 G_Devices++; // incrementa il numero di devices memorizzati 040 } 041 }
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

041 042 043 044 045

}//end while Serial.println(""); Serial.println("--Ricerca terminata--"); 046 } 047 048 void loop(void) 049 { 050 float temperatura; // uso questa variabile per tenere la lettura della temperatura 051 for(int num=0;num<G_Devices;num++) // vado a leggere tutti i sensori registrati 052 { 053 temperatura=GetTemp(&G_addr[num][0]); // lego la temperatura 054 PrintAddress(G_addr[num]); 055 Serial.print(" -> "); 056 Serial.println(temperatura); 057 } 058 delay(5000); // aspetto 5 secondi prima di fare una nuova misurazione 059 } 060 061 float GetTemp(byte * addr) 062 { 063 byte present = 0; 064 byte data[12]; 065 int i; 066 byte address[8]; 067 for(i=0;i<8;i++)
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

067 for(i=0;i<8;i++) address[i]=*(addr+i); //copia l'indirizzo nella stringa locale 068 ow.reset(); 069 ow.select(addr); 070 ow.write(0x44,1); // start conversion, with parasite power on at the end 071 delay(1000); // maybe 750ms is enough, maybe not 072 // we might do a ds.depower() here, but the reset will take care of it. 073 074 present = ow.reset(); 075 076 ow.select(addr); 077 ow.write(0xBE); // Read Scratchpad 078 079 for ( i = 0; i < 9; i++) data[i] = ow.read();// we need 9 bytes //Serial.print(data[i], HEX); 080 081 int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract; 082 083 double result; 084 085 LowByte = data[0]; 086 HighByte = data[1]; 087 088 TReading = (HighByte << 8) + LowByte; 089 SignBit = TReading & 0x8000; //
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

089 SignBit = TReading & 0x8000; // test most sig bit 090 091 if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp // negative 092 093 Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25 094 095 Whole = Tc_100 / 100; // separate off the whole and fractional portions 096 Fract = Tc_100 % 100; 097 098 result = Whole; 099 result += ((double)Fract/100); 100 101 if(SignBit) result *= -1; 102 103 return result; 104 105 } 106 107 void PrintAddress(byte * address) 108 { 109 int i; 110 for (i=0;i<8;i++) 111 { 112 if (address[i] < 9) Serial.print("0"); 113 Serial.print(address[i],HEX); 114 if (i<7) Serial.print("-");
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

114 115 116 117 118 119 120

if (i<7) Serial.print("-"); } }

int CheckSensor(byte * address) { if (OneWire::crc8(address, 7) != *(address+7)) return(-1);// faccio il controllo del CRC8, se fallito ritorno -1 121 else return(1); // cr8 OK, ritorno 1 122 } Se avete compilato ed inviato la sketch ad Arduino, potete aprire il monitor seriale e vedrete una schermata simile alla seguente. Nel mio caso ci sono due sensori; ogni 5 secondi viene rilevata la temperatura e scritta vicino al codice
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

esadecimale del sensore. Mi rendo conto di aver trattato in modo superficiale lintimo funzionamento del bus, ma vorrei che trasparisse che pur non conoscendo il reale funzionamento di questi sensori, con pochi fili ed un sensore collegati ad Arduino conditi con poche linee di codice che potete benissimo copiare ottenete un termometro digitale. Potreste obiettare che con un sensore analogico la via sarebbe molto pi semplice, certo, ma come li collegate 100 sensori? Secondo me il nocciolo della questione questo: se vi serve un sensore unico posizionano vicino al vostro Arduino allora meglio usare un sensore analogico, ma se pensate di mettere una miriade di sensori in giro per la casa il bus 1-wire sicuramente la soluzione giusta per voi. Inoltre non dimentichiamoci che sul bus 1-wire possono essere collegati altri tipo di sensori / dispositivi e non solo sensori di temperatura. Se unite i contenuti di questo articolo con quello in cui si spiegava il collegamento di un rel ecco che ne salta fuori un termostato che potete tranquillamente usare magari per sostituire un vechio termostato analogico. Certo sarebbe meglio aggiungere un display e almeno un potenziometro per regolare la temperatura, ma gi cos com potrebbe essere usato come un rudimentale termostato a
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

essere usato come un rudimentale termostato a temperatura fissa. Be Sociable, Share!

Tw eet

Like

Share

Articoli correlati: 1. Arduino, sensore 1wire DS18B20 e shield Ethernet. 2. Arduino, 1wire DS18B20 e datalogger su internet 3. RS232 con bus 1Wire: leggere la temperatura dai sensori ds18b20 4. iButton: creare chiavi elettroniche con Arduino. 5. RS232 con bus 1wire: dalla teoria alla pratica
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

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 00:26 Tagged w ith: arduino, dallas, ds18b20, elettronica, maxim

9 Responses to Arduino e sensore 1wire DS18B20

1.

Arduino, sensore 1wire DS18B20 e shield Ethernet. |


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

open in browser PRO version

pdfcrowd.com

McMajan says:
%e %B %Y at %H:%M [...] Arduino, Elettronica Add comments ott 132012 Oggi approfondiamo il precedente articolo e aggiungiamo lethernet shield in modo che il nostro Aruino possa inviare i dati [...]

2.

marco says:
%e %B %Y at %H:%M

ciao, innanzitutto, complimenti per il sito e per i progetti interessantissimi.e possibile nella schermata seriale sostituire i codici deisensori con un nome? mi piacerebbe aggiungere un display ed un paio di relais ma non riesco a capire come integrarli (a livello di sketch) grazie mille e di nuovo, complimenti Fare il login per rispondere

Stefano says:
%e %B %Y at %H:%M Ciao. Immagino che con nome intendi qualcosa tipo temperatura esterna, o temperatura bagno, etc. Certo che puoi farlo, ma ti sar meno semplie del open in browser PRO version Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Certo che puoi farlo, ma ti sar meno semplie del previsto. La via pi semplice quello di scovare le varie ROM dei sensori collegati, poi modificare la sketch in modo che se riconosce quel valore fra quelli noti ti scrive il nome da te scelto, altrimenti lascia il numero della ROM. Devii perci crearti un doppio array allinizio per memorizzare sia gli indirizzo noti, sia le stringhe da stampare. A questo punto deve essere modificata la funzione PrintAddress che per prima cosa deve verificare se la ROM tra quelle conosciute e nel caso affermativo stampa il nome da te scelto, altrimenti scrive il codice della ROM. Il lato negativo di questo approccio che per ogni sensore aggiunto devi modificare la sketch. Lalternativa sfruttare la porta usb per comunicare con la sketck, in questo caso si potrebbe configurare Arduino per accettare comandi dallesterno e quindi diventerebbe possibile modificare, aggiungere o rimuovere i nomi direttamente da PC, ma ci implica un maggior numero di modifiche. Uno dei prossimi progetti sar proprio un termostato con display, per non ho il materiale in casa per cui devo prima reperire i materiali che mi servono. Per quanto riguarda lapplicazione pratica ti consiglio di aggiungere due array allinizio, uno di tipo byte G_addr_Noti[10][8]; ed uno G_addr_Nomi[10][30]; // previsti 30 caratteri per nome. Poi nella fase di inizializzazione copi metti i nomi delle ROM note nel primo array (mettendo a 0 quelle che non usi) e nellaltro ci metti i nomi. Poi nella PrintAddress fai prima un confronto per verificare la presenza o meno fra le ROM note e con un if decidi se stampare il nome

open in browser PRO version

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

pdfcrowd.com

o la ROM. Se non ti bastano queste notizi fammi sapere, magari faccio io le modifiche e le metto in un articoletto di approfondimento. Fare il login per rispondere

Roberto says:
%e %B %Y at %H:%M

Intanto ottime spiegazioni e complimenti, mi interessa molto per la domotica della mia casa per controllare le temperature ambientali e regolarle usando arduino come termostato che controlla le valvole dei termosifoni (on off delle mandate) . Mi interessa moltissimo questa modifica del nome. Fare il login per rispondere

3.

magerluc says:
%e %B %Y at %H:%M

Ciao e vivissimi complimenti! Quanti sensori si riescono a leggere con la configurazione da te descritta? C un limite fisico oppure se ne possono mettere abbastanza da riempire tutta la casa? Grazie

open in browser PRO version

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

pdfcrowd.com

Fare il login per rispondere

Stefano says:
%e %B %Y at %H:%M Grazie per i complimenti, mi fanno sempre molto piacere. Per quanto riguarda la tua domanda, la risposta era esposta nella breve descrizione del bus 1-wire che ho fatto nellarticolo che trovi al seguente indirizzo: http://www.mcmajan.com/mcmajanwpr/?p=971 . Comunque a meno che tu non abbia un castello come casa, i limiti del bus 1wire sono trscurabili. In rete esiste una guida tecnica molto dettagliata su come calcolare il numero di sensori in rapporto alla configurazione della rete 1-wire ma molto tecnico e necessita di conoscenze pi approfondite che in parte vengono descritte in 3 articoli successivi a questo, dove di parla di 1 wire e porta seriale. Comunque, senza scendere in dettagli, la cosa migliore ricordare che possiamo mettere 100 sensori entro 100 metri di distanza; sicuramente unapprosimazione ma va pi che bene per capire se rientriamo nei limiti del nostro progetto. Ricorda che questi sono limiti per singola linea ma nessuno ci vieta di usare in contemporanea pi linee in parallelo open in browser PRO version Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

anche su singolo Arduino. S hai altre domande scrivi pure, magari con qualche giorno di ritardo ma rispondo sempre. Fare il login per rispondere

Wijdane says:
%e %B %Y at %H:%M

If you cant manage to get the etirne circuit flexible, a compromise would to make the strips connecting the boards to be flexible. Key Factor: Since its flexible, the number 1 priority should be durability. These boards should last as long as the normal Arduino boards, or your customers will feel cheated. To do this, you may need to compromise on flexibility so that perhaps each square is stiff, but the ribbon connecting them is flexible.Potential Uses: I think I would put it on a RC battery inside of an RC car. They have pretty small dimensions, but since this board is so small, I would be able to squeeze it where any other board wouldnt fit. I would then connect the driving servo and the motor controller (ESC) to it and drive it around I would then put a review up on my site, showing the flexibility and durability of the newest Arduino. Fare il login per rispondere

open in browser PRO version

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

pdfcrowd.com

4.

carmine says:
%e %B %Y at %H:%M

Ciao, quali altri sensori 1-wire possono essere collegati ? Esiste un elenco completo ? Fare il login per rispondere

Stefano says:
%e %B %Y at %H:%M Per un elenco completo sufficiente visitare il sito ufficiale, alla pagina http://www.maximintegrated.com/products/1-wire/ Fare il login per rispondere

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

1wire microlan introduzione e Arduino, sensore 1wire DS18B20 e open in browser PRO version Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

convertitore seriale

shield Ethernet.

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