Handboek · hoofdstuk 22De spanningsdeler en sensoren
Hoe een microcontroller licht en temperatuur 'ziet': van weerstand naar spanning naar getal
Een LDR, een NTC en een draaiknop hebben één ding gemeen: hun weerstand verandert. Een microcontroller kan geen weerstand meten, alleen spanning. De brug tussen die twee is de spanningsdeler: twee weerstanden in serie, met een aftakking in het midden. In dit hoofdstuk leid je zijn formule af, kies je de juiste vaste weerstand, reken je een ADC-waarde om naar lux en graden, en leer je waarom een meter of een ingang de meting zelf kan verstoren. Je ijkt een NTC met een referentie en bouwt de lichtsensor die beslist of de groeilampen van de klimaatmodule aan moeten.

- Je kan de formule van de spanningsdeler afleiden met de wetten van Kirchhoff en ze in beide richtingen gebruiken.
- Je kan uitleggen hoe een LDR, een NTC en een potentiometer werken, en hun karakteristiek lezen en tekenen.
- Je kan een vaste weerstand kiezen zodat de sensor gevoelig is in het gebied waar het om gaat.
- Je kan een ADC-waarde van een microcontroller omrekenen naar spanning, weerstand en de gemeten grootheid (lux, °C).
- Je kan berekenen hoeveel een belasting de uitgang van een spanningsdeler verandert, en uitleggen waarom een ingang hoogohmig moet zijn.
- Je kan een sensor ijken met een referentie, ook als zijn karakteristiek niet recht is.
- Je kan een sensorprogramma in C++ schrijven dat een ADC-waarde omzet in een beslissing.
Twee toevallige ontdekkingen
In 1833 zag Michael Faraday iets vreemds bij zilversulfide: het geleidde beter naarmate het warmer werd. Bij metalen is het net omgekeerd; een warme koperdraad heeft een iets grotere weerstand (F19). Faraday had, zonder het te weten, een halfgeleider in handen: een stof waarin warmte extra ladingen vrijmaakt (hoofdstuk 23). Een NTC, de temperatuursensor van dit hoofdstuk, werkt nog altijd zo.
Veertig jaar later, in 1873, schreef de Engelse telegraafingenieur Willoughby Smith een brief aan het tijdschrift Nature. Hij gebruikte staafjes selenium als zeer grote weerstanden bij het testen van onderzeese telegraafkabels, en merkte dat hun weerstand sterk wisselde. De oorzaak bleek het licht: in een afgesloten doos was de weerstand groot, zodra het deksel openging, daalde ze. Dat is het principe van de LDR, de lichtgevoelige weerstand, en de voorloper van de eerste lichtmeters en fotocellen.
Beide ontdekkingen gaan over een weerstand die verandert met de omgeving. Wie die verandering kan meten, heeft een sensor. Daarvoor is één schakeling nodig, zo eenvoudig dat ze in bijna elk toestel zit: de spanningsdeler.
De groeilampen van de klimaatmodule zijn goed voor 93 % van haar energieverbruik (hoofdstuk 20). Als er genoeg daglicht is, hoeven ze niet te branden. Een goede lichtsensor spaart dus meer energie dan welke andere maatregel ook. Hetzelfde geldt voor de temperatuur van het reservoir: te warm water bevat weinig zuurstof voor de wortels.

Een microcontroller meet spanning, geen weerstand
Een analoge ingang van een Arduino Uno (A0 tot A5; de Mega van de klimaatmodule heeft er zestien, A0 tot A15, met dezelfde ADC) meet de potentiaal van één punt ten opzichte van GND (hoofdstuk 21), en zet die om in een getal. Dat doet de ADC, de analoog-digitaalomzetter. Hij verdeelt het gebied van 0 tot 5 V in stappen: het getal gaat van 0 tot 1023, en één stap is . Hoe dat binnenin werkt, zie je in hoofdstuk 25.
Een LDR of een NTC levert geen spanning: het is een weerstand. Hang je hem gewoon aan een ingang, dan gebeurt er niets. Zet je hem in serie met een vaste weerstand tussen 5 V en GND, dan hangt de spanning op het punt ertussen af van de weerstand van de sensor. Die schakeling is de spanningsdeler. De figuur toont de drie sensoren van dit hoofdstuk, elk met hun eigen deler aan hun eigen ingang.
| wat je al weet | wat er nu bijkomt |
|---|---|
| Een analoge ingang geeft een getal van 0 tot 1023 (F24, F25). | Wat dat getal precies is: een spanning, in stappen van 4,88 mV. |
| In serie verdeelt de spanning zich; de grootste weerstand krijgt het meest (F20). | De formule van de spanningsdeler, en hoe je ze omkeert om een weerstand te meten. |
| Een sensor ijken met een referentie (F25, hoofdstuk 3). | Een niet-lineaire sensor ijken door hem eerst recht te trekken. |
| Knooppunt- en maaswet (hoofdstuk 21). | Waarom de ingang van een microcontroller bijna geen stroom mag trekken. |
In veel voorbeeldcode (ook in hoofdstuk 11 en 16) staat U = N * 5.0 / 1023. De datasheet van de ATmega328P, de chip op de Uno, rekent met 1024 stappen: betekent 'tussen 4,995 en 5 V'. Het verschil tussen beide formules is kleiner dan één stap (0,1 %). In dit hoofdstuk volgen we de datasheet.
De spanningsdeler
Twee weerstanden en staan in serie over een spanning . Zolang er niets aan de aftakking hangt (of iets dat geen stroom trekt), loopt door beide dezelfde stroom (knooppuntwet). De maaswet geeft , dus . De spanning over is dan :
Drie dingen vallen op. De uitgang hangt alleen af van de verhouding van de weerstanden: 1 kΩ met 1 kΩ geeft dezelfde 2,5 V als 1 MΩ met 1 MΩ. De grootste weerstand krijgt het grootste deel van de spanning (F20). En de formule is eenvoudig om te keren: ken je en , dan vind je :
Voedt de deler zich uit dezelfde 5 V die de ADC als referentie gebruikt, dan is . De voedingsspanning valt uit de formule: of de USB-poort nu 4,8 of 5,1 V levert, het getal blijft hetzelfde. Daarom voed je een sensordeler altijd uit de 5 V van de microcontroller zelf, en niet uit een andere voeding.
De batterijspanning meten
De microcontroller van de klimaatmodule volgt de spanning van de LiFePO4-batterij (hoofdstuk 16). Die schommelt tussen ongeveer 10 V (helemaal leeg) en 14,6 V (laden). Een ingang verdraagt hoogstens 5 V. Daarom hangt er een deler van 100 kΩ (boven) en 33 kΩ (onder) tussen de batterij en GND, met de aftakking op A0. (a) Welke spanning en welke ADC-waarde horen bij 12,8 V en bij 14,6 V? (b) Tot welke batterijspanning kan je meten? (c) Hoeveel stroom kost de deler? (d) Hoe groot is één ADC-stap, uitgedrukt in batterijspanning?
- ,
- ADC: 10 bit,
- U op A0 en N bij 12,8 V en 14,6 V
- grootste meetbare spanning
- stroom
- stap
- 1Verhouding: .
- 2(a) Bij 12,8 V: , . Bij 14,6 V: , .
- 3(b) De ingang mag 5,00 V krijgen: .
- 4(c) ; over een dag , tegenover 120 Ah in de batterij.
- 5(d) Eén stap is 4,88 mV op A0, dus batterijspanning.
De LDR
Een LDR (light dependent resistor, fotoweerstand) is een keramisch schijfje met een laagje cadmiumsulfide (CdS). Het schijfje van de GL5528 is ongeveer 5 mm breed.
- 1CdS-spoor
Het oranje spoor tussen de kammen. In het donker zijn er in cadmiumsulfide bijna geen vrije ladingen: grote weerstand. Licht maakt elektronen vrij, en hoe meer licht, hoe meer (hoofdstuk 23).
- 2Elektroden (kammen)
Twee in elkaar grijpende metalen kammen. Zo is het spoor kort en heel breed: dat geeft een kleine weerstand en een grote gevoelige oppervlakte.
- 3Aansluitdraden
Twee draadjes, geen plus of min: een LDR is een gewone weerstand en werkt in beide richtingen.
- 4Doorzichtige laklaag
Epoxy beschermt het CdS tegen vocht. De gevoeligheid is het grootst voor groen licht (540 nm), net als bij het menselijk oog.
- 5Keramische drager
Isoleert, en voert de beetje warmte af: volgens de datasheet mag de LDR hoogstens 100 mW opnemen.
- 6Symbool
Een weerstand met twee pijlen die naar binnen wijzen: er valt licht op.
De karakteristiek van een LDR
Hoe meer licht, hoe kleiner de weerstand, maar niet evenredig: tien keer meer licht maakt de weerstand ongeveer vijf keer kleiner. Zet je zowel de verlichtingssterkte (in lux) als de weerstand op een logaritmische schaal (hoofdstuk 5), dan krijg je een rechte. Een rechte in een log-loggrafiek is een machtsfunctie:
Met : bij 100 lx is , bij 1000 lx . Het model geldt goed tussen ongeveer 1 en 1000 lux; daarbuiten buigt de echte kromme af.
Een LDR is een goedkope, robuuste en gevoelige sensor, maar geen precisie-instrument. De spreiding is groot: ligt ergens tussen 8 en 20 kΩ, dus zonder ijking is elke lux-waarde een schatting. Hij is traag: na een lichtflits duurt het tientallen milliseconden, van licht naar donker zelfs langer, voor de weerstand stabiel is. En hij is wat temperatuurgevoelig. Om te beslissen of het 'licht genoeg' is, is dat allemaal geen probleem.
Cadmiumsulfide is giftig. De Europese RoHS-regels beperken cadmium in elektrische toestellen, zodat LDR's in nieuwe producten zelden nog gebruikt worden: daar zitten fotodiodes, fototransistoren of digitale lichtsensoren (bv. de BH1750, die lux rechtstreeks via I²C doorgeeft, hoofdstuk 30). In de klas en voor een prototype is een LDR prima; een kapotte LDR hoort bij het elektronicaschroot.

Welke vaste weerstand kies je?
Zet de LDR bovenaan (tussen 5 V en de ingang) en een vaste weerstand onderaan. Dan is : meer licht, kleinere , hogere spanning. Zet je ze andersom, dan daalt de spanning met het licht. Beide werken; kies wat in je programma het logischst leest.
De keuze van bepaalt waar de sensor gevoelig is. De grafiek toont het voor de klimaatmodule: met 220 Ω stijgt de spanning pas bij veel licht, met 4,7 kΩ is ze bij veel licht al bijna 5 V en verandert ze nauwelijks nog. Met 1,0 kΩ ligt het steilste stuk precies rond de 5000 lux waar de beslissing valt. Twee vuistregels:
- Wil je één waarde zo nauwkeurig mogelijk herkennen (een drempel), kies dan gelijk aan de weerstand van de sensor bij die waarde. Dan staat er 2,5 V op de ingang, en daar is de deler het gevoeligst.
- Wil je een heel gebied bestrijken, van tot , kies dan : dat geeft het grootste verschil in spanning tussen beide uiteinden (opdracht 22.15 bewijst het).
Op een zonnige dag valt er in de kas tot 100 000 lux. Daar zit de LDR ver buiten zijn model. Een melkwit kapje over de sensor verspreidt het licht (de sensor 'ziet' de hele hemel, niet één heldere wolk) en laat maar ongeveer 10 % door. Zo blijft de LDR tussen 10 en 10 000 lux. Welk percentage het kapje echt doorlaat, hoef je niet te weten: dat haal je eruit bij het ijken.
Habitat: een lichtsensor voor de kasverlichting
De groeilampen van de klimaatmodule moeten bijspringen als er te weinig daglicht is. Eén lamp geeft het kweekbed ongeveer 100 µmol lichtdeeltjes per m² per seconde (hoofdstuk 20); daglicht van 5000 lux komt daarmee ongeveer overeen (zonlicht: ±54 lux per µmol/(m²·s)). Ontwerp de sensor: LDR (GL5528, , ) onder een kapje dat 10 % doorlaat, met een vaste weerstand naar GND. (a) Kies . (b) Welke ADC-waarde hoort bij de drempel van 5000 lux? (c) Hoe groot is de sensor bij volle zon (100 000 lux), en hoeveel vermogen neemt de LDR dan op?
- drempel: 5000 lx daglicht; kapje: 10 % doorlaat
- LDR tussen 5 V en A1, tussen A1 en GND
- ADC-waarde bij de drempel
- spanning en vermogen bij volle zon
- 1Op de LDR valt bij de drempel : .
- 2(a) Voor de grootste gevoeligheid bij de drempel kies je : de E12-waarde 1,0 kΩ.
- 3(b) en .
- 4(c) Volle zon: 10 000 lx op de LDR, ; (). Stroom ; vermogen in de LDR .
| daglicht (lx) | op de LDR (lx) | (Ω) | U op A1 (V) | ADC |
|---|---|---|---|---|
| 1000 | 100 | 2993 | 1,25 | 256 |
| 2000 | 200 | 1842 | 1,76 | 360 |
| 5000 | 500 | 970 | 2,54 | 519 |
| 10 000 | 1000 | 597 | 3,13 | 641 |
| 20 000 | 2000 | 368 | 3,66 | 748 |
| 100 000 | 10 000 | 119 | 4,47 | 914 |
De NTC: weerstand die daalt als het warmer wordt
Een NTC (negative temperature coefficient) is een bolletje of schijfje van metaaloxiden, een halfgeleider zoals bij Faraday: hoe warmer, hoe meer vrije ladingen, hoe kleiner de weerstand. De verandering is groot, ongeveer 4 % per graad rond kamertemperatuur, en ze volgt goed een exponentiële functie (hoofdstuk 5):
Met en is de weerstand bij 0 °C 33,6 kΩ, bij 50 °C 3,59 kΩ: een factor negen op vijftig graden. De tabel geeft ook meteen de spanning en de ADC-waarde in de deler met 10 kΩ, verder in dit hoofdstuk.
| T (°C) | 0 | 5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| R (kΩ) | 33,6 | 25,9 | 20,2 | 15,8 | 12,5 | 10,0 | 8,04 | 6,51 | 5,30 | 4,35 | 3,59 |
| U op A0 (V) | 1,15 | 1,39 | 1,66 | 1,94 | 2,22 | 2,50 | 2,77 | 3,03 | 3,27 | 3,48 | 3,68 |
| ADC-waarde | 234 | 285 | 339 | 396 | 454 | 512 | 567 | 620 | 669 | 713 | 753 |
Het B-model is nauwkeurig tot op enkele tienden van een graad tussen ongeveer 0 en 50 °C. Voor een groter gebied gebruiken fabrikanten een model met drie constanten, de vergelijking van Steinhart-Hart, of geven ze een tabel. De twee constanten en hebben elk een tolerantie (vaak 1 %): ook een NTC moet je ijken als je beter dan een halve graad wil meten.

Van ADC-waarde naar temperatuur
Zet de NTC bovenaan en een vaste weerstand van 10 kΩ onderaan. Warmer geeft een kleinere en dus een hogere spanning. Omdat de deler en de ADC dezelfde 5 V gebruiken, valt die spanning weg, en haal je de weerstand rechtstreeks uit het getal :
Daarna keer je het B-model om (neem de natuurlijke logaritme van beide kanten):
Hoe fijn meet dit? De grafiek toont de spanning in functie van de temperatuur. Rond 25 °C, waar , is ze het steilst: per graad. Eén ADC-stap van 4,88 mV is daar dus . Tussen 10 en 40 °C loopt de kromme bijna recht; daarbuiten wordt de sensor minder gevoelig.
Een stap van 0,09 °C betekent niet dat de meting tot op 0,09 °C juist is. Resolutie (hoe fijn) en nauwkeurigheid (hoe juist) zijn verschillende dingen (hoofdstuk 1). Met een NTC van 1 % tolerantie en een vaste weerstand van 1 % kan je zonder ijking tot ongeveer een halve graad naast de echte temperatuur zitten, hoe fijn de ADC ook meet.
Welke temperatuur heeft het reservoir?
De NTC van het reservoir (10 kΩ, ) zit bovenaan in een deler met 10 kΩ, op A0. De microcontroller leest . Welke temperatuur heeft het water? Hoeveel verschilt de temperatuur als het getal één stap hoger is?
- ;
- ,
- en
- voor één stap
- 1Spanning (ter controle): .
- 2Weerstand: .
- 3, gedeeld door 3950: .
- 4, dus .
- 5Met : en .
C++: licht en temperatuur op de microcontroller
Dit programma leest beide sensoren, middelt telkens zestien metingen tegen ruis, rekent de getallen om met de formules van dit hoofdstuk en beslist of de lampen nodig zijn. Het vangt ook twee fouten op: een losse draad aan de NTC (dan trekt de vaste weerstand A0 naar 0) en een pikdonkere LDR (dan is en zou je door nul delen).
// sensoren.ino - NTC in het reservoir (A0) en lichtsensor van de kasverlichting (A1), Arduino Mega 2560 op 5 Vconst float R_VAST_NTC = 10000.0; // ohm, tussen A0 en GND (NTC tussen 5 V en A0)const float R25 = 10000.0; // ohm bij 25 graden Cconst float B = 3950.0; // Kconst float T25 = 298.15; // Kconst float R_VAST_LDR = 1000.0; // ohm, tussen A1 en GND (LDR tussen 5 V en A1)const float R10 = 15000.0; // ohm bij 10 lux op de LDRconst float GAMMA = 0.7;const float KAPJE = 0.10; // het melkwitte kapje laat 10 % van het licht doorconst float DREMPEL_LUX = 5000.0; // onder dit daglicht moeten de lampen bij int gemiddeld(int pin) { // 16 metingen middelen tegen ruis long som = 0; for (int i = 0; i < 16; i++) som += analogRead(pin); return som / 16;} float temperatuur() { int n = gemiddeld(A0); if (n < 5 || n > 1018) return NAN; // draad los of kortsluiting float r = R_VAST_NTC * (1024.0 - n) / n; // spanningsdeler omgekeerd float invT = 1.0 / T25 + log(r / R25) / B; // B-model: log() is de natuurlijke logaritme return 1.0 / invT - 273.15;} float daglicht() { int n = gemiddeld(A1); if (n < 1) n = 1; // pikdonker: vermijd delen door nul float r = R_VAST_LDR * (1024.0 - n) / n; float luxOpLdr = 10.0 * pow(r / R10, -1.0 / GAMMA); // R = R10 * (E / 10)^-gamma, omgekeerd return luxOpLdr / KAPJE; // het licht buiten het kapje} void setup() { Serial.begin(9600);} void loop() { float t = temperatuur(); float e = daglicht(); Serial.print("reservoir: "); Serial.print(t, 1); Serial.print(" C daglicht: "); Serial.print(e, 0); Serial.print(" lx lampen: "); Serial.println(e < DREMPEL_LUX ? "nodig" : "niet nodig"); delay(2000);}Op de seriële monitor verschijnt elke twee seconden een regel zoals reservoir: 22,2 C daglicht: 3981 lx lampen: nodig. Twee dingen ontbreken nog. Rond 5000 lux zou de beslissing bij elke wolk heen en weer springen: een regeling met twee drempels (hysterese) lost dat op (opdracht 22.10 en hoofdstuk 31). En delay() legt het hele programma stil; in hoofdstuk 29 vervang je het door millis().
De potentiometer
Een potentiometer is een weerstand met een derde aansluiting: een contact, de loper, dat over de weerstand schuift als je aan de knop draait. Hang je de uiteinden aan 5 V en GND, dan is de loper de aftakking van een spanningsdeler die je met de hand instelt. Staat de loper op een fractie van onderen, dan is en :
In de klimaatmodule zit er een op het bedieningspaneel, aan A2: een instelknop voor de lichtdrempel. Het programma zet de ADC-waarde van 0 tot 1023 om naar een drempel tussen bijvoorbeeld 1000 en 20 000 lux. Door de potmeter van 10 kΩ loopt , in elke stand.
Gebruik je alleen de loper en één uiteinde, dan is de potentiometer een regelbare weerstand (rheostaat): van 0 tot 10 kΩ. Let dan op: in de stand 'nul' kan er een grote stroom lopen. Zet er een vaste weerstand in serie mee.
Potentiometers voor volumeknoppen hebben een logaritmisch verloop: bij de eerste helft van de draai verandert de weerstand weinig, daarna veel, omdat ons oor zo werkt. Voor een meetknop wil je een lineair verloop. De lettercode verschilt per fabrikant: kijk in de datasheet.

Belasting: de deler verandert als je er iets aan hangt
De formule van de spanningsdeler geldt alleen als er geen stroom uit de aftakking loopt. Hang je er een belasting aan (een meter, een ingang, een led), dan staat parallel met , en die combinatie is kleiner dan (hoofdstuk 21). De uitgang zakt:
Een handige manier om ernaar te kijken: een deler gedraagt zich als een bron met bronspanning (de onbelaste uitgang) en een inwendige weerstand , zoals de batterij in hoofdstuk 21. Voor 10 kΩ met 10 kΩ is . Een belasting die veel groter is dan , verandert bijna niets: met zakt de uitgang ongeveer 1 %.
Waarom een ingang hoogohmig moet zijn. Een meetingang mag het signaal niet veranderen dat hij meet. Een analoge ingang van de ATmega328P gedraagt zich als een weerstand van ongeveer 100 MΩ: voor een deler van 10 kΩ is de fout 0,005 %, onmeetbaar klein. Een digitale multimeter heeft ongeveer 10 MΩ, een goedkope analoge meter soms maar 20 kΩ per volt. Er is één addertje: bij elke meting laadt de ADC een klein condensatortje (ongeveer 14 pF) op. De datasheet vraagt daarom een bron van hoogstens ongeveer 10 kΩ. Heb je een grotere , zoals de batterijdeler met 24,8 kΩ, dan zet je een condensator van 100 nF tussen de ingang en GND die dat opladen levert (hoofdstuk 24).
Een meter die de meting verandert
(a) Je controleert de batterijdeler (100 kΩ en 33 kΩ, batterij 13,2 V) door op A0 te meten, eerst met een digitale multimeter van 10 MΩ, dan met een oude meter van 1,0 MΩ. Wat lees je af, en hoeveel procent is dat te laag? (b) Iemand gebruikt de instelknop (10 kΩ, loper in het midden) om rechtstreeks een module te sturen met een ingangsweerstand van 10 kΩ. Welke spanning krijgt die module?
- (a) ; , ; of
- (b) potentiometer 10 kΩ op 5 V, ;
- afgelezen spanningen en de fout
- spanning op de module
- 1(a) Onbelast: . Uitgangsweerstand .
- 2Met 10 MΩ: , 0,25 % te laag.
- 3Met 1,0 MΩ: , 2,4 % te laag.
- 4(b) Onderste helft: ; in plaats van 2,5 V.
Een NTC ijken in water
Hoe goed meet een NTC met de waarden uit de datasheet, en hoe maak je hem beter?
- NTC 10 kΩ () in een waterdicht buisje, weerstand 10 kΩ, microcontroller
- referentiethermometer (±0,1 °C)
- bekers: ijswater, water van 10, 20, 30, 40 en 50 °C
- roerstaafje, computer
- 1Bouw de deler: NTC tussen 5 V en A0, 10 kΩ tussen A0 en GND. Laat de microcontroller elke seconde N doorsturen (gemiddelde van 16 metingen).
- 2Hang de NTC en de referentiethermometer vlak naast elkaar in het ijswater. Roer, wacht tot beide stabiel zijn (minstens een minuut) en noteer en .
- 3Herhaal voor de andere bekers.
- 4Reken elke N om naar en naar met de waarden van de datasheet. Vergelijk met .
- 5Zet uit tegen (in kelvin) en bepaal de best passende rechte.
| (°C) | ADC-waarde | (Ω) | volgens datasheet (°C) | fout (°C) |
|---|---|---|---|---|
| 0,1 | 231 | 34 329 | −0,39 | −0,49 |
| 10,4 | 337 | 20 386 | 9,79 | −0,61 |
| 20,2 | 448 | 12 857 | 19,45 | −0,75 |
| 30,0 | 558 | 8351 | 29,11 | −0,89 |
| 40,3 | 662 | 5468 | 39,23 | −1,07 |
| 50,1 | 745 | 3745 | 48,87 | −1,23 |
Voorbeeldmeting. De NTC meet overal te laag, van een halve graad bij 0 °C tot meer dan een graad bij 50 °C.
De fout is systematisch (hoofdstuk 1): altijd dezelfde kant op, en groeiend met de temperatuur. Ze komt uit de toleranties van , van en van de vaste weerstand. Het B-model zelf is niet het probleem, alleen zijn constanten. Neem de logaritme van het model: . Tegen uitgezet is dat een rechte met helling (hoofdstuk 3: lineariseren). De best passende rechte door de metingen geeft en . Met die constanten valt elke meting binnen 0,02 °C van de referentie; wat overblijft, is de onzekerheid van de referentie zelf.
Python: de ijking uitrekenen
Het programma rekent de proef na: van ADC-waarde naar weerstand, de rechte door met np.polyfit (hoofdstuk 3 en 4), en daarna de temperaturen met de datasheet en met de geijkte constanten naast elkaar. De twee getallen die eruit komen, zet je in de C++-code in de plaats van 10000 en 3950.
# kalibratie.py - een NTC ijken: B en R25 uit metingen met een referentiethermometerimport mathimport numpy as np R_VAST = 10000.0 # vaste weerstand (ohm, nominaal)T_ref = [0.1, 10.4, 20.2, 30.0, 40.3, 50.1] # referentie (graden C)N = [231, 337, 448, 558, 662, 745] # ADC-waarden van de NTC-deler R = [R_VAST * (1024 - n) / n for n in N] # spanningsdeler omgekeerdx = [1 / (t + 273.15) for t in T_ref] # 1/T in 1/Ky = [math.log(r) for r in R] # ln R B, b = np.polyfit(x, y, 1) # ln R = B * (1/T) + b is een rechteR25 = math.exp(b + B / 298.15)print(f"geijkt: B = {B:.0f} K, R25 = {R25:.0f} ohm") def temperatuur(r, r25, b_waarde): return 1 / (1 / 298.15 + math.log(r / r25) / b_waarde) - 273.15 print(" T_ref N R (ohm) T datasheet T geijkt")for t, n, r in zip(T_ref, N, R): print(f"{t:6.1f} {n:4d} {r:8.0f} {temperatuur(r, 10000, 3950):11.2f} {temperatuur(r, R25, B):9.2f}")Uitvoer (gedraaid bij het bouwen van deze pagina):
geijkt: B = 3913 K, R25 = 10375 ohm T_ref N R (ohm) T datasheet T geijkt 0.1 231 34329 -0.39 0.09 10.4 337 20386 9.79 10.41 20.2 448 12857 19.45 20.21 30.0 558 8351 29.11 30.01 40.3 662 5468 39.23 40.29 50.1 745 3745 48.87 50.09
Let op wat de ijking niet doet: ze meet niet de echte van de NTC. De vaste weerstand wijkt ook af, en die afwijking zit mee in de geijkte . Dat is geen fout, maar het principe van ijken: je stelt de hele meetketen bij, niet één onderdeel. Vervang je de vaste weerstand, dan ijk je opnieuw.
Kalibreren: de hele meetketen
Tussen de temperatuur in het water en het getal op je scherm zitten vijf schakels, elk met een eigen foutbron. Je kan ze apart gaan uitmeten, maar dat is veel werk en je vergeet er altijd één. Kalibreren (ijken) vergelijkt het eindresultaat van de hele keten met een referentie die beter is dan wat je wil meten, en stelt het model bij tot ze overeenkomen. Drie manieren, van eenvoudig naar grondig:
- Eenpuntsijking: één referentiepunt, en je corrigeert een vaste afwijking (offset). Goed als de fout overal ongeveer even groot is, zoals bij de NTC-module in hoofdstuk 1.
- Tweepuntsijking: twee punten, voor een rechte (helling en offset), zoals de pH-module in hoofdstuk 15.
- Model fitten: meerdere punten, en de constanten van het model (hier en , voor de LDR en ) met de kleinste kwadraten bepalen. Trek het model eerst recht: tegen voor de NTC, tegen voor de LDR.
Kies de ijkpunten in het gebied waar je gaat meten (voor het reservoir 10 tot 30 °C, niet 80 °C), en schrijf de datum van de ijking op. Sensoren verouderen, en een ijking heeft een houdbaarheid: bij de pH-module elke twee weken, bij een NTC eerder jaren.
Een ijking is nooit beter dan haar referentie. Een luxmeter-app op een smartphone kan er 20 % naast zitten; voor een drempel 'veel of weinig licht' is dat genoeg, voor een onderzoek naar de groei van sla niet. Een goede vuistregel: de referentie minstens drie keer nauwkeuriger dan wat je nodig hebt.
Overzicht: spanningsdeler, sensoren en ADC
| symbool | betekenis | eenheid |
|---|---|---|
| weerstand tussen uitgang en GND | Ω |
| symbool | betekenis | eenheid |
|---|---|---|
| inwendige weerstand van de deler als bron | Ω |
| symbool | betekenis | eenheid |
|---|---|---|
| ADC-waarde, 0 tot 1023 | – | |
| referentie (Uno: 5 V) | V |
| symbool | betekenis | eenheid |
|---|---|---|
| vaste weerstand onder | Ω |
| symbool | betekenis | eenheid |
|---|---|---|
| verlichtingssterkte | lx | |
| helling in log-log (GL5528: 0,7) | – |
| symbool | betekenis | eenheid |
|---|---|---|
| temperatuur | K | |
| B-waarde | K |
| onderdeel | typische waarden | vaste weerstand |
|---|---|---|
| LDR GL5528 | 8-20 kΩ bij 10 lx, > 1 MΩ donker, γ = 0,7, hoogstens 100 mW | ≈ bij de drempel, of |
| NTC 10 kΩ | , , ±4 % per °C | 10 kΩ (gevoeligst rond 25 °C) |
| potentiometer | 1 kΩ tot 100 kΩ; lineair of logaritmisch | geen: zelf een deler |
| ADC Arduino Uno | 10 bit, 0-1023, 4,88 mV per stap, ingang ±100 MΩ, bron liefst ≤ 10 kΩ | — |
| T (°C) | 0 | 5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| R (kΩ) | 33,6 | 25,9 | 20,2 | 15,8 | 12,5 | 10,0 | 8,04 | 6,51 | 5,30 | 4,35 | 3,59 |
| U op A0 (V) | 1,15 | 1,39 | 1,66 | 1,94 | 2,22 | 2,50 | 2,77 | 3,03 | 3,27 | 3,48 | 3,68 |
| ADC-waarde | 234 | 285 | 339 | 396 | 454 | 512 | 567 | 620 | 669 | 713 | 753 |
Waar de spanningsdeler vandaan komt en waar hij heen gaat
De spanningsdeler is de eenvoudigste toepassing van Kirchhoff en tegelijk de meest gebruikte schakeling van de elektronica: in elke volumeknop, elke thermostaat, elke batterijmeter. Hij verbindt de leerlijn elektronica met onderzoeken en meten (een sensor is maar zo goed als zijn ijking) en met programmeren (het getal moet een beslissing worden). Wiskundig oefen je hier exponentiële en machtsfuncties, logaritmen en het rechttrekken van een kromme.
In serie verdeelt de spanning zich: het idee achter de deler.
De eerste sensoren en analoge waarden op de microcontroller.
Systematische fouten, resolutie tegenover nauwkeurigheid.
Kalibreren met een rechte, en een kromme rechttrekken.
Het B-model is een exponentiële functie; de LDR lees je op een logaritmische schaal.
Knooppunt- en maaswet, uitgangsweerstand als inwendige weerstand.
Waarom een NTC en een LDR halfgeleiders zijn.
De condensator op een hoogohmige ADC-ingang, en ruis wegfilteren.
Hoe de ADC binnenin werkt: resolutie, bereik en bemonsteren.
Een drempel met hysterese, zodat de lampen niet bij elke wolk schakelen.
De brug van Wheatstone en een buffer die een deler niet belast.
In het kort
- Een microcontroller meet spanning; een ADC van 10 bit geeft , van 0 tot 1023, in stappen van 4,88 mV bij 5 V.
- Spanningsdeler: , onbelast. Met een sensor erin wordt een weerstand een spanning.
- Voed de deler uit dezelfde 5 V als de ADC: dan is , onafhankelijk van de voeding.
- LDR: , een rechte in een log-loggrafiek; goedkoop, traag, grote spreiding.
- NTC: ; rond 25 °C met 10 kΩ ongeveer 55 mV per graad.
- Kies de vaste weerstand gelijk aan de sensorweerstand bij de belangrijkste waarde, of voor een heel gebied.
- Een belasting parallel aan laat de uitgang zakken; een deler is een bron met . Een ingang moet hoogohmig zijn (ADC ±100 MΩ), maar de bron liefst niet groter dan 10 kΩ.
- Kalibreren vergelijkt de hele meetketen met een betere referentie; trek een kromme eerst recht en bepaal de constanten van het model.
Wat je nu kent
- spanningsdeler
- Twee weerstanden in serie over een spanning; de spanning op de aftakking is .
- LDR (fotoweerstand)
- Weerstand van cadmiumsulfide waarvan de weerstand daalt als er meer licht op valt.
- NTC (thermistor)
- Halfgeleiderweerstand met een negatieve temperatuurcoëfficiënt: warmer geeft een kleinere weerstand.
- B-waarde
- Constante in het model van een NTC, in kelvin; zegt hoe sterk de weerstand met de temperatuur verandert.
- potentiometer
- Weerstand met een verschuifbaar contact (de loper): een instelbare spanningsdeler.
- ADC
- Analoog-digitaalomzetter: zet een spanning om in een getal; op een Uno 10 bit, van 0 tot 1023, met 5 V als referentie.
- ratiometrisch meten
- De sensor en de ADC gebruiken dezelfde referentiespanning, zodat het getal alleen van de verhouding van de weerstanden afhangt.
- uitgangsweerstand
- De weerstand die een belasting 'ziet' als ze aan een deler hangt; voor een deler is dat .
- kalibreren (ijken)
- De aanwijzing van een meetketen vergelijken met een referentie en het model bijstellen tot ze overeenkomen.