De Programmeerbare Plantenkas: De DS18B20 temperatuursensor aansluiten en programmeren om de temperatuur te meten

DE PROGRAMMEERBARE PLANTENKAS: DE DS18B20 TEMPERATUURSENSOR AANSLUITEN EN PROGRAMMEREN OM DE TEMPERATUUR TE METEN

SENSOR (CHIP): DS18B20 - MEETTECHNIEK: halfgeleider - MEETBEREIK (IN ℃): - 55 TOT +125 - PRECISIE (IN ℃): 0,5 - AANSLUITING: DIGITAL

In deze tutorial laten we zien hoe je een DS18B20 temperatuursensor aansluit en programmeert om de temperatuur te meten met een Arduino microcontroller of een andere microcontroller. Deze tutorial hoort bij het artikel "De Programmeerbare Plantenkas: De temperatuur meten met een temperatuursensor", waarin we vertellen hoe je kunt bepalen welke temperatuursensor geschikt is voor jouw project, en waarin we de prestaties van verschillende temperatuursensoren met elkaar vergelijken.

Aansluiten

De DS18B20 temperatuursensor wordt in verschillende verpakkingen verkocht. De goedkoopste, en meest kwetsbare, versies zijn vaak voorzien van een TO-92 omhulsel. Daarnaast worden DS18B20 temperatuursensoren vaak verkocht in een waterdicht omhulsel, waarvan de punt van metaal is. In de meeste gevallen bestaat het uiteinde van de waterdichte DS18B20 sensor uit drie draden, die je zelf moet voorzien van een weerstand en connector. Verderop vertellen we hoe je dit het beste kunt doen. Mocht je dit, net als ik, nogal wat gedoe vinden, dan kun je gelukkig tegenwoordig ook een waterdichte DS18B20 temperatuursensor kopen die al voorzien is van een weerstand en een Grove connector of met standaard aansluitpinnen van het merk Whadda.

ds18b20, temperatuursensor
De DS18B20 temperatuursensor kan kant-en-klaar, met een ingebouwde weerstand en Grove aansluiting, gekocht worden.

Wanneer je voor een DS18B20 temperatuursensor kiest waaraan je zelf nog een weerstand en een connector moet toevoegen, dan kun je dit het beste doen door een 4,7K ohm weerstand in parallel tussen de rode 5 volt en de gele data kabel te solderen. Dit is wat priegelwerk, daarom is het handig om met een derde hand, bijvoorbeeld van TOOLCRAFT of Velleman, te werken die de kabels en weerstanden vast kan houden. Ook is het aan te raden om soldeervloeistof op de draden aan te brengen voordat je gaat solderen en een soldeerbout met een fijne punt te gebruiken.

ds18b20, temperatuursensor
Het aansluitschema voor de aansluiting van een DS18B20 temperatuursensor op een Grove Base Shield.

De 4,7K ohm weerstand moet dus in parallel tussen de gele data kabel en de rode 5 volt kabel geplaatst worden. Hiervoor moet je eerst van beide draden op een paar centimeter van het einde van de draad een klein stukje, ongeveer 3 millimeter, van de isolatie weg halen. De koperen draad wordt dan zichtbaar. Het weg halen van de isolatie lukt vaak goed met een scherp (hobby) mesje met een fijne punt. 

Vervolgens vouw je de weerstand rondom een van de kabels. De benen van de weerstand zijn te lang voor deze constructie, dus als de weerstand eenmaal goed om de draad heen zit, kun je het stuk dat uitsteekt weg knippen. Het is aan te raden om de ene kant van de derde hand de kabel vast te laten houden en de andere kant de weerstand. Dit maakt het makkelijker om de weerstand aan de draad vast te solderen. Voor het solderen smeer je de draad en de weerstand eerst in met soldeervloeistof. Vervolgens soldeer je de draad en de weerstand voorzichtig aan elkaar vast. Probeer hierbij zo min mogelijk de isolatie van de draad te beschadigen.

ds18b20, temperatuursensor
Haal van de rode 5V kabel en de gele data kabel een klein stukje isolatie weg.
ds18b20, temperatuursensor
Draai de weerstand om het blote stukje draad heen.
ds18b20, temperatuursensor
Soldeer de weerstand vast aan de draad.

 Als de weerstand aan de ene kant goed vast zit, dan kun je hetzelfde doen voor de andere kant van de weerstand. Uiteindelijk zijn de rode 5 volt draad en de gele data draad dus aan elkaar verbonden door de weerstand, maar zijn ze niet één draad geworden. Om de kabel af te maken voorzie je de zwarte aarde, de gele data en de rode 5 volt kabel van een connector naar keuze.

ds18b20, temperatuursensor
Draai de andere kant van de weerstand om de gele draad.
ds18b20, temperatuursensor
Soldeer de weerstand vervolgens vast aan de gele draad.
ds18b20, temperatuursensor
Voorzie de uiteinde van de draden van stekkers.

Uiteraard zijn de weerstand en de aansluitingen tussen de weerstand en de draden kwetsbaar. Bescherm ze daarom in ieder geval met een krimpkous. Eventueel kun je voordat je de krimpkous aan brengt eerst nog een kunststof pijpje rondom de weerstand aanbrengen, om deze beter te beschermen tegen beschadigingen.

ds18b20, temperatuursensor
Bescherm de weerstand met krimpkous.
ds18b20, temperatuursensor
Sluit de sensor aan op een Grove female aansluitkabel.
ds18b20, temperatuursensor
Sluit de sensor aan op een digitale poort van de Grove Base Shield.

Programmeren

De communicatie tussen de DS18B20 sensor en de microcontroller is anders dan bij de meeste sensoren. De sensor maakt namelijk gebruik van een Dallas 1-Wire protocol. Dit betekent dat de kabel die de 5 volt levert en de digitale input kabel met elkaar verbonden zijn. Hierdoor kunnen er meerdere DS18B20 sensoren op één digitale input pin aangesloten worden. Het programmeren van een DS18B20 sensor is hierdoor wel iets ingewikkelder dan het programmeren van veel andere temperatuursensoren. Om het werken met deze sensor zo eenvoudig mogelijk te maken, hebben wij geëxperimenteerd met een aantal bibliotheken die met deze sensor werken. Uiteindelijk hebben wij er voor gekozen om de Dallas Temperature bibliotheek van Miles Burton te gebruiken, omdat deze zeer eenvoudig is. Om de sensor te laten werken, moet je naast de Dallas Temperature bibliotheek ook de OneWire bibliotheek toevoegen, voor de communicatie. De twee bibliotheken laden we in het programma met de commando's #include <OneWire.h> en #include <DallasTemperature.h>

Na het laden van de twee bibliotheken vertellen we de OneWire bibliotheek waar de sensor zit, in dit geval op digitale input pin 2, met het commando OneWire oneWire(ONE_WIRE_BUS);. Vervolgens vertellen we de twee bibliotheken dat ze met elkaar moeten samenwerken, door de commando's OneWire oneWire(ONE_WIRE_BUS); en DallasTemperature ds18b20(&oneWire);.  Met dit laatste commando hebben we de DS18B20 sensor meteen de naan ds18b20 gegeven. Onthou dat deze code hoofdletter gevoelig is. Als je verder op DS18B20 intypt in plaats van ds18b20, dan weet het programma niet dat je deze sensor bedoeld.

Als laatste voorbereiding maken we nog een variabele aan die we DS18B20gradenC noemen. Dit doen we met het commando float DS18B20gradenC;. Het commando float dat we voor de naam van de variabele zetten geeft aan dat deze variabele een komma getal zal bevatten. 

In de setup fase moeten we de communicatie met de sensor aan zetten. Dit doen we met het commando ds18b20.begin();. Mocht je de sensor aan het begin van de code een andere naam hebben gegeven, dan moet je hier ook de naam van de sensor wijzigen. 

Wij hebben er voor gekozen om het opvragen van de temperatuur aan de sensor in een aparte functie te zetten. Op die manier kan deze code makkelijk gecombineerd worden met codes van andere sensoren en onderdelen, zonder dat de loop overvol wordt. De functie hebben we de naam GROVEDS18B20() gegeven. Uiteraard kun je zelf een naam kiezen, maar het is altijd handig om een naam te kiezen die logisch is. Omdat we willen dat de temperatuur als een kommagetal gegeven wordt hebben we float voor de naam van de functie gezet. Hierdoor ontstaat dus het commando float GROVEDS18B20(). Wat er vervolgens tussen de daarop volgende {} staat zijn de commando's die bij dit programma horen.  

In de functie beginnen we met het commando ds18b20.requestTemperatures();. Dit zorgt ervoor dat de bibliotheek met de sensor gaat communiceren en gegevens over de temperatuur uit de sensor gaat opvragen. Vervolgens slaan we de temperatuur in de DS18B20gradenC variabele die we aan het begin van de code hebben gemaakt, met het commando float gradenC = ds18b20.getTempCByIndex(0);. De DS18B20 temperatuursensor maakt gebruikt van het Dallas 1-Wire protocol dat het mogelijk maakt om meerdere van deze temperatuursensoren op één digitale poort aan te sluiten. De meest eenvoudige manier om de temperatuur uit te lezen als je maar één sensor gebruikt is door het getTempCByIndex() commando te gebruiken. Onze enige sensor is immers altijd ook de eerste sensor, ofwel nummer 0 in de index. Mocht je meerdere DS18B20 sensoren gaan gebruiken, dan kun je het beste even de documentatie van de bibliotheek na lezen om erachter te komen hoe je dit het beste kunt doen. 

Om ervoor te zorgen dat de waarde van de variabele DS18B20gradenC gelijk is aan de huidige temperatuur, laten we onze zelfgemaakte functie in het loop gedeelte van het programma uit voeren. Dit doen we met het commando GROVEDS18B20();. Op dit moment wordt er nog niets met de temperatuur gedaan. Er zijn uiteraard talloze manieren om de gemeten temperatuur te gebruiken. Zo kun je het gebruiken om een verwarmingsmat aan te zetten als het te koud is. 

Arduino IDE code


/*
   Voorbeeld code gemaakt door www.foodplanting.com
   voor de Programmeerbare Plantenkas serie.

   Deze code is gemaakt voor een DS18B20 temperatuursensor.

   Deze code maakt gebruikt van de DallasTemperature bibliotheek
   van SparkFun.
   Meer info over deze bibliotheek vindt je hier:
   https://github.com/milesburton/Arduino-Temperature-Control-Library

   Deze code is zeer minimalistisch, omdat het idee is
   dat deze code gecombineerd wordt met codes voor andere
   modules. Zo wordt de temperatuur bijvoorbeeld niet in de
   loop fase, maar in een aparte functie op geroepen en
   wordt de gemeten temperatuur niet in de Serial Monitor
   af geprint.
*/

// Voorbereiding:
#include <OneWire.h>
#include <DallasTemperature.h> // Dit laadt de bibliotheek die nodig is om de temperatuursensor te lezen.
#define ONE_WIRE_BUS 2 // Dit geeft aan op welke digitale input de sensor is aangesloten, in dit geval D2.
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature ds18b20(&oneWire); // Dit geeft aan hoe we de sensor noemen in de code en laat de OneWire en DallasTemperature bibliotheek met elkaar communiceren.
float DS18B20gradenC; // Dit creëert een globale variabele waarin de gemeten temperatuur wordt opgeslagen.

// Setup fase:
void setup() {
  ds18b20.begin(); // Zet de communicatie tussen de microcontroller en de sensor aan.
}

// Loop fase:
void loop() {
  GROVEDS18B20(); // Vraag de microcontroller om de functie die de temperatuur uit de sensor ophaalt uit te voeren.
}

//Functie voor temperatuursensor:
float GROVEDS18B20() {
  ds18b20.requestTemperatures(); // Dit activeert de bibliotheek om de temperatuur uit de sensor te halen.
  DS18B20gradenC = ds18b20.getTempCByIndex(0); // Dit slaat de temperatuur op in de globale variabele.
  return DS18B20gradenC; // De functie zal de waarde van variabele AHT20gradenC updaten met de gemeten temperatuur.
}


Vragen en opmerkingen

We proberen de serie "De Programmeerbare Plantenkas" zo toegankelijk mogelijk te maken voor iedereen. Toch zijn sommige concepten best wel ingewikkeld, omdat er kennis van heel veel verschillende domeinen, zoals natuurkunde, elektrotechniek en computerwetenschappen, samen komen. Het kan daarom best zijn dat we iets niet goed uitgelegd hebben. Mocht er iets niet duidelijk zijn of iets niet zo werken zoals we het in deze tutorial uitgelegd hebben, stuur dan gerust een berichtje via de Disqus op deze pagina. Je kunt de Disqus vinden door naar beneden te scrollen, tot onder de advertenties.