DS18B20: nauwkeurig temperatuur meten met Arduino

Gepubliceerd op: 09-07-2014 18:30 - Read this in English

Hé, jij houdt niet van advertenties maar wél van kwaliteitscontent? Dat mag, maar misschien wil je dan een donatie doen via PayPal of creditcard?

Of doe je aankopen via één van onze winkelpartner-links in de zijbalk.

In veel van de Arduino projecten op EngineerAtHome wordt gebruik gemaakt van temperatuursensors. Over het algemeen gebruik ik goedkope en makkelijk te installeren NTC's, maar wat als je een betrouwbare gekalibreerde meting van de temperatuur wilt doen? Dan is de DS18B20 jouw vriend.

Temperatuur meten met Arduino

Er zijn diverse manieren om temperatuur te meten met Arduino. Het simpelst is een spanningsdeler van een temperatuurafhankelijke weerstand (NTC) en een vaste weerstand zoals uitgelegd in het weerstation artikel.

Nadelen van de NTC

Het grootste nadeel van de NTC manier is de onnauwkeurigheid. Geen enkele NTC is exact 5K, 10K 0f 20 KOhm, en dit geldt ook voor de vaste weerstanden. Daardoor zal elke temperatuursensor een net iets andere waarde aangeven. Omdat het ook nog eens erg lastig is om een formule te geven die exact het gedrag van een NTC beschrijft maakt de veelgebruikte Arduino code gebruik van een lookup-table. In deze tabel is een groot aantal waarden opgeslagen die ooit door een fanatiekeling zijn gemeten, maar die niet perse overeen hoeven te komen met onze NTC-weerstand-combinatie.

Al met al kan dit tot forse afwijkingen leiden van ongeveer 1,5 graad Celsius. Voor een simpel project dat iets moet doen bij een bepaalde temperatuurgrens is dit geen probleem. Maar nu ik meer en meer temperatuursensoren aan mijn Arduino domotica systeem aan het toevoegen ben is het wel van belang dat de metingen accuraat zijn. Het heeft anders weinig zin om buiten- en binnentemperaturen, en temperaturen in verschillende ruimtes, met elkaar te vergelijken en op te slaan.

Andere mogelijkheden

Aan mijn weerstation/domotica systeem hangen nog veel meer sensoren die intern ook temperatuur meten, bijvoorbeeld omdat dit nodig is voor het corrigeren van hun eigen metingen. De luchtvochtigheid en de luchtdruk zijn bijvoorbeeld afhankelijk van de temperatuur, en daarom herbergen deze sensoren een interne temperatuursensor.

De DHT11 is de door mij gebruikte luchtvochtigheidssensor. Deze sensor kan ook temperaturen meten van 0 tot 50 graden Celsius met een nauwkeurigheid van 2 graden Celsius. Dat is dus nog minder nauwkeurig dan mijn NTC spanningsdeler, en hij kan bovendien alleen positieve temperaturen meten! De DHT11 valt dus af als geschikte temperatuursensor.

Om de luchtdruk te meten gebruik ik een BMP085. Deze sensor kan gelukkig wel onder nul meten, namelijk van -40°C tot 85°C, maar helaas ook slechts met een nauwkeurigheid van 2°C. Hier komt nog eens bij dat ik de sensor op mijn domotica-shield heb gesoldeerd waardoor deze nogal wat warmte van de Arduino en het Ethernetshield oppikt. Ook deze sensor valt dus helaas af als geschikte kandidaat.

DS18B20 OneWire temperatuursensor

De redding komt van de DS18B20 one-wire temperatuursensor. Met een groot meetbereik van -50°C tot 125°C en een nauwkeurigheid van een 0,5°C is deze sensor precies wat ik zoek. Buiten kan het immers vriezen dus een fatsoenlijk bereik onder nul is wel zo handig.

Omdat het hier om een digitale sensor gaat komt deze gekalibreerd en wel uit de fabriek, en geeft zodoende direct de juiste temperatuur weer. Bovendien is de DS18B20 een 1-wire sensor, wat inhoudt dat er meerdere van deze sensoren op één datalijn aangesloten kunnen worden. In parasiet-modus kun je zelfs volstaan met 2 draden in plaats van 3 voor het aansluiten van een hele rits oneWire sensoren! Last but not least is er een goede DS18B20 library om de boel vlekkeloos te laten communiceren met je Arduino.

DS18B20 aansluiten op je Arduino

Aansluiten van een DS18B20 oneWire temperatuursensor aan een Arduino met een pull-up weerstand

De DS18B20 ziet eruit als een transistor: hij heeft een platte kant en 3 poten. Als je de platte kant naar je toe houdt zie je van links naar rechts Ground, Data en +5 Volt. Deze kun je eenvoudig met de overeenkomende aansluitingen van je Arduino verbinden. Vergeet niet de datalijn 'omhoog te trekken' met een pull-up weerstand tussen de 5 Volt en Data-lijn van ongeveer 4,7 Kilo-Ohm.

Ik heb inmiddels overal waar het van belang was de NTC's vervangen door DS18B20's en geniet nu van accurate temperatuurmetingen met mijn Arduino. Wanneer je veel van deze sensoren nodig hebt en het niet erg vindt om een paar weken te wachten kun je ze goedkoop van Ebay of DX.com halen!

7 reacties op dit artikel »

Meer van dit soort artikelen lezen?