Ecco un buon dispositivo per misurare la temperatura in modo semplice e preciso, senza problemi dovuti a tensioni negative e conversioni Analogico-Digitale con conseguenti calcoli da fare eseguire alla vostra CPU.
Ho deciso di scrivere questo post dopo che nelle ultime settimane ho notato che sul forum di arduino si è parlato molto di sensori di temperatura.
Ho pensato di fare qualcosa sui 18b20 della Dallas, visto che sugli LM35 si trova già qualcosa in italiano sul playground di arduino.
Ho provato ad utilizzare questo sensore sia da solo che insieme a suoi gemelli, arrivando a connetterne fino a 3, ovviamente sullo stesso bus.
Il DS18B20 è un sensore di temperatura digitale con una risoluzione programmabile da 9 a 12 bit, si possono quindi eseguire letture molto precise, settato a 12bit è in grado di leggere un intervallo minimo pari a 0.0625°.
I DS18B20 possono essere connessi sia in modalità External Power, a 3 fili (Vcc/GND/DATA), sia in modalità Parasite Powered, a 2 fili (GND/DATA), in quest’ultima configurazione, si puo’ risparmiare un cavo.
Personalmente ho provato entrambe le modalità di connessione, ho fatto le mie prove con tre sensori connessi sul bus, ovviamente funziona ugualmente bene, ma nei miei progetti preferisco connetterli in modalità External Power, quindi connettendo anche Vcc (pin3).
Il DS18B20 ha una accuratezza in lettura di ±0.5°C nell’intervallo che va da -10°C a +85°C.
Nel codice usato nei test, vengono impiegate due librerie:
- DallasTemperature.h
- OneWire.h
Qui sotto potete trovare il codice utilizzato durante i test, come al solito non mi sono inventato nulla, lo sketch che ho modificato per connettere i 3 sensori, sta negli esempi della libreria DallasTemperature.h
#include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into port 2 on the Arduino #define ONE_WIRE_BUS 2 #define TEMPERATURE_PRECISION 12 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); // arrays to hold device addresses DeviceAddress insideThermometer1, insideThermometer2, outsideThermometer; void setup(void) { // start serial port Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo"); // Start up the library sensors.begin(); // locate devices on the bus Serial.print("Locating devices..."); Serial.print("Found "); Serial.print(sensors.getDeviceCount(), DEC); Serial.println(" devices."); // report parasite power requirements Serial.print("Parasite power is: "); if (sensors.isParasitePowerMode()) Serial.println("ON"); else Serial.println("OFF"); // assign address manually. the addresses below will beed to be changed // to valid device addresses on your bus. device address can be retrieved // by using either oneWire.search(deviceAddress) or individually via // sensors.getAddress(deviceAddress, index) //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 }; //outsideThermometer = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 }; // search for devices on the bus and assign based on an index. ideally, // you would do this to initially discover addresses on the bus and then // use those addresses and manually assign them (see above) once you know // the devices on your bus (and assuming they don't change). // // method 1: by index //if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); // if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1"); // method 2: search() // search() looks for the next device. Returns 1 if a new address has been // returned. A zero might mean that the bus is shorted, there are no devices, // or you have already retrieved all of them. It might be a good idea to // check the CRC to make sure you didn't get garbage. The order is // deterministic. You will always get the same devices in the same order // // Must be called before search() oneWire.reset_search(); // assigns the first address found to insideThermometer if (!oneWire.search(insideThermometer1)) Serial.println("Unable to find address for insideThermometer1"); if (!oneWire.search(insideThermometer2)) Serial.println("Unable to find address for insideThermometer2"); // assigns the seconds address found to outsideThermometer if (!oneWire.search(outsideThermometer)) Serial.println("Unable to find address for outsideThermometer"); // show the addresses we found on the bus Serial.print("Device 0 Address: "); printAddress(insideThermometer1); Serial.println(); Serial.print("Device 1 Address: "); printAddress(insideThermometer2); Serial.println(); Serial.print("Device 2 Address: "); printAddress(outsideThermometer); Serial.println(); // set the resolution to TEMPERATURE_PRECISION bit sensors.setResolution(insideThermometer1, TEMPERATURE_PRECISION); sensors.setResolution(insideThermometer2, TEMPERATURE_PRECISION); sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION); Serial.print("Device 0 Resolution: "); Serial.print(sensors.getResolution(insideThermometer1), DEC); Serial.println(); Serial.print("Device 1 Resolution: "); Serial.print(sensors.getResolution(insideThermometer2), DEC); Serial.println(); Serial.print("Device 2 Resolution: "); Serial.print(sensors.getResolution(outsideThermometer), DEC); Serial.println(); } // function to print a device address void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { // zero pad the address if necessary if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } } // function to print the temperature for a device void printTemperature(DeviceAddress deviceAddress) { float tempC = sensors.getTempC(deviceAddress); Serial.print("Temp C: "); Serial.print(tempC); // Serial.print(" Temp F: "); // Serial.print(DallasTemperature::toFahrenheit(tempC)); } // function to print a device's resolution void printResolution(DeviceAddress deviceAddress) { Serial.print("Resolution: "); Serial.print(sensors.getResolution(deviceAddress)); Serial.println(); } // main function to print information about a device void printData(DeviceAddress deviceAddress) { Serial.print("Device Address: "); printAddress(deviceAddress); Serial.print(" "); printTemperature(deviceAddress); Serial.println(); } void loop(void) { // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus Serial.print("Requesting temperatures..."); sensors.requestTemperatures(); Serial.println("DONE"); // print the device information printData(insideThermometer1); printData(insideThermometer2); printData(outsideThermometer); delay(10000); }</pre> <pre>
Questo è ciò che potete leggere dalla seriale provando lo sketch…
Dallas Temperature IC Control Library Demo Locating devices...Found 3 devices. Parasite power is: OFF Device 0 Address: 281E6329020000A5 Device 1 Address: 2881552902000028 Device 2 Address: 28BB7629020000BC Device 0 Resolution: 12 Device 1 Resolution: 12 Device 2 Resolution: 12 Requesting temperatures...DONE Device Address: 281E6329020000A5 Temp C: 27.87 Device Address: 2881552902000028 Temp C: 27.12 Device Address: 28BB7629020000BC Temp C: 27.00 Requesting temperatures...DONE Device Address: 281E6329020000A5 Temp C: 27.81 Device Address: 2881552902000028 Temp C: 27.12 Device Address: 28BB7629020000BC Temp C: 27.06
Eh si… avete ragione, fa caldo in camera mia… troppa roba accesa
.
BTW.. Il primo dei tre sensori, è più caldo perchè vicinissimo alla mia mano sinistra.
I sensori sono montati su degli zoccolini, su una PCB1 c’è il sensore 1, sulla PCB2 ci sono i sensori 2 e 3. I cavi di connessione:
- Arduino <-> PCB1 – Circa 10 cm
- PCB1 <-> PCB2 – Circa 20 cm
Nel mio mini-SHOP potete trovare:
- Sensore digitale DS18B20
- Scheda di connessione “Master” (PCB1)
- Scheda di connessione “Slave” (PCB2)
- Kit di test completo (PCB1+PCB2+Sensori)
That’s All!
Il post che avete letto è basato sull’originale in inglese scritto dall’autore (almeno credo sia l’autore) della libreria DallasTemperature per arduino:
Dallas_Temperature_Control_Library
Qui potete trovare la libreria OneWire e tutte le informazioni a lei relative


io ho provato a rilevare la temperatura con un solo sensore, ed ho usato l’esempio della libreria, peroò non sono riuscito a leggere nessuna temperatura
Ciao,
dammi qualche informazione aggiuntiva, tipo:
in che configurazione hai usato il sensore?
L’hai usato in modalità “external power” o “parasite power”?
Che tipo di output hai ottenuto della seriale?
l’ho collegato in external power e l’output era praticamente tutto zero.
ma in configurazione parasite power il pin 3 non va collegato a GND???
Alfonso dice giusto!!
Sistemate le immagini dell’articolo