Arduino – Temperatuur sensor DS18B20
Hardware
BESTEL NU!
BESTEL NU! (WATERDICHT)
De DS18B20 (of QT18B20) is een nauwkeurige digitale temperatuur sensor, het is een Dallas one-wire device en werkt op 3.3v, je kan meerdere sensoren aansluiten via dezelfde pinnen en deze uitlezen.
Afwijking: ±0,5°C bij −50°C en +85°C
Specificaties:
– 1-Wire interface vereist slechts 1 pin voor communicatie
– 9/10/11/12 bits resolutie (in te stellen)
– 64-bit serial code opgeslagen in een geïntegreerde ROM
– Kan worden gevoed vanuit datalijn.
– Voeding bereik is 3,0 V tot 5,5 V
– Meet temperaturen van -55 ° C tot +125 ° C
– ± 0,5 ° C nauwkeurigheid van -10 ° C tot +85 ° C
Pinout
Pin: | Functie |
1 | GND |
2 | Digitale uitgang |
3 | Vdd (+3.3v) |
Wat heb je nodig?
1) Weerstand van 4,7 kΩ
2) Arduino OneWire bibliotheek
Aansluiten op de Arduino
Sluit de DS18B20 aan volgens onderstaand schema (raadpleeg altijd de datasheet voor de juiste pinout):
DS18B20 pin: | Arduino pin: |
---|---|
1 (GND) | GND |
2 (Digitale uitgang) | D2 |
3 (Vdd (+3.3v)) | +3.3v |
Meerdere sensoren aansluiten
Normale Voeding
Als je de normale voeding gebruikt, dan is de onderstaande schakeling wat je nodig hebt om meerdere sensoren aan te sluiten.
Parasiet Voeding
In deze methode sluiten we in principe pin 1 en 3 van de sensor kort en trekt de sensor stroom via de data pin.
Meetresolutie instellen
Het is mogelijk om de meetresolutie van de sensor te cconfigureren dat kan met het inladen van de dallas bibliotheek:
Voor 12-Bit: sensors.setResolution(temp1, 12);
Maar des te preciezer, hoe langer het duurt voordat data opgevraagd wordt:
Mode | Resol | Conversion time |
9 bits | 0.5°C | 93.75 ms |
10 bits | 0.25°C | 187.5 ms |
11 bits | 0.125°C | 375 ms |
12 bits | 0.0625°C | 750 ms |
Zie voorbeeld code onder.
(bron)
Script met alleen OneWire bibliotheek
Onderstaand script leest de DS18B20 sensor uit met alleen de OneWire bibliotheek, en geeft het aantal graden weer via de seriële console (bron)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <OneWire.h> // DS18B20 op pin 2. OneWire ds(2); void setup() { // Start seriele poort. Serial.begin(9600); } void loop() { byte data[2]; ds.reset(); ds.write(0xCC); ds.write(0x44); delay(750); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); int Temp = (data[1]<<8)+data[0]; Temp = Temp>>4; // schrijf temperatuur naar console. Serial.print(" T = "); Serial.print(Temp); Serial.println("'C"); } |
Console output:
Script met Dallas Temperature Control bibilotheek
Wat heb je nodig?
1) Weerstand van 4,7 kΩ
2) Arduino OneWire bibliotheek
3) Arduino Dallas TLC bibliotheek
Onderstaand script leest de DS18B20 sensor uit met de Dallas TLC en OneWire bibliotheek, en geeft het aantal graden (gedetaileerder) weer via de seriële console (bron)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into port 2 on the Arduino #define ONE_WIRE_BUS 2 // 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); void setup(void) { // start serial port Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo"); // Start up the library sensors.begin(); } void loop(void) { // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus Serial.print("Requesting temperatures..."); sensors.requestTemperatures(); // Send the command to get temperatures Serial.println("DONE"); Serial.print("Temperature for the device 1 (index 0) is: "); Serial.println(sensors.getTempCByIndex(0)); } |
De console output:
Met het “DS18x20_Temperature” voorbeeld uit de bibliotheek kun je ook de serienummers laten weergeven in de console:
Script om adressen van aangesloten sensoren weer te geven met OneWire bibliotheek
Wat heb je nodig?
1) Weerstand van 4,7 kΩ
2) Arduino OneWire bibliotheek
Onderstaand script leest de adressen van de aangesloten DS18B20 sensoren uit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include <OneWire.h> OneWire ds(3); // Connect your 1-wire device to pin 3 void setup(void) { Serial.begin(9600); discoverOneWireDevices(); } void discoverOneWireDevices(void) { byte i; byte present = 0; byte data[12]; byte addr[8]; Serial.print("Looking for 1-Wire devices...\n\r"); while(ds.search(addr)) { Serial.print("\n\rFound \'1-Wire\' device with address:\n\r"); for( i = 0; i < 8; i++) { Serial.print("0x"); if (addr[i] < 16) { Serial.print('0'); } Serial.print(addr[i], HEX); if (i < 7) { Serial.print(", "); } } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n"); return; } } Serial.print("\n\r\n\rThat's it.\r\n"); ds.reset_search(); return; } void loop(void) { // nothing to see here } |
Bron: hacktronics.com
Console output:
1 2 3 4 5 6 |
Looking for 1-Wire devices... Found '1-Wire' device with address: 0x28, 0xFF, 0xD7, 0x1F, 0x53, 0x04, 0x00, 0x41 That's it. |
Script om meerdere sensoren uit te lezen
Wat heb je nodig?
1) Weerstand van 4,7 kΩ
2) Arduino OneWire bibliotheek
3) Arduino Dallas TLC bibliotheek
Onderstaand script leest meerdere sensoren uit met de adresgegevens die je scant met bovenstaand script, zo kan je een variabele toewijzen aan een sensor id.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into pin 3 on the Arduino #define ONE_WIRE_BUS 3 // Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); // Assign the unique addresses of your 1-Wire temp sensors. // See the tutorial on how to obtain these addresses: // http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html DeviceAddress insideThermometer = { 0x28, 0xFF, 0xD7, 0x1F, 0x53, 0x04, 0x00, 0x41 }; DeviceAddress outsideThermometer = { 0x28, 0x71, 0x82, 0x39, 0x06, 0x00, 0x00, 0xf3 }; void setup(void) { // start serial port Serial.begin(9600); // Start up the library sensors.begin(); // set the resolution to 12 bit (if needed) //sensors.setResolution(insideThermometer, 12); //sensors.setResolution(outsideThermometer, 12); } void loop(void) { delay(2000); Serial.print("Getting temperatures...\n\r"); sensors.requestTemperatures(); Serial.print("Inside temperature is: "); printTemperature(insideThermometer); Serial.print("\n\r"); Serial.print("Outside temperature is: "); printTemperature(outsideThermometer); Serial.print("\n\r"); } void printTemperature(DeviceAddress deviceAddress) { float tempC = sensors.getTempC(deviceAddress); if (tempC == -127.00) { Serial.print("Error getting temperature"); } else { Serial.print("C: "); Serial.print(tempC); Serial.print(" F: "); Serial.print(DallasTemperature::toFahrenheit(tempC)); } } |
Console output:
1 2 3 |
Getting temperatures... Inside temperature is: C: 20.19 F: 68.34 Outside temperature is: C: 8.39 F: 47.10 |
[#/datasheets/ds18b20″ ]