La sonda DS18B20 temperatura è una digitale e resistente all’acqua, utilizza come componente principale per la misurazione della temperatura il DS1820 della Dallas.
Puoi utilizzare questa sonda per misurare la temperatura sia dell’ambiente sia di liquidi o terreno. Le specifiche del produttore indicano:
- Tensione di alimentazione da 3.0V a 5.5V
- ±0.5°C Precisione da -10°C a +85°C
- Range di temperatura misurabile: -55 a 125°C (-67°F a +257°F)
- da 9 a 12 bit di risoluzione
- Un unico cavo di connessione digitale
- Tempo di risposta inferiore a 750ms
Questi dati sono utili non solo per la connessione della sonda ma sopratutto per il progetto che desideri realizzare.
Dalle specifiche avrai letto che la precisione che potrai ottenere è ±0.5°C nella fascia di temperature da -1’°C a +85°C fascia di utilizzo più frequente.
Vorrei porre l’attenzione su un altro dato: la temperatura misurabile, vuol dire che puoi usare la sonda DS18B20 temperatura da -55°C fino a 125°C tuttavia essendo il cavo di connessione in PVC ti sconsiglio di impiegare la sonda con temperature superiori ai 100°C.
Come collegare la DS18B20 temperatura
Puoi connettere la DS18B20 temperatura ad arduino mediante una resistenza di pull-up ossia una resistenza da 10Kohm connessa tra il cavo del segnale ( giallo ) ed il positivo ( cavo rosso )
puoi seguire questo schema per il collegamento:
la sonda mostrata nello schema non è la DS18B20 temperatura ma un componente simile alla forma originale della DS1820. La resistenza da 10Kohm tra il pin positivo e il pin del segnale ( giallo ) garantisce la corretta lettura della temperatura.
Sketch DS18B20 temperatura
Lo sketch originale fornito dal produttore della sonda si limita a leggere i valori di temperatura dalla sonda DS1820 e visualizzarli sul monitor seriale, ho deciso di aggiungere al progetto un display Lcd e per non fare tutti i collegamenti ho usato la Keypad LCD che ha già tutti i pin collegati.
#include <OneWire.h> #include <LiquidCrystal.h> #define BUTTON A0 int DS18B20_Pin = 2; OneWire ds(DS18B20_Pin); LiquidCrystal lcd(8,9,4,5,6,7); void setup(void) { Serial.begin(9600); lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print(" DS18B20 LCD "); lcd.setCursor(0,1); lcd.print("mauroalfieri.it"); delay( 3000 ); } void loop(void) { float temperature = getTemp(); Serial.println(temperature); lcd.clear(); lcd.setCursor(0,0); lcd.print("Temperatura: "); lcd.setCursor(0,1); lcd.print(temperature); delay(1000); //just here to slow down the output so it is easier to read } float getTemp(){ //returns the temperature from one DS18B20 in DEG Celsius byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //no more sensors on chain, reset search ds.reset_search(); return -1000; } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return -1000; } if ( addr[0] != 0x10 && addr[0] != 0x28) { Serial.print("Device is not recognized"); return -1000; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (int i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } ds.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB << 8) | LSB); //using two's compliment float TemperatureSum = tempRead / 16; return TemperatureSum; }
lo sketch che vedi sopra è la fusione tra quello rilasciato per la DS18B20 temperatura con l’aggiunta della parte LCD relativa al controllo della Keypad.
Linea 01: includi la libreria OneWire.h con cui puoi leggere il valore di temperatura della sonda;
linea 02: includi la libreria di controllo dell’LCD.
linea 04: definisci il pin a cui sono collegati i pulsanti della keypad Lcd, tali pulsanti in questo sketch non saranno utilizzati;
linea 06: dichiara il pin a cui collegherai la sonda DS18B20 temperatura;
linea 08: dichiara l’oggetto ds come istanza della classe OneWire indicandle che la sonda è collegata al pin dichiarato alla linea 06;
linea 09: dichiara l’oggetto lcd come istanza della classe LiquidCrystal che ti serve per getire la connessione con il display Lcd sui pin 8,9,4,5,6 e 7;
linee 14-19: inizializza il display Lcd 16×2 e scrivi sulla prima linea ” DS18B20 LCD ” e sulla seconda linea “mauroalfieri.it”;
linea 21: attendi 3 secondi per consentire la lettura della frase appena scritta sul display LCD;
linea 25: definisci una variabile ti tipo float che chiami temperature il cui valore sarà preso dalla lettura della sonda attraverso la funzione getTemp();
linea 26: scrivi il valore di temperatura letto sul monitor seriale di Arduino;
linee 28-32: pulisci il display dal testo precedente e scrivi sulla prima riga “Temperatura: ” e sulla seconda la temperatura letta dal sensore;
linea 34: attendi 1 secondo prima di ripartire con il loop();
linee 39-84: la funzione getTemp() legge i valori provenienti dalla sonda e li converte in numeri decimali con la precisione del centesimo di grado in modo che tu possa visualizzarli sul display del DS18B20 temperatura.
Test del progetto DS18B20
Per provare il progetto puoi effettuare da subito la lettura della temperatura istantanea dell’ambiente lasciando la sonda libera all’aria aperta e per essere certo che la temperatura rilevata variasse ho preparato una bacinella di acqua in cui ho immerso del ghiacci sintetico, i blocchi che di solito si utilizzano nelle borse frigo:
ho potuto rilevare che l’acqua aveva una temperatura di 11°C circa, avrei potuto abbassare la temperatura dell’acqua avendo a disposizione altro ghiaccio sintetico o dei cubetti di ghiaccio in quanto la temperatura del ghiaccio che si scioglie è circa 0°C.
Il video
Ho realizzato un video del mio esperimento:
Buona misurazione!!!
165 commenti
Vai al modulo dei commenti
Qualcuno mi sa dire se il DS1820 è uguale al DS18S20?. Ho provato lo schema del DS18S20, prima con una resistenza da 4,7 K e poi da 10 K. Ho anche modificato la tensione da 5 a 3.3 V. Il risultato: il sensore si surriscalda e se non lo stacco si mette a fumare.
Autore
Ciao Ale,
il DS1820 è il componente della Dallas utilizzato dalla sonda DS18S20.
Sei sicuro di aver collegato la sonda in modo corretto?
Potrebbe anche essere danneggiata la sonda o essersi danneggiata in seguito ad un errata connessione.
Mauro
E possibile avere qualche indicazione per settare delle soglie min e max direttamente dalla keypad?
Vorrei riuscire a comandare un riscaldatore, facendolo accendere sotto una certa soglia e ovviamente spegnere se va sopra…
Ci ho provato in vari modi ma non ci riesco…
Grazie
Autore
Ciao Michele,
ciò che vuoi realizzare é possibile ma non immediato, puoi leggerti i miei articoli sul dolly per apprendere come gestire i tasti e realizzare un menù di impostazione delle soglie, ovviamente non é uguale al dolly, dovrai adattare le parti dello sketch che ti occorrono.
Poi ti consiglio di usare la EEPROM per memorizzare i dati e recuperarli in caso di reset del sistema.
Mauro
Ciao Mauro,
complimenti per l’articolo, dovrei misurare una temperatura superiore agli 85°C, devo modificare qualcosa al tuo programma?
Autore
Ciao Ivan,
dalla tua foto deduco che possa servirti per la produzione di birra 🙂 sbaglio?
La sonda arriva a 120 gradi senza cambiare nulla nello sketch, l’unica precauzione riguarda il PVC del cavo che superati i 100 gradi potrebbe fondere 🙂
Mauro
Salve, che cavo usare per la sonda e che lunghezza massima?
Autore
Ciao Gianni,
questa sonda è di tipo digitale per cui la lunghezza del cavo incide poco sul dato finale purchè sia di sezione sufficente a trasportare il segnale per lunge distanze.
Non ho mai provato ad allungare il cavo per cui non so dirti i limiti che puoi raggiungere.
Mauro
salve, mi sono imbattuto in questo sito perchè sono alla ricerca di una soluzione per il mio impianto. è un po di tempo che sto usando netduino2plus con 3 sonde ds18b20 e 3 relè, ho sviluppato un programma che legge le tre temperature e mi fa scattare i relè a valori preimpostati e funziona tutto, il problema è che se uso lo stesso programma per 28 sonde (che compongono il mio impianto) le temperature escono fuori tutte sballate (-2054, 25,0 etc). Quale potrebbe essere il problema? Avendo più sonde devo considerare qualche altra cosa?
Autore
Ciao Roberto,
non conosco netduino2plus ma mi chiedo come fai a collegare 28 sonde ai pin disponibili?
Probabilmente 28 sonde hanno bisogno di una alimentazione più coposa ed è questo il problema che rilevi.
Mauro
ho dimenticato di scrivere che per l’impianto ho usato del cavo per allarme,ogni sonda ha almeno 6 metri di cavo attaccato, ho effettuato un collegamento a stella dell’impianto, ho utilizzato un alimentazione esterna per le sonde ed una resistenza di pull up da 4,7k
Autore
Ciao Roberto,
prova a utilizzare una sezione di cavo maggiore per le prolunghe potrebbe essere il problema.
Inoltre prova che con solo una sonda o tre sonde e dei cavi così lunghi i valori siano corretti.
Mauro
Ciao, grazie per la risposta; le sonde sono le ds18b20 con protocollo one wire quindi mi occupano un solo pin di netduino; comunque variando la resistenza di pull up fino a 280 ohm è ripreso tutto a funzionare ma farò degli altri controlli di tensione come mi hai consigliato;per l’alimentazione delle sonde ho usato i due 0.50 del cavo dell’allarme mentre per il bus del segnale lo 0.25
Autore
Ciao Roberto,
mi incuriosisce l’uso di così tante sonde su un unico pin, come fai a distinguere i valori restituiti da ciascuna sonda?
Mauro
Buon giorno Mauro volevo chiederti se esiste o se si può realizzare un qualcosa con arduino per misurare delle distanze dalla lama della sega. grazie molte
Autore
Ciao Mauro,
di che distanze si tratta in termini di cm,mm,m?
che precisione ti occorre ?
che linearità ti servirebbe ?
Sono le prime domande che mi vengono in mente.
CIAO, netduino è completamente programmabile in c#, quindi con un amico abbiamo elaborato un programma che usa il protocollo one wire per la gestione delle sonde che hanno un indirizzo univoco esadecimale.
Autore
Ciao Roberto,
se mi racconti il principio magari è utile anche ad altri appassionati.
Mauro
L’array addr[8] che inizializzi vuoto, serve a contenere l’indirizzo della sonda. Se fai stampare, magari a seriale, il valore di addr dopo la riga 49, ti verrà fuori l’indirizzo univoco della sonda. Una volta conosciuto, si può omettere l’array vuoto addr[8] ed utilizzare un array inizializzato con l’indirizzo della sonda.
Conoscendo l’indirizzo di tutte e 28 le sonde, si lavoro con array contenenti già l’indirizzo delle 28 sonde ed interrogarle una alla volta.
Credo che la funzione ds.search(addr) serva proprio a cercare un indirizzo valido e una volta trovato lo inserisce nell’array addr[8].
Suppongo che se riceve un addr[8] vuoto faccia la ricerca su tutti gli indirizzi possibili, mentre se riceve un addr già contenente un indirizzo valido faccia la ricerca solo di quell’indirizzo.
Non ho sonde con me ma una prova sarebbe semplice da implementare, anche con una sonda sola.
Riprendo questo post un po’ datato perchè sto per realizzare un progetto con 6 sonde DS18b20 un LCD 20*4 e 6 relè, insomma uno schema semplice, leggo le temperature le visualizzo e attivo i relè se necessario…
Volevo sapere se facendo come ha scrittoFederico funziona oppure se esistono altre soluzioni…
Io ad oggi ho sempre realizzato con una sonda sola, gestirne 6 non ho idea…
Tra l’laltro ci sono anche dei tempi di latenza??
Grazie
Autore
Ciao Maurizio,
lascio il post on-line perché Maurizio possa rispondere a Federico.
Ciao Maurizio,
innanzitutto complimenti a Mauro per gli ottimii consigli che dispensa nel suo sito e che sono un validissimo aiuto per me che sono alle prime armi con Arduino.
Ho realizzato a banco un progetto simile al tuo con 4 sonde DSB1820 (temperatura liquido), 1 DHT11 (temperatura e umidità aria ambiente) e 1 DHT22 (temperatura e umidità aria in un ambiente controllato con temperatura negativa) il tutto con memorizzazione dati su micro SD e visualizzazione su display 20×4; tutto funziona correttamente (lettura dei dati, memorizzazione e visualizzazione a display) ma da quando ho racchiuso il tutto in un contenitore e allungato i cavi delle sonde per usare il tutto dove realmente mi serve, le letture delle DHT rimangono corrette ma le DS non vengono rilevate (uso una resistenza di pull-up da 10kohm per le DS).
Può essere un problema di alimentazione da USB o la resistenza di pull-up con valore sbagliato? In questi casi, come posso collegare una alimentazione esterna da 5Vcc e/o calcolare il valore della resistenza in modo corretto?
Grazie e chi mi saprà aiutare.
Autore
Ciao Paolo,
puoi alimentare le sonde in modo indipendente portando il comune ( Gnd ) ed il segnale verso Arduino.
Trovi dei tutorial su come alimentare dei sensori in modo indipendente da Arduino.
Buongiorno,
osservando il disegno (fig. 3) che mostra il collegamento sulla breadboard mi è sorto un dubbio. Dal datasheet mi sembrava di capire che il pin per l’ I/O dei dati è quello centrale, mentre sul disegno sopra riportato è il piedino a destra. ci sono varie versioni oppure è una svista?
c’è scritto: la sonda mostrata nello schema non è la DS18B20 temperatura ma un componente simile alla forma originale della DS1820. …
sta qui l’origine del problema?
grazie
Giovanni
Autore
Si Giovanni,
la differenza consiste tra il modello della sonda e il componente che ho trovato nella libreria fritzing che non corrispondono.
Prendi come valido il datasheet del tuo sensore.
Buongiorno,
Sono da un paio di mesi attirato dal mondo di Arduino…ho un sistema basato su Arduino mega 2560 R3, su cui ho montato un RTC, una ethernet shield e un MUX shield…ho delle sonde DS18B20, per l’esattezza ne ho circa 15 montate una per PIN e collegate con 3 fili (non parassitaria quindi) e cavi lunghi circa 2-3 metri.
Funziona tutto molto bene, solo che dopo qualche giorno improvvisamente mi si azzerano alcune sonde e non c’é modo di farle ripartire, se non togliendo alimentazione al sistema…appena riavviato le sonde ripartono senza problemi per qualche altro giorno.
Qualche idea di cosa possa essere? Uso la libreria ONEWIRE
Grazie a tutti
Autore
Ciao Massimo, così a distanza mi verrebbe da dire l’alimentazione insufficiente, ma potrei sbagliare il comportamento sembra più dovuto ad un bug software che satura qualche risorsa dopo X giorni. Il fatto che non lo facciano tutte, ma solo alcune rende complesso il debug, dovresti provare a verificare per più giorni cosa accade subito prima del blocco e come sono i buffer di arduino prima e dopo ogni registrazione.
Salve,
quando voglio mettere lo sketch nell’arduino mi dice: ‘One Wire’ does not name a type.
Aiuto, grazie
Autore
Ciao Andriy,
non hai incluso la libreria One Wire o questa non si trova nel path in cui lo sketch si aspetta.
Ciao Mauro,
provo da giorni a usare il sensore ma importando le librerie (unzippate e salvate in …/Programmi/Arduino/libraries), mi da un sacco di errori nella compilazione.. Sono errori usuali nel web. Suggeriscono una modifica delle librerie, modifiche che ho provato a fare ma nulla. Sono arrivato a voler evitare di usare la libreria stessa e basarmi solo sull’AnalogRead, ma con scarsissimi risultati. Hai dei suggerimenti?
Ps. la versione software di Arduino è la 1.0.5 e le librerie le ho provate di tutte le versioni possibili e immaginabili.
Grazie mille,
Alessandro.
Autore
Ciao Alex,
quando ho provato la libreria ho usato anch’io l’IDE 1.0.5
Le librerie usate in questo sketch sono incluse nell’IDE e non devi installarle a parte.
Probabilmente l’installazione dell’IDE non è andata a buon fine, prova a disinstallarlo, eliminare le dir degli esempi e delle librerie e reinstallarlo scaricandolo dal sito ufficiale.
Grazie Mauro, come hai previsto, reinstallando tutto non ho problemi di librerie.
Adesso il problema è la temperatura che il sensore restituisce: 0.0 sempre.
Anche in questo caso ho impostato il pin centrale del sensore al pin 8 (#define ONE_WIRE_BUS 8),mentre gli altri 2 connettori sono a +5V di Arduino Mega 2560 e a GND.
Quale può essere adesso l’errore?
Grazie ancora!!!!!!!!!!!!
Autore
Ciao Alex,
ti invito a leggere attentamente il mio articolo per trovare, da solo, l’errore.
Potrebbe essere dovuto a tante componenti e per tale motivo io scrivo articoli dettagliati, per aiutarti a trovare l’errore.
ciao sto provando l esempio ma sulla seriale mi stampa sempre -1000.00
Risolto i pin corretti sono 1(GND) ,2(DQ),3(VDD)
Autore
Bene bravo !!!
Autore
Ciao Paolo,
sembra un errore nel collegamento del pin segnale.
Controlla il collegamento.
ciao Mauro,
scusa per la banalità, tento di utilizzare lo sketch fornito ma IDE non compila. sono sufficientemente convinto che l’errore sta nella mia architettura, non trovo come ordinare le cartelle, mi spiego meglio:
nella cartella dell’ IDE deve contenere anche le librerie e lo sketch?
ho pasticciato con le cartelle e ora penso che le librerie non sono fruibili dallo sketch. tanto che nemmeno gli esempi compilano correttamente
Se quando includo la libreria e il software colora di arancione il nome della libreria, la posso considerare funzionante?
l’errore nel file Wstring.h è dovuto al fatto che non trova nulla?
scusa le domande banali ma se non risolvo le basi rischio di demotivarmi e abbandonare Arduino, nonostante vedo grandissime potenzialità.
Autore
Ciao Marco,
se hai fatto confusione con le librerie ed i path degli sketch la soluzione migliore è rimuovere l’IDE e la dir Arduino nella dir del tuo utente, non ricordo con precisione dove sia su Win7 ma sono certo che nelle guide arduino sia riportato.
Poi re-installi IDE e segui un tutorial su come installare le librerie su arduino.
Ciao Mauro,
non riesco a replicare il tuo progetto (molto sfizioso) dopo una ricerca ho trovato che alcuni modificano le librerie per adattarle alla versione del IDE.
Io uso WIN 7 con IDE 1.0.5 R2 ,
tu hai apportato modifiche alle librerie?
grazie
Autore
Ciao Marco,
questo progetto è stato realizzato già con l’IDE 1.0.5, se il tuo è ancora la versione r2 non dovrebbero darti problemi le librerie.
Grazie Mauro,
sono al settimo cielo, funziona tutto, incluso lcd .
è la prima libreria che utilizzo, si è aperto un mondo. un sincero ringraziamento.
Marco
Autore
Bene Marco, sono contento per te, ricordo la sensazione quando anch’io ho sperimentato la mia prima libreria … ed ancora oggi mi ricapita quando scopro nuove librerie e sensori 🙂
Ciao Mauro,
per realizzare un termostato con il tuo esempio, posso aggiungere in (if)?
dichiaro una variabile di Setpoint
la confronto con la temperatura, ne segue un’azione…
non è cosi facile io non capisco perché non funziona.
Autore
Ciao Marco,
in linea teorica si, puoi mettere un if per il confronto tra temperatura rilevata e valore inserito nello sketch da te.
Tuttavia scrivere lo sketch richiede che tu sappia in che punto aggiungerlo e che la condizione inserita sia verificata.
Prova a comprendere a pieno lo sketch e i tipi di variabili usate per definire correttamente il controllo che ti interessa.
disculpe tengo una duda el ds1820 es lo mismo que ds18b20 o no disculpe esq ese es mi duda
Autore
no, ellos son diferentes, por favor refiérase a la datasheet
Salve non riesco a far funzionare la sonda…. la verifica sketch mi da:
Lettura_ds18b20.pde:5:35: error: no matching function for call to ‘DallasTemperature::DallasTemperature(OneWire*)’
Lettura_ds18b20.pde:5:35: note: candidates are:
In file included from Lettura_ds18b20.pde:2:0:
C:\Users\Dario Tumino\Documents\Arduino\libraries\DallasTemperature/DallasTemperature.h:48:5: note: DallasTemperature::DallasTemperature(NewOneWire&, uint8_t, StratBase*)
DallasTemperature(NewOneWire &oneWire, uint8_t index = 0, StratBase* pTBase = 0);
^
C:\Users\Dario Tumino\Documents\Arduino\libraries\DallasTemperature/DallasTemperature.h:48:5: note: no known conversion for argument 1 from ‘OneWire*’ to ‘NewOneWire&’
C:\Users\Dario Tumino\Documents\Arduino\libraries\DallasTemperature/DallasTemperature.h:19:7: note: DallasTemperature::DallasTemperature(const DallasTemperature&)
class DallasTemperature
^
C:\Users\Dario Tumino\Documents\Arduino\libraries\DallasTemperature/DallasTemperature.h:19:7: note: no known conversion for argument 1 from ‘OneWire*’ to ‘const DallasTemperature&’
Lettura_ds18b20.pde: In function ‘void loop()’:
Lettura_ds18b20.pde:20:9: error: ‘class DallasTemperature’ has no member named ‘requestTemperatures’
Lettura_ds18b20.pde:22:22: error: ‘class DallasTemperature’ has no member named ‘getTempCByIndex’
Errore durante la compilazione
Q
Autore
Ciao Dario,
sembra un errore di librerie, prova a scaricare nuovamente quelle del produttore, eliminare quelle installate sul tuo IDE e reinstallare le nuove.
Ciao Mauro!
il tuo skech mi funziona… Grazie! ora vorrei riportare la temperatura su di una pagina html???
Autore
Ciao Roberto,
hai già letto i miei articoli su come usare arduino con la ethernet shield o la centralina meteo con Yun?
Caro Mauro, i tuoi articolo sono sempre interessanti.
Perdona la domanda sicuramente ingenua, ma la libreria OneWire.h funziona anche con un semplice LM35?
Questo sketch può essere utilizzato per un LM35?
Grazie.
Autore
Ciao Luca,
la libreria OneWire si usa con sensori come quello mostrato che supportano il collegamento digitale su un solo cavo.
Per i sensori tipo LM35 ti basta usare l’analogRead sul pin analogico.
Ciao mauro
Vorrei sapere qualche chiarimento dal rigo 59 in poi se è possibile
Autore
Ciao Manuel,
dalla linea 38 alla linea 82 ho preso la funzione rilasciata dal produttore della sonda: http://www.dfrobot.com/wiki/index.php/Waterproof_DS18B20_Digital_Temperature_Sensor_%28SKU:DFR0198%29
non mi sono addentrato nella spiegazione della funzione in quanto è la sequenza di operazioni da eseguire per interrogare il DS18B20 che puoi approfondire nel datasheeet, io ho studiato questo: http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf al tempo dell’articolo.
io ho letto che si possono mettere più sensori su un solo filo, ma non capivo come trovare l’indirizzo di ogni sensore visto che tutte le guide dicono che:
byte data[12];
byte addr[8];
data dovrebbe indicare la quantità di bit, che può andare da 9 a 12 bit.
ma addr non capisco perchè tutti mettono il numero 8, e perchè proprio 8 ?
tu sai dirmi qualcosa ?
Autore
Ciao Manuel,
addr[8] insica solo che l’indirizzo è di 8 byte non che l’indirizzo è 8.
Nello sketch è presente un metodo della classe ds: ds.search(addr) che potrebbe servire alla ricerca dei dispositivi presenti nel tuo circuito, non ho mai verificato questa condizione non possedendo più sensori da testare, potresti verificare nella libreria OneWire.h o OneWire.c come è gestito questo metodo e se è possibile implementare una ricerca per il numero di sensori che possiedi.
Ciao Mauro, innanzitutto complimenti e grazie per tutti i progetti che porti a termine, è circa una settimana che provo a far andare il mio sensore DS18B20 ma trovo sempre difficoltà con lo sketch, il programma di arduino mi dice che c’è un errore nella compilazione, ma è diverso, di solito mi si evidenziava la riga con l’errore, qui no. è un problema di librerie? ho letto da qualche parte che onewire.h o, in altri sketch in internet, dallastemperature.h sono nuove, non so se sia vero.. grazie in anticipo :)
Autore
Ciao Riccardo,
hai provato ad installare le librerie che uso io nel mio sketch e verificare cosa accade?
Mi sono arrivate le sonde ed ho fatto un pò di prove. Ho fatto come avevo accennato tempo addietro e tutto funziona perfettamente.
Spiego: per scoprire l’indirizzo di una sonda basta aggiungere queste righe di codice dopo la riga 58
Serial.print(“Indirizzo: “);
for(int i=0;i<7;i++){
Serial.print(addr[i]);
Serial.print("-");
}
Serial.println(addr[7]);
Servono a stampare su seriale l'indirizzo della sonda. Per indirizzare la singola sonda basta creare un addr[8] inizializzato con l'indirizzo ricavato:
byte addr[]={40,255,99,167,96,20,4,43}; //Indirizzo della mia sonda
E il gioco è fatto! Basta ripetere per il numero di sonde collegate.
Autore
Grazie 1000 Federico,
sono sicuro che il tuo contributo sarà di grande aiuto a chiunque desideri utilizzare più sonde DS18B20 nel suo progetto.
ciao ho collegato tutto come il tuo esempio ,ma la temperatura che leggo è sempre -1000.00 dove sbaglio ciaoe grazie
Autore
Ciao Agos,
se leggi il mio sketch e la sua spiegazione ti accorgerai che alla linea 47 c’è un if il cui fallimento causa il problema che evidenzi.
Partendo da quell’errore puoi procedere ad eseguire dei test per verificare che la sonda funzioni e che sia connessa in modo corretto.
grazie mauro,scusa ma sono ignorante in materia,la sonda funziona ,l’ho collegata secondo il tuo schema,magari ho messo una resistenza con un valore diverso,mi serviva un termometro per controllare la temperatura in fase di ammostamento della birra,dato che la sonda ds18b20 è molto precisa,pensavo di aver risolto il mio problema,ho provato a collegare la sonda in modo differente ma il risultato non cambia,i fili della sonda sono rosso nero e giallo,che devo fare ,grazie per l’aiuto,ciao
Autore
Ciao Agos,
come fai a dire che la sonda funziona?
Da quello che scrivi non è certo che funzioni.
In ogni caso ci metterei la resistenza consigliata dal produttore.
la sonda l’ho provata con un altro sketc e funziona correttamente ,ho ricomprato una resistenza da 10kohm come quella usata da te,ma non va,che faccio grazie
Autore
Ciao Agos,
perdonami, cerco solo di capire, tu hai provato la sonda con un altro sketch e funziona, bene !!!
Il mio esempio di sketch è solo un test e non fa altro che misurare i valori della sonda e mostrarli su LCD per cui non comprendo quale difficoltà tu possa incontrare.
Forse la cosa più semplice è aggiungere allo sketch che ti funziona la parte di visualizzazione LCD che trovi in tantissimi tutorial.
la difficoltà che incontro è la seguente ; collego tutto come il tuo schema ma la temperatura segnata dal display è sempre la stessa, -1000.00 siccome non sò come aggiungere la parte di visualizzazione allo sketch che mi funziona non sò a chi chiedere un aiuto, non sò programmare!!!!! scusami, potresti aiutarmi?ti posto il link dello sketch che mi funziona
https://cfpmanfredini.wordpress.com/2014/01/07/misura-la-temperatura-con-sensore-dallas-ds18b20/
grazie in anticipo ciao
Autore
Ciao Agos,
nel link che mi hai postato è presente anche un esempio di come scrivere sul display, non ti funziona ?
La differenza tra il mio sketch e quello riportato è l’uso della libreria DallasTemperature io non utilizzo.
Il blog è nato proprio con l’idea di insegnare le poche cose che c’è da sapere su arduino a chi vuole realizzare il proprio progetto, se non sai come usare un display LCD prova a leggere i tutorial sugli LCD.
ti ringrazio per i suggerimenti, ho provato vari sketc,anche a scrivere sul display e tutto funziona,ho provato dei termometri e leggere la temperatura con il pc con il seriale di arduino e tutto funziona,soltanto il tuo sketch,non funziona,leggo il display e la temperatura è sempre -1000.00,tu dici di controllare alla riga 47 ,ma non essendo un programmatore,non capisco dove sia l’errore,volevo soltanto usufruire del tuo sketch,per questo ti ho contattato,i collegamenti sono i stessi che fai tu,la sonda funziona,la resistenza è quella giusta,il display funziona,ma la temperatura segnata rimane invariata,la mia è soltanto curiosità,per capire dove sia l’errore,a presto e grazie
Ciao Mauro, grazie per la condivisione e il tempo che dedichi per darci la possibilità di imparare!
Volevo chiederti, quella resistenza tra i +5v e il segnale del sensore serve per far viaggiare corrente nel segnale per amplificarlo?
Autore
Ciao Gianpaolo, è una resistenza richiesta dal produttore del sensore, sinceramente non mi sono mai addentrato nello schema del componente per verificarne la funzione.
Per Agos (il link alla risposta non mi viene visualizzato):
Prova a fare così: alla riga 52 sostituisci il -1000 con -2000 e alla riga 57 sostituisci il -1000 con -3000.
In questo modo non risolvi il tuo problema ma riesci a distinguere i 3 errori.
Autore
Grazie Federico.
Salve Mauro,
innanzitutto complimenti per l’articolo esaustivo.
Ci tenevo a esporre un mio dubbio:
volevo posizionare 5 di queste sonde una dopo l’altra equispaziate di circa un metro, tale che la più lontana venga a trovarsi a circa 7 metri da arduino.
1) devo seguire qualche accorgimento particolare o mi basta seguire il disegno di questo tuo progetto allungando i 3 cavi?
2) che cavi mi conviene usare per realizzare il collegamento?
3) il protocollo 1 wire fa al caso mio? Non mi sembra tu abbia scritto articoli in proposito, o sbaglio?
Ti ringrazio fin da ora per i suggerimenti che vorrai fornirmi
Autore
Ciao Nicola,
penso che il sistema di comunicazione OneWire non dovrebbe avere problemi con le distanze a patto di adeguare la sezione del cavo alla distanza da coprire, in ogni caso 7m non sono una distanza sulla quale dovresti rilevare errori di misura.
In ogni caso ti consiglio di eseguire qualche test.
ciao Mauro, rispondo solo ora perchè purtroppo non mi sono arrivate notifiche di tua risposta.
1) Sai come posso rimediare al problema per i tuoi futuri suggerimenti?
2) Non ho trovato tuoi esempi sul sistema di comunicazione OneWire. Avresti qualche pagina di terzi da suggerirmi?
3) A spanne credi che il doppino telefonico possa fare a caso mio?
Autore
Ciao Nicola,
cerco di risponderti per punti:
1) non ho compreso la tua richiesta
2) quello che stai leggendo è un esempio, altri penso tu possa trovarli googolando OneWire, non ho riferimenti specifici, quando ho dei dubbi leggo il codice della libreria e studio il datasheet del sensore che mi occorre controllare;
3) direi che la sezione del doppino è troppo sottile almeno starei su 1mm di sezione.
1) Non ricevo più mail da questo sito, ne le newsletter, ne le mail di notifica quando ricevo risposta ai commenti.
Hai idea di quale possa essere il problema?
2) Una cosa non mi è chiara. Questo esempio è di one wire? Il sensore non è collegato a tutti e 3 i pin? Pensavo di aver capito che con tale protocollo si potessero sfruttare solamente 2 pin
Autore
Ciao Nicola,
per il punto 1 prova a controllare che per qualche motivo il tuo provider non abbia inserito il mio indirizzo info tra quelli bloccati, in ogni caso puoi definire l’indirizzo info del blog come valido ( lista bianca o white list )
Per il punto 2 i 3 pin sono +5v, Gnd e segnale .. non puoi omettere nessuno dei tre.
boh, sulle impostazioni di gmail non ho la tua mail sui filtri antispam, non riesco a spiegarmelo.
Riguardo il secondo punto, il protocollo one wire non dovrebbe permettere, sfruttando l’alimentazione parassita, di poter utilizzare solo due cavi, segnale e Gnd?
Autore
Ciao Nicola,
osservazione interessante sulle correnti parassite, non ho mai letto questa informazioni e mi sono limitato a usare il sensore come suggerisce il produttore.
Hai qualche link che posso consultare in merito per approfondire.
http://openenergymonitor.org/emon/buildingblocks/DS18B20-temperature-sensing
Qualcosa l’avevo trovato qui.
Non è specificato però quali sono i limiti di tale tipologia di collegamento, cioè se perde di precisione o altro, ne’ a quanto ammonta la riportala “rrelatively short distances”
Autore
Ciao Nicola,
conosco il progetto e sto utilizzando la loro piattaforma open per la raccolta dati in un progetto di monitoraggio ambientale.
Proverò a leggere nello specifico il link che mi hai indicato.
grazie mille.
Spero scriverai un articolo a riguardo
Ciao Mauro,
ti faccio i complimenti per i tuoi articoli che mi sono stati veramente utili per completare il mio datalogger su SD card per monitorare la temperatura dell’acqua della piscina.
Avrei un dubbio, ho utilizzato la stessa sonda di questo articolo (ds18b20 con cavo da 1 mt) e dato che la misura del cavo è troppo corta vorrei sapere se facendogli una prolunga rischio di compromettere la corretta lettura della temperatura.
Hai qualche consiglio a riguardo?
Grazie per la risposta
Mirco
Autore
Ciao Mirco,
trattandosi di una sonda digitale e non analogica non dovresti avere problemi di distanza a patto di utilizzare dei cavi di sezione adeguata alla distanza che devi percorrere più che altro per l’alimentazione che potrebbe subire cali di tensione dovuti alla resistenza del cavo stesso.
Non so a quanti metri devi mettere la sonda ti suggerisco dei cavi da almeno 1mm
Salve! dopo aver usato il sensore ds1820 in svariati progetti, ora dopo aver installato l’IDE 1.6.1 e la libreria mi ritrovo la compilazione che mi d’à questo errore:
\Documents\Arduino\libraries\OneWire\OneWire.cpp:85:24: fatal error: WConstants.h: No such file or directory
#include “WConstants.h”
^
compilation terminated.
mentre se compilo con 1.0.5 non ho problemi.
Cosa è cambiato e cosa non ho installato probabilmente ??.
il file è quello di questa pagina.
Grazie per questo sito, punto di riferimento.
Fausto
Autore
Ciao Fausto,
non ho provato a compilare con la 1.6.x sketch che usano la OneWire, dall’errore che riporti sembra che non esista o che tu non abbia installato il file WConstants.h
Da precedenti esperienze capita che tra una release dell’IDE ed un’altra qualche libreria venga riscritta e cambi nome per non essere confusa con la versione precedente.
Verifica se esiste un aggiornamento della OneWire che supporti la versione di IDE attuale.
Ciao Mauro, sto provando il tuo progetto con il sensore 18b20P. il display mi indica sempre -1000.
C’è qualche differenza circuitale con il ds18b20 ?
Grazie.
Autore
Ciao Periglio,
hai provato a verificare nel datasheet della tua sonda se il tpo di comunicazione sia la medesima prevista per il mio modello o vi siano delle differenze?
La soluzione più rapida è di utilizzare la libreria rilasciata dal produttore/venditore della sonda.
Ciao Mauro, ho fatto delle ricerche ed ho scoperto che vanno usati solo 2 pin della sonda.
Il pin 1 e 3 vanno cavallottati e collegati al gnd mentre il pin 2 potra il segnale.
Adesso faro delle prove e ti faccio sapere.
Per quanto riguarda la libreria sembra che va bene la onewire usata da te.
P.S.
Ho provato a collegare la sonda al raspberry cavallottando il pin 1 e 3 e funziona.
Autore
Bene Periglio,
tienimi aggiornato.
Ciao Mauro,
Dopo tante prove e ricerche ho risolto il problema.
Ho comprato la sonda ds18b20.
…e funziona benissimo
Autore
Bene Periglio,
sono contento 🙂
Si questo progetto è molto interessante ma come faccio a togliere tutta la parte del display e programmare la misura di soglia al tal punto che una volta arrivata mi accende un led ?
Autore
Ciao Diego,
leggi i tutorial del corso base prima di cimentarti in cose più complesse e approfondisci le linee di codice descritte nell’articolo che ti spiega come funziona tutto.
Ciao Mauro,
compliementi per il progetto, questo fa al caso mio ma vorrei capire come posso modificarlo per impostare due temperature una di min e una di max (se si potessero inserire tramite ldc sarebbe ottimo) che al raggiungimento della temp. max mi chiude il rele e quando torna alla temperatura min mi apre il rele..
Grazie
elvis
Autore
Ciao Elvis,
hai letto la descrizione del listato commentata linea per linea ?
Commento ogni sketch linea per linea proprio per insegnarVi ad eseguire le modifiche.
perfetto funziona tutto, ho inserito anche il relè!
grazie
Autore
Bene, sono contento
Ciao Mauro sono un novellino di Arduino, e i tuoi tutorial mi stanno dando una mano a capire questo fantastico mondo, ti scrivo perche ho questo problema con la sonda ds18b20, in pratica se collego Arduino con la porta USB tutto funziona perfettamente ma se collego solo l’alimentazione esterna 9v il displey comincia ad indicare una lettura -127. Ti ringrazio in anticipo per qualsiasi aiuto possa darmi.
Autore
Ciao Ignazio,
sei certo che i componenti siano come i miei? A volte basta una shield differente e devi ricalcolarti i collegamenti e le connessioni.
Ciao Mauro e grazie per il tempo che ci dedichi, effettivamente avevo messo la resistenza di pull-up con un valore errato, come l’ho cambiata tutto ha cominciato a funzionare correttamente.
sto imparando molto dai tuoi tutorial (devo solo essere un po più attento) e continuerò a seguirti con molto interesse.
grazie.
Autore
Bene Ignazio,
sono contento tu abbia compreso la differenza con il mio progetto e sia riuscito ad eseguire la correzione.
Grazie Mauro,
senza dubbio abuserò ancora della tua disponibilità, nel frattempo ti seguo con interesse.
Ciao, è possibile avere una lettura al decimo di grado, anzichè al centesimo, o addirittura per “step” di 0.5 gradi?
Autore
Ciao Pier Antonio,
se vuoi ridurre la precisione della lettura puoi farlo via codice, nel senso che confronti il dato con la scala che desideri ed usi il valore che vuoi.
ciao, nel listato:
LiquidCrystal lcd(8,9,4,5,6,7);
ma quali i collegamenti alle rispettive porte dell’lcd quali pin si collegano a RS RW???
grazie
Autore
Ciao Antonio,
li trovi nella documentazione della Libreria, noon li ricordo a memoria, ogni volta io vado sul sito arcuino.cc e leggo nel referenze delle librerie.
Ciao Mauro,
ho riprodotto il progetto è funziona perfettamente. Quando cambio sensore ed inserisco al posto del DS18B20 il DS18S20, la temperatura non è corretta. Potresti dirmi quali sono le modifiche da apportare per una corretta lettura. Ti ringrazio anticipatamente per l’eventuale risposta.
Autore
Ciao Alessandro,
avranno protocolli differenti, controlla sul sito del produttore se esiste un esempio già adatta al tuo sensore, in caso contrario dovrai adattare lo sketch seguendo le specifiche del sensore da datasheet.
Salve,
si potrebbe controllare la temperatura da remoto tramite smartphone? nel caso ha qualche sketch di esempio?
Grazie
Autore
Ciao Cesare,
è possibile ma devi scriverti da solo lo sketch perché io non ho mai avuto questa esigenza.
Trovi molti articoli nel blog a cui ispirarti.
Salve potrebbe inviarmi lo schema per collegare il display lcd? grazie
Autore
Ciao Fabio,
in questo progetto ho usato una keypad shield, ma nel blog trovi tanti articoli in cui è dettagliato come collegare questo tipo di display.
Ciao Mauro, ho realizzato un sistema di misurazione sulla base di questo tutorial con due sonde DS18B20 collegate ai pin 02 e 04 di arduino. Ogni sonda ha la sua resistenza da 10K ohm tra vcc e dati. Ho notato due cose però:
– da un po’ di tempo le due sonde cambiano valore solo su step di 0,5 gradi e non importa se altero la risoluzione dallo sketch. Sostituendole con altre due che tenevo da parte i valori invece tornano ad avere più risoluzione (sempre con lo stesso sketch). Secondo te è possibile che con qualche sbalzodi alimentazione i sensori abbiano “perso” risoluzione?
– la coppia di sonde se messa affiancata nello stesso ambiente mi da valori di temperatura diversi nell’ordine di 1° / 1,5° (ad es una segna 22,5 l’altra 24) . Ho fatto anche dei test tenendo una sola sonda nel circuito per volta e affiancando un termometro analogico per valutare l’affidabilità, 4 sonde 4 valori diversi tra loro e solamente una si avvicinava alla temperatura dell’analogico nell’ordine di 0,5° C.
Da quello che leggo in giro questi sensori sembrano già “tarati di fabbrica” quindi da cosa possono dipendere i miei problemi di affidabilità? Magari dipende dalla qualità delle connessioni sonda-breadbord-arduino?
Grazie in anticipo.
Autore
Ciao Paolo,
potrebbe dipendere da vari fattori inclusa la manifattura delle sonde stesse che se non certificata, e di certo si fa fatica a trovarne di certificate, può causare i problemi che riscontri.
Io preferisco tarare le sonde prima, come vedi in questo sketch, ed inserire un offset per sonda.
Sul primo problema non ho una risposta, non mi è mai capitato.
Si in effetti il problema può anche essere nelle sonde che non sono certificate. Per quanto riguarda offset e taratura non trovo niente nel tuo sketch, o forse mi sfugge…come posso ribilanciare i valori diversi dei due sensori?
Autore
Ciao Paolo,
puoi definire degli offset per sonda e sottrarli o sommarli ai valori letti.
Ok, grazie per la dritta Mauro.
Mi cerco qualche documentazione a riguardo, a presto!
Ciao Mauro.
Scusa ma non capisco la riga 24…void loop(void)…
Volendo inserire questa parte all’interno di un altro sketch che ha un void loop(), dove lo devo mettere?
All’interno o è una funzione esterna??
Grazie.
Autore
Ciao Maurizio,
la loop() in uno sketch arduino è unica, per cui puoi:
1. integrare i comendi presenti in questa loop() direttamente nella loop() dell’altro sketch;
2. usarla come funzione esterna rinominandola, ad esempio, come loop2 e richiamandola dalla prima loop()
Grazie Mauro, mi rimane il dubbio di quella riga 24…void loop(void)…
che cosa significa??
Autore
Ciao Maurizio,
la loop() è una finzione che non accetta parametri e non restituisce valori per cui è definita void.
Solitamente la trovi definita come void loop() {} ma alcuni preferiscono ribadire che non accetta parametri inserendo tra () la definizione “void”
ciao Mauro, volevo chiederti se si puo’ utilizzare la funzione int chk per memorizzare la temperatura di un sensore ds18b20, o si usa esclusivamente per il dht11? grazie anticipatamente per la cortese risposta
Autore
Ciao Massimo,
“int chk” è una variabile non una funzione, almeno scritta come hai fatto tu.
Purtroppo non la vedo in questo sketch e non saprei aiutarti, sei certo di averla letta in questo articolo?
Ciao Mauro!
Grazie per gli splendidi articoli che pubblichi, io di questo articolo non ho capito una cosa:
– ipotizzando di avere due sonde, come la rilevo e la distinguo la temperatura di una sonda piuttosto che la temperatura dell’altra?
– la funzione getTemp() quale temperatura mi indica? di quale delle due sonde?
in poche parole: “come faccio ad implementare più sonde?” si è parlato addirittura di chi ne ha 28, ma mai si è detto come sia possibile collegarne più di una…
Autore
Ciao Pasquale,
non è scritto in questo articolo in quanto riguarda la programmazione con più istanze di cui puoi leggere in altri articoli magari dedicai ai servo od ad altri oggetti.
Nel caso della sonda DS18B20 ti è sufficiente duplicare la linea 8, cambiare il nome dell’istanza ed il pin a cui hai connesso le sonde e nella getTemp() scegli se duplicare tutta la funzione o renderla parametrica.
salve Mauro, complimenti per il suo blog, seguo con molto interesse i suoi post.
sono un neofita e vorrei chiederle un aiuto, poichè non riesco a capire come fare uno sketch.
vorrei dare due entrate digitali al mio arduino uno (due sonde temperatura) una ‘calda’ e una ‘fredda’.
arduino dovrebbe misurare la differenza di temperatura (da 0°C di differenza a +20 °C di differenza supponiamo, mai in negativo=> ovvero non deve mai restituire il calore dissipato da una parte) e all’aumentare della differenza, dovrebbe far aumentare il regime di una ventola, es: a 0°= ventola a 0%; +1°C= v. a 5%; a+2°C=v. a 10% a +4°C= v. al 20%; a 8°C= v. a 40%; ….; a 20°C= v. a 100%. il tutto però dovrebbe essere incrementale, non a scatti.
per sfizio vorrei avere anche un display che misura la temperatura attraverso altre due sonde, poste in punti intermedi tra la fonte calda e l’ambiente raffreddato.
potrei inviare uno schizzo per meglio comprendere cosa intendo, ma non riesco a postarlo nel commento. se è possibile, vorrei poterla contattare in privato.
si può fare? mi può aiutare?
Grazie
Autore
Ciao Cesare,
puoi fare entrambe le cose che descrivi con Arduino ma devi avere delle solide basi di programmazione per scrivere un algoritmo di PID come quello che desideri incrementare ed in ogni caso ricorda di impostare l’isteresi.
Il secondo obiettivo, preso da solo, è più semplice e, in quanto neofita, ti consiglio di iniziare con quest’ultimo.
Non mi serve uno schizzo per comprendere quello che ti occorre, lo hai descritto in modo sufficientemente chiaro.
L’aiuto che posso darti con il Blog è consigliarti la lettura del mio corso base gratuito e continuare con gli articoli specifici sulle sonde e sui display.
Ciao Mauro,ho provato il tuo sketch utilizzando il Ds18b20, ma mi visualizza sempre 85° e se scaldo o raffreddo la sonda mi da sempre 85°…
Cosa potrebbe essere??
La sonda la riconosce, perchè scollegandola mi segnala che non trova la sonda….
Che fare per risolvere il problema??
Autore
Ciao Maurizio,
la DS18B20 è una sonda molto utilizzata e la libreria è stata più volte testata. Potrebbe dipendere da qualche collegamento nella sonda o da un malfunzionamento del componente.
Grazie Mauro della risposta, ho riguardato i collegamenti diverse volte ma sono ok.
Ho provato a prendere arduino uno e a caricare il sw così come l’hai pubblicato (precedentemente utilizzavo un mega e fatto girare all’interno di un mio progetto).
Ho sostituito il DS con un’altro….
Ma il risultato è sempre lo stesso:85° fisso….
Ho utilizzato la libreria che è all’interno dell’IDE (1.6.3)…..forse è troppo vecchia??
Dove trovo quella aggiornata?
Una domanda: ho letto che il tempo di conversione è di 750mS…..ma durante quel tempo il micro deve stare fermo o è possibile eseguire altro??
grazie.
Ciao Mauro, ho introdotto un delay tra riga 62 e 64 di almeno 750mS ed ora restituisce il valore…
Trovo però che non è preciso; alla riga 78 ho messo /17 (valore empirico) e mi restituisce il valore quasi corretto.
La domanda è: perchè /16?
Come posso fare per abbassare la risoluzione della conversione, in modo da impiegare meno tempo?
Grazie.
Ciao
vorrei mettere in funzione il tuo progetto per misurare gli step di temperatura della fase di mash della birra. Vorrei però impostare gli step di temperatura con la tastiera del display e vedere con un processo di luci led lo stato della produzione del mosto.
– Led Giallo: temperatura impostata non ancora raggiunta
– Led Verde: temperatura impostata raggiunta
– Led Rosso: temperatura Superata
In realtà il progetto sarebbe più complesso… ma da qualche parte di deve cominciare
Pensi sia una cosa difficile?
Grazie in anticipo
Autore
Ciao Filippo,
non penso sia complesso, dipende dal tuo livello di conoscenza di programmazione e da quanta curiosità e voglia di studiare arduino e codici possiedi.
Ciao, Mauro!
Considerati complimentato per il tuo lavoro, lo sto sfruttando a man bassa …!
Avrei una piccola domanda: nella linea 62 viene eseguita una write sul bus OneWire con il secondo parametro a ‘1’. Stando a quello che mi pare di capire (anche dal commento) in questo modo si segnala che si intende utilizzare la modalità “parasitic power”.
Se non ho preso un granchio colossale, però, il chip è completamente alimentato, non preleva corrente dal pin del bus. Ad occhio non dovrebbe dar problemi (se ho capito bene viene solo detto di non “tirare giù” il bus per il resto dell’operazione per non disalimentare il chip).
C’è un motivo che mi sfugge in tutto ciò?
TI ringrazio tanto.
Tiziano
Autore
Ciao Tiziano,
hai sollevato un dubbio sul quale non mi ero soffermato. Effettivamente, leggendo sul learning arduino: https://playground.arduino.cc/Learning/OneWire la modalità “Parasite power mode” ti permette di non dover utilizzare l’alimentazione del Vcc in aggiunta al Gnd e Data.
Nella scrittura dello sketch mi sono attenuto all’esempio rilasciato dall’autore della libreria: https://github.com/PaulStoffregen/OneWire che usa la sintassi riportata nello sketch.
Leggendo direttamente nella libreria trovi:
// Write a byte. If ‘power’ is one then the wire is held high at
// the end for parasitically powered devices. You are responsible
// for eventually depowering it by calling depower() or doing
// another read or write.
void write(uint8_t v, uint8_t power = 0);
che indica esattamente quanto evidenzi, sarebbe interessante provare lo sketch senza collegare il Vcc alla sonda DS18B20 e con ua resistenza di pull-up da 4,7K come indicato nel playgroud.
ciao Mauro
volevo chiederti come azionare 3 relè data la temperatura.
siccome ho un ventilconvettore che ha bruciato la scheda che pilotava un motore,volevo ripararlo con arduino.
la particolarità di questo motore è che ha ,internamente,3 avvolgimenti e ogni avvolgimento ha la sua velocità
ho uno schizzo da che ho realizzato ma c’è un problema…
alla seconda e terza velocità i relè ticchettano sul valore loop inpostato
ovvero continuano a staccare attaccare ripetutamente
volevo chiederti se avevi qualche soluzione…..
ho usato una parte del tuo schema togliendo il serial monitor dato che lo controllo con un display I2C
grazie in anticipo
ecco lo schema:
[[ codice rimosso in automatico ]]
Autore
Ciao Matteo,
in primo luogo ti chiedo la cortesia di leggere e applicare le regole semplici del blog che trovi in fondo ad ogni articolo: ad esempio gli sketch è vietato incollarli nei commenti.
In secondo luogo il tuo problema sembra elettronico e non di codice da come lo descrivi.
Ciao Mauro
complimenti per il sito! Sono un neofita e ho niziato da poco con Arduino.
In merito al progetto conla sonda sensore DS18B20: ho un display LCD diverso, rispetto a quello da te utilizzato (esattamente ho il I2C LCD 2004/20 x 4, modello Qk51-UK [Quimatt]).
Come faccio a sostituirlo nello skecth?
Inoltre al posto della Librea “Wire” posso utilizzare la Libreria “Dallas Temperature”?
Autore
Ciao Massimiliano,
in merito al display puoi leggere i miei articoli sul display di tipo 2004 ( 20×4 ) e verificare se il tipo di libreria che utilizzo io va bene anche per il tuo modello.
In merito alla OneWire o DallasTemperature io preferisco la prima perché ti aiuta a capire meglio come funziona la sonda.
Cioa Mauro grazie per la risposta. Funziona tutto e con una precisione accettabile.
Alcune domande:
1) se volessi registrare le temperature su una SD (ho un ethernet shield con lettore sd card) cosa e come dovrei modificare lo skecth?
2) e se volessi rendere disponibili i dati on line su un sito web?
Grazie
Autore
Ciao Massimiliano,
posso consigliarti la lettura dei miei tutorial sulla scrittura su SD ed Ethernet.
ciao buona sera……sicuramente la mia domanda è stupida…. ma volevo chiederti se i valori di tale sonda possono essere registrati su un programma che mi restituisca un grafico…… sei si quale programma dovrei scaricare…
ti ringrazio
Autore
Ciao Mariangela,
nessuna domanda è stupida a mio avviso.
Il modo piu semplice è memorizzare i dati su una SD-Card, con apposita shield SD, e poi importare i valori in excel o altro foglio di calcolo e farne un grafico.
Puoi seguire i miei articoli sui datalogger che hanno già gran parte del codice scritto e testato.
Esistono altri modi come IoT, connessioni radio, ecc… ma richiedono più tempo di realizzazione e conoscenze di networking e sistemi.
Buongiorno, vorrei gestire una ventola 12v per portare aria calda dalla stanza A alla B e viceversa.Se metto 2 sensori di temperatura posso gestire la rotazione della ventola in senso orario e antiorario in base alla stanza più fredda? Premetto mi sono appena avvicinato ad arduino,ma questo”progetto” mi servirebbe per l’inverno. Grazie
Autore
Ciao Franco,
se disponi di una ventola in grado di cambiare il verso di rotazione, probabilmente con un motore DC, puoi seguire i miei tutorial sul controllo motori e, dopo averli compresi, unirvi il controllo di due sensori di temperatura.
Ciao Mauro.
In questa domenica uggiosa di fin ottobre ho voluto cimentarmi con il sensore di temperatura della Dallas DS18B20.
Premetto che sono un neofita di Arduino e quindi, dopo aver collegato correttamente il sensore, mi sono limitato a fare un copia ed incolla del tuo sketch per vedere il suo comportamento.
Indubbiamente ho depennato tutte quelle istruzioni relative alla gestione e stampa su LCD e mi sono limitato a farmi restituire il valore della temperatura acquisita sul monitor seriale.
Quello che mi sfugge è che io acquisisco la temperatura con variazioni di 0.5°C/step; osservando invece il tuo video pubblicato su YouTube la variazione di temperatura sembrerebbe di 0.06°C/step.
Per quale motovo c’è questa differenza di risoluzione ? Lo sketch che utilizzi nel video è modificato rispetto a quello pubblicato qui? Se poi non chiedo troppo potresti spiegarmi l’istruzione della riga 78?
Grazie 1000 per il tuo tempo e complimenti ancora per il tuo sito!!!!!
Autore
Ciao Claudio,
si lo sketch che utilizzo nel video è lo stesso che mostro nell’articolo e commento sotto.
Se la tua sonda non ti restituisce valori così precisi può essere dovuta al tipo di sonda o alla qualità costruttiva, io ho acquistato tale sonda da robotics-3D che è rivenditore ufficiale della DFRobot ( produttore del modello di sonda mostrata ).
In merito alla linea 78 è solo il calcolo della temperatura da restituire che avviene dividendo per 16 il valore tempRead ottenuto dall’interrogazione della sonda.
Ciao Mauro. Avrei bisogno di questo schema per controllare la temperatura dell’acido corrosivo per PCB. Secondo te, va bene questo?
Io poi mi collego con arduino per creare uno script in Python, per settare la temperatura e attivare un relè per riscaldare una resistenza. Premesso che la resistenza verrà messa all’opposto.
Grazie
Autore
Ciao Mario,
il tipo di sonda potrebbe non essere adatta all’immersione nell’acido a causa della capsula metallica.
In merito allo sketch ti consiglio di leggere l’articolo che ho realizzato già con la RPi in python per il controllo di una ventola.
Il tipo di sonda che ho utilizzato è sempre una DS18B20, in package differente, non adatto all’immersione in acido, ma almeno è già tutto in python.
Ciao, non avevo pensato a questa situazione 😉 comunque. HO trovato altre soluzioni in merito, utilizzando altri metodi.
Inoltre, ho già pronto lo script python, scritto con l’aggiunta delle librerie PySide2… Avevo fatto altre prove precedentemente.
Comunque grazie delle dritte.
Autore
Ciao Mario,
penso che il tuo progetto sia molto interessante e che possa essere utile anche ad altri appassionati.
Ti va di condividerlo ?
Se vuoi condividere il progetto trovi in questa pagina una veloce descrizione di come fare.
ciao,
come posso leggere vari sensori sulla stessa linea ?
ho trovato in rete uno schetch per identificare il seriale dei sensori
grazie
Autore
Ciao Calasci,
non ho mai provato a verificare questa possibilità, se sei riuscito a leggere il seriale puoi provare ad identificare l’origine del dato partendo da questa informazione.
ho provato , ma non ci riesco
Autore
Ciao Calasci,
cosa non riesci a fare?
spero di non essere ot:
[[ codice rimosso in automatico ]]
puoi darmi una mano ?
Autore
Ciao Calasci,
il codice viene rimosso in automatico, cosa non riesci a fare?
ciao mauro solo una domanda se non ho il modulo per il display come lo collego ?
Autore
Ciao Pasquale,
come nello schema riportato nel paragrafo “come collegare…”
Ciao MAuro, sei sempre il mio riferimento nei progetti, grazie…
Voelvo chiederti, ho fatto un termometro ed ho usato una sonda DS18B20 incapsulata; ho seguito alla lettera il tuo progetto, ma la temperatura varia di mezzo grado alla volta.
Ho letto il data sheet che in base alla risoluzione in bit (9-12) varia l’accuratezza della lettura, ma che di default è 12, la massima.
Sembra che la mia sonda però sia settata a 9bit, in quanto varia di mezzo grado alla volta.
Di questo ne sono certo, perchè ho poi preso un’altro DS18B20 non incapsulato e varia linearmente di 0,1 grado la volta.
Come posso fare per cambiare la risoluzione? Come scrivere nello sketch?
Grazie.
Autore
Ciao Maurizio,
hai provato a leggere nel datasheet del produttore per verificare se esista questa possibilità o se dipende da una impostazione di fabbrica?