Handboek · hoofdstuk 31Regelsystemen
Meten, vergelijken, bijsturen: de verwarming en de ventilatie van de klimaatmodule met hysterese
Een thermostaat, een cruisecontrol en je eigen lichaam doen hetzelfde: ze meten, vergelijken met wat ze willen en sturen bij, en dan meten ze opnieuw. In dit hoofdstuk leer je de taal van het blokschema, bouw je een aan/uit-regeling met hysterese voor de klimaatmodule, simuleer je ze met een warmtemodel, en beoordeel je ze met getallen: hoe ver schommelt de temperatuur, hoe vaak schakelt de verwarming, en wat kost het?

- Je kan het verschil tussen een open en een gesloten lus uitleggen en systemen uit techniek en natuur indelen.
- Je kan een regelkring tekenen als blokschema met setpoint, fout, regelaar, actuator, proces, sensor, meting en storing.
- Je kan uitleggen hoe een aan/uit-regeling met hysterese werkt en ze programmeren in C++.
- Je kan met een eenvoudig warmtemodel de aan- en uittijd, het aantal schakelingen per uur en de inschakelduur berekenen.
- Je kan verklaren hoe de breedte van de hysterese en de vertraging van de sensor de schommeling en het schakelen beïnvloeden.
- Je kan een regeling beoordelen met kengetallen uit een meting: gemiddelde afwijking, schommeling, schakelingen per uur, energie.
- Je kan grenzen kiezen en verantwoorden voor de verwarming en de ventilatie van de klimaatmodule.
Een blinde uitvinder en een schokkerige chauffeur
De Amerikaanse ingenieur Ralph Teetor werd blind toen hij vijf jaar was. Hij werd toch ingenieur, en een van de productiefste uitvinders van de auto-industrie: hij kreeg meer dan veertig octrooien. Zijn bekendste uitvinding begon met ergernis. Teetor reed vaak mee met zijn advocaat, en die had een gewoonte: als hij luisterde, gaf hij gas, als hij praatte, liet hij het gaspedaal los. De auto versnelde en vertraagde voortdurend. Teetor, die de beweging voelde in plaats van zag, werd er misselijk van.
Hij bedacht een toestel dat de snelheid zelf vasthoudt. Het meet hoe snel de auto rijdt, vergelijkt dat met de snelheid die de bestuurder gekozen heeft, en geeft meer of minder gas. In 1950 kreeg hij er een octrooi op. In 1958 zat het als 'Auto-Pilot' in de Chrysler Imperial; een jaar later bood Cadillac het aan onder de naam die bleef: cruise control.
Teetors toestel doet wat elke regeling doet: meten, vergelijken, bijsturen, en dan opnieuw meten. De thermostaat van je verwarming doet het, de koelkast, het vlotterventiel in een toilet, en je eigen lichaam, dat zijn temperatuur op 37 °C houdt. In dit hoofdstuk leer je de taal waarin ingenieurs zulke regelingen tekenen en beoordelen, en je regelt de verwarming en de ventilatie van de klimaatmodule.
De meetkas gaf water onder 30 % en opende haar dakraam boven 28 °C (Fundamental, hoofdstuk 25). In de klimaatmodule werken mensen en groeit sla die niet mag bevriezen en niet mag koken. Waar leg je de grenzen? Hoe vaak mag een klep schakelen? Wat als de sensor traag is of uitvalt? En hoe bewijs je met metingen dat je regeling goed werkt?

Open en gesloten lus
In Fundamental (hoofdstuk 25) leerde je het patroon meten, beslissen, doen, en het verschil tussen een tuinsproeier met een timer en een pomp die pas water geeft als de grond droog is. Nu maak je dat precies.
Een open lus stuurt volgens een plan of een opdracht, zonder te meten wat er gebeurt: 'verwarming aan van 22 tot 6 uur'. Is de nacht zachter dan verwacht, dan wordt het te warm; is ze kouder, te koud. Een gesloten lus meet de geregelde grootheid (de luchttemperatuur) en past de actie aan zolang er een verschil is met wat je wil. Die pijl terug van de sensor naar de regelaar heet terugkoppeling.
| systeem | lus | wat wordt er gemeten? |
|---|---|---|
| broodrooster met draaiknop | open | niets: de tijd beslist |
| pomp van de module, 10 min per uur (hoofdstuk 29) | open | niets: de klok beslist |
| stappenmotor zonder encoder (hoofdstuk 26) | open | niets: de motor telt zijn stappen |
| groeilampen dimmen met het daglicht (hoofdstuk 25) | open, met voorsturing | het daglicht, niet het licht op de planten |
| servomotor (hoofdstuk 26) | gesloten | de hoek, met een potmeter in de servo |
| wasmachine die water inlaat | gesloten | het waterniveau in de trommel |
| verwarming van de module (dit hoofdstuk) | gesloten | de luchttemperatuur |
Een open lus is eenvoudig, goedkoop en snel, en kan nooit gaan slingeren. Maar ze corrigeert niets: een storing (een koude nacht, een open deur) of een fout in het plan werkt volledig door. Een gesloten lus corrigeert storingen die ze niet kent, maar ze heeft een sensor nodig die het juiste meet, en ze kan schommelen of doorschieten. Daarover gaat dit hoofdstuk.
De groeilampen meten het daglicht en dimmen vooraf, nog voor de planten te veel licht krijgen. Dat heet voorsturing: je meet de storing, niet het resultaat. Snel, maar blind voor alles wat je niet meet: als een lamp veroudert en minder licht geeft, merkt de regeling niets. Echte installaties combineren daarom vaak voorsturing met terugkoppeling.
De taal van het blokschema
Ingenieurs tekenen elke regelkring op dezelfde manier. De blokken zijn apparaten of processen, de pijlen zijn signalen: grootheden die van het ene blok naar het andere gaan.
- Het proces is wat je wil regelen: de lucht in de module, een auto, een lichaam.
- De actuator grijpt in het proces in: de convector die warmte geeft, de gasklep, de zweetklieren.
- De sensor meet de geregelde grootheid en geeft de meting .
- De regelaar vergelijkt de meting met de gewenste waarde of setpoint en berekent de stuurgrootheid : wat de actuator moet doen.
- Een storing werkt van buitenaf in: kou, wind, een helling, een open deur.
Wat de actuator aan het proces geeft (een warmtestroom, een kracht), heet in de figuur .
Het rondje met Σ is een vergelijkingspunt: het telt de signalen op met hun teken. Zo ontstaat de regelafwijking of fout:
Het minteken maakt er een negatieve terugkoppeling van: een te hoge meting maakt de fout kleiner of negatief, en de regelaar doet minder. Zo dempt de lus afwijkingen uit. Bij positieve terugkoppeling versterkt een afwijking zichzelf: een microfoon die zijn eigen luidspreker opvangt, gaat fluiten (rondzingen).
Hangt de sensor in de zon of vlak boven de convector, dan regelt de lus perfect, maar naar de verkeerde temperatuur. Een regelkring is nooit beter dan zijn meting.
Het blokschema van de verwarming van de module
De klimaatmodule heeft geen eigen verwarming op haar batterij: de warmte komt van het station. Een warmwaterleiding van de stationsverwarming loopt naar een ventiloconvector in de module: een klein radiatortje met een ventilator erachter. Als de Mega verwarmt, zet pin D12 (nieuw in pinnen.h) via een MOSFET een magneetklep open en het ventilatortje aan; dan komt er ongeveer 800 W warmte in de module.
- 1Setpoint
Geen enkel getal maar een band: 's nachts aan onder 16,0 °C en uit boven 17,0 °C, overdag 18,0 en 19,0 °C.
- 2Vergelijken
In de code:
luchtT < laagenluchtT > hoog. De Mega doet het om de 2 s. - 3Regelaar
Een aan/uit-regelaar met hysterese: hij onthoudt of de verwarming aan staat, en verandert alleen voorbij een grens.
- 4Actuator
De convector geeft 0 of 800 W: meer standen heeft hij niet. Bij −8 °C buiten verliest de module 495 W bij 16,5 °C: er blijft reserve om op te warmen.
- 5Proces
De lucht (en alles wat snel meewarmt) en de buffer: het vat van 200 L en het reservoir. Verlies naar buiten: 20,2 W per graad verschil (hoofdstuk 19).
- 6Storingen
De buitentemperatuur, de zon door het kasdak, de lampen (190 W warmte), een deur die opengaat. De regelaar kent ze niet: hij ziet alleen hun gevolg.
- 7Sensor
De SHT31 hangt in de sensorkast (hoofdstuk 30). Die kast volgt de lucht met een vertraging van ongeveer een minuut.
- 8Terugkoppeling
De meting gaat terug naar het vergelijkingspunt: daardoor is dit een gesloten lus.
Cruisecontrol: dezelfde lus op de weg
Bij een cruisecontrol is het proces de auto en de geregelde grootheid de snelheid. De sensor telt de omwentelingen van een wiel, de regelaar is de motorsturing, de actuator de inspuiting of de gasklep. De storingen zijn een helling, tegenwind, een zware lading.
De grafiek toont een simulatie: een auto van 1200 kg rijdt aan 90 km/h en komt aan een helling van 4 % over 600 m. Met het gaspedaal vast (een open lus) zakt de snelheid tot 55 km/h: de helling vraagt 471 N extra, en niemand geeft meer gas. Met cruisecontrol zakt ze maar tot 87,3 km/h. Dat is geen aan/uit-regeling: de motorsturing geeft evenredig met de fout meer kracht, hier 600 N extra per m/s te traag. Aan/uit zou betekenen: gas vol of gas dicht, en een schokkende auto, precies wat Teetor wilde vermijden.
Merk op dat de auto op de helling niet helemaal 90 km/h haalt. Een regelaar die evenredig met de fout werkt, geeft alleen extra gas als er een fout is: er blijft een kleine blijvende afwijking. Echte cruisecontrols tellen daarom ook op hoe lang de fout al duurt (een I-actie); dat leer je in Expert (hoofdstuk 39). Een adaptieve cruisecontrol heeft nog een tweede lus: een radar meet de afstand tot de auto ervoor.
Hoeveel trager op de helling?
De auto uit de simulatie (1200 kg) rijdt 90 km/h () op een vlakke weg. Hij komt aan een helling van 4 %. (a) Hoeveel extra kracht vraagt de helling? (b) Hoe snel vertraagt de auto in het begin als het gaspedaal niet verandert? (c) De cruisecontrol geeft 600 N extra per m/s die de auto te traag rijdt. Welke snelheid houdt hij op de helling?
- , , helling 4 % (4 m hoger per 100 m)
- regelaar:
- extra kracht
- vertraging
- snelheid met cruisecontrol
- 1(a) Een helling van 4 % maakt een hoek (hoofdstuk 6). De component van de zwaartekracht langs de weg: .
- 2(b) Met het gaspedaal vast verandert de motorkracht niet: die 471 N is een netto kracht naar achter. (hoofdstuk 8). Na 10 s is dat al of 14 km/h trager.
- 3(c) De cruisecontrol vindt een evenwicht als zijn extra kracht de helling dekt: , dus . De auto rijdt .
Je lichaam: een regeling met vele actuatoren
Je lichaam houdt zijn kerntemperatuur tussen ongeveer 36,5 en 37,5 °C (Fundamental, hoofdstuk 29). Zenuwcellen in de huid en in de hersenen zijn de sensoren, een deel van de hersenen, de hypothalamus, is de regelaar. Dat constant houden heet homeostase.
Het lichaam gebruikt zijn actuatoren in trappen. Wijkt de temperatuur een beetje af, dan past het alleen de doorbloeding van de huid aan: wijdere bloedvaten geven meer warmte af, nauwere houden ze binnen. Dat kost bijna niets. Pas bij een grotere afwijking volgen zweten of rillen. Zweten koelt sterk: een liter zweet die verdampt, neemt 2,4 MJ mee (hoofdstuk 18); een halve liter per uur is al koeling. Rillen laat spieren warmte maken. En je gedrag is ook een actuator: een jas aantrekken, de schaduw zoeken.
Twee dingen zijn anders dan bij een eenvoudige thermostaat. Het lichaam regelt geleidelijk: een beetje te warm geeft een beetje zweet. En de huid meet de omgeving al voor de kern afkoelt: het lichaam reageert op kou voor het echt te koud is, een vorm van voorsturing. De klimaatmodule doet iets gelijkaardigs in trappen: eerst de ventilatoren, pas bij meer warmte het dak.
Bij een infectie zet de hypothalamus de gewenste waarde hoger, bijvoorbeeld op 39 °C. Je lichaam is dan 'te koud' tegenover zijn nieuwe setpoint: je rilt en hebt het koud, terwijl je temperatuur stijgt. De regelkring werkt perfect, alleen met een ander setpoint.
Drie soorten regelaars
Wat doet de regelaar met de fout? Drie mogelijkheden, van eenvoudig naar verfijnd:
- Aan/uit met één drempel. Kouder dan 16,5 °C: aan; warmer: uit. Eenvoudig, maar rond de drempel schakelt de actuator voortdurend, want elke kleine schommeling van de meting zit er afwisselend boven en onder.
- Aan/uit met hysterese. Twee grenzen: aan onder 16,0 °C, uit boven 17,0 °C. Daartussen verandert er niets: de regelaar onthoudt of de verwarming aan staat. Warmt de lucht op, dan blijft de verwarming aan tot 17,0 °C; koelt ze af, dan blijft ze uit tot 16,0 °C. De grafiek is een lus die je maar in één richting doorloopt.
- Evenredig (P). Hoe groter de fout, hoe meer vermogen: , begrensd tussen 0 en het maximum. Daarvoor moet de actuator tussenstanden hebben (een dimbare lamp, een klep die half open kan, een motor met PWM). De cruisecontrol werkt zo.
In code is hysterese twee regels. Belangrijk is het woord else en de variabele die de toestand onthoudt:
if (!verwarmen && luchtT < laag) verwarmen = true; // koud genoeg: aan else if (verwarmen && luchtT > hoog) verwarmen = false; // warm genoeg: uit // daartussen: niets veranderen
Hysterese ken je al: de Schmitt-trigger 74HC14 schakelt bij 2,6 V en terug bij 1,6 V (hoofdstuk 24), de groeilampen gaan aan onder 4000 lx en uit boven 6000 lx (hoofdstuk 22), en het dakraam van de meetkas opent boven 28 °C en sluit onder 25 °C.
Een aan/uit-verwarming geeft altijd haar volle vermogen, hier 800 W. Een hoger setpoint maakt de module niet sneller warm; de verwarming blijft alleen langer aan, en de temperatuur gaat hoger. Wie de thermostaat op 25 °C zet om sneller 19 °C te hebben, krijgt na een tijd 25 °C.
Een thermostaat in een doos
Hoe vaak schakelt een verwarming met hysterese, en hoe ver schiet de temperatuur voorbij de grenzen? Hangt dat af van de breedte van de band en van waar de sensor zit?
- schoenendoos met deksel
- lampje 12 V / 10 W in een metalen fitting (of vermogensweerstand 15 Ω / 10 W)
- logic-level MOSFET (IRLZ44N) met 220 Ω naar de gate en 10 kΩ naar GND, 12 V-voeding
- Arduino met temperatuursensor (DS18B20, of TMP36 met het gemiddelde van 16 metingen)
- computer met de seriële monitor
- stopwatch of de klok van het programma
- 1Bouw de schakeling van hoofdstuk 23: de MOSFET schakelt het lampje, de Arduino meet de temperatuur. Leg de sensor op 10 cm van het lampje.
- 2Programmeer een regeling met hysterese rond 27 °C: aan onder LAAG, uit boven HOOG. Laat elke seconde de tijd, de temperatuur en de stand (0 of 1) naar de seriële monitor sturen.
- 3Begin met een band van 1,0 K (26,5 en 27,5 °C). Wacht tot de doos opgewarmd is (ongeveer 20 minuten) en meet dan 20 minuten.
- 4Tel hoe vaak het lampje aangaat en noteer de hoogste en laagste temperatuur in die 20 minuten.
- 5Herhaal met 0,5 K en 2,0 K. Leg daarna de sensor vlak tegen het lampje en herhaal met 1,0 K.
| band | keer aan in 20 min | laagste (°C) | hoogste (°C) |
|---|---|---|---|
| 0,5 K | 11 | 26,4 | 27,5 |
| 1,0 K | 7 | 26,1 | 27,7 |
| 2,0 K | 5 | 25,6 | 28,2 |
Voorbeeldmeting (sensor op 10 cm). Met de sensor tegen het lampje schakelt het lampje veel sneller, en is de lucht in de rest van de doos kouder dan de sensor aangeeft.
Hoe smaller de band, hoe vaker het lampje schakelt: de temperatuur heeft minder tijd nodig om van de ene grens naar de andere te gaan. Maar de temperatuur blijft niet tussen de grenzen: bij 1,0 K schommelt ze tussen 26,1 en 27,7 °C. Twee oorzaken. De warmte moet eerst van het lampje naar de sensor, en de sensor zelf moet opwarmen: de meting loopt achter. En een uitgeschakeld lampje is nog heet en geeft nog even warmte. Beide laten de temperatuur doorschieten voorbij de grens. Een sensor tegen het lampje regelt de temperatuur van het lampje, niet die van de doos: de meting moet de juiste grootheid meten.
Een TMP36 geeft per stap van de ADC ongeveer 0,49 °C (5 V / 1024 / 10 mV per °C): voor een band van 0,5 K is dat te grof. Neem het gemiddelde van 16 metingen, of een digitale sensor zoals de DS18B20 (0,0625 °C per stap).
Het warmtemodel van de module
Om een regeling te ontwerpen voor je ze bouwt, heb je een model nodig: rekenregels die voorspellen hoe de temperatuur verandert. Voor de klimaatmodule volstaan twee temperaturen:
- de lucht , met alles wat in enkele minuten mee opwarmt (planten, goten, lampen, de binnenkant van de wanden): samen . De lucht alleen is maar 14 kJ/K;
- de buffer : het vat van 200 L en het reservoir van 60 L, samen (hoofdstuk 18).
De lucht verliest per graad verschil met buiten (hoofdstuk 19) en wisselt per graad verschil uit met de buffer. Elke 2 s rekent het model de warmte die binnenkomt en buitengaat, en zet de temperatuur een stapje verder, zoals in hoofdstuk 18 ():
Waarom twee temperaturen? In hoofdstuk 18 koelde alles samen af, als één blok van 1,1 MJ/K. Voor een hele nacht klopt dat ongeveer. Voor een regeling die om de paar minuten schakelt niet: de lucht warmt in enkele minuten een graad op, het water in de vaten merkt daar nauwelijks iets van. Een model moet passen bij de vraag die je stelt.
Bij de ontwerptemperatuur van −8 °C (hoofdstuk 19) en 16,5 °C binnen verliest de module . Een verwarming die net 495 W geeft, houdt de temperatuur, maar warmt nooit op na een open deur. Met 800 W blijft er 305 W reserve. De warmte komt uit de verwarmingskring van het station; de 12 V-batterij van de module (hoofdstuk 20) moet er niets voor leveren.
Hoe lang staat de verwarming aan?
Het is een windstille januarinacht, buiten 0 °C. De verwarming (800 W) gaat aan onder 16,0 °C en uit boven 17,0 °C. De buffer heeft ongeveer de gemiddelde luchttemperatuur, 16,5 °C, zodat hij gemiddeld geen warmte geeft of neemt. Neem aan dat de sensor zonder vertraging meet. Bereken hoe lang de verwarming telkens aan en uit staat, hoe vaak ze per uur aangaat, welk deel van de tijd ze aan staat, en hoeveel warmte een nacht van 8 uur kost.
- , ,
- band van 16,0 tot 17,0 °C: ; buiten
- aantijd en uittijd
- keer aan per uur
- inschakelduur
- warmte per nacht
- 1Verlies bij gemiddeld 16,5 °C: .
- 2Opwarmen: er komt netto binnen. De lucht moet opnemen: .
- 3Afkoelen: nu gaat er uit en komt er niets binnen: .
- 4Eén volledige zaagtand duurt (6,9 min): keer aan per uur.
- 5Inschakelduur: , of 41,7 %. Dat is precies : gemiddeld moet de verwarming juist het verlies dekken.
- 6Warmte per nacht: gemiddeld levert de verwarming precies het verlies, dus .
De zaagtand van een echte nacht
Nu een realistische januarinacht: om 22 uur gaan de lampen uit, de lucht is 19 °C, de buffer 20 °C, en buiten daalt de temperatuur van 2 naar −2 °C. De sensor hangt in de sensorkast en loopt een minuut achter, en hij ruist een beetje (±0,03 °C). De regelaar gebruikt de nachtband: aan onder 16,0, uit boven 17,0 °C.
- Na 18 minuten is de lucht onder 16 °C gezakt en gaat de verwarming voor het eerst aan.
- Daarna tekent de lucht een zaagtand: 5,3 keer aan per uur, tussen 15,8 en 17,4 °C. Dat is breder dan de band van 1,0 K: de trage sensor laat de lucht voorbij beide grenzen gaan (verderop).
- Hoe kouder het buiten wordt, hoe langer de verwarming aan staat: van 24 % van de tijd tussen 23 en 24 uur tot 38 % tussen 5 en 6 uur.
- De buffer koelt de hele nacht langzaam af, van 20 naar 18,2 °C. Zolang hij warmer is dan de lucht, geeft hij warmte: de verwarming hoeft minder.
- Van 23 tot 6 uur geeft de verwarming 1,88 kWh warmte (gemiddeld 269 W).
De thermostaat simuleren
Het model past in een Python-functie van twintig regels. Ze simuleert een nacht van 8 uur bij 0 °C en telt hoe vaak de verwarming aangaat. Zo probeer je in een paar seconden grenzen uit die je op de echte module weken zou moeten testen.
# thermostaat.py - de verwarming van de klimaatmodule met hystereseC_L, C_W = 80e3, 1.10e6 # J/K: de lucht (met wat snel meewarmt) en de buffer (vat + reservoir)H, G = 20.2, 30.0 # W/K: lucht -> buiten, lucht <-> bufferP = 800.0 # W: verwarming aanDT = 2.0 # s: om de 2 s meten en beslissenTAU_S = 60.0 # s: tijdconstante van de sensor in de sensorkast def nacht(laag, hoog, uren=8.0, buiten=0.0): lucht = buffer = meting = 16.5 aan = False keer_aan, tijd_aan = 0, 0.0 t_min, t_max = 99.0, -99.0 for stap in range(int(uren * 3600 / DT)): if not aan and meting < laag: # de regelaar: twee grenzen aan = True keer_aan += 1 elif aan and meting > hoog: aan = False warmte = (P if aan else 0.0) - H * (lucht - buiten) - G * (lucht - buffer) # W lucht_nieuw = lucht + warmte * DT / C_L buffer += G * (lucht - buffer) * DT / C_W meting += (lucht - meting) * DT / TAU_S lucht = lucht_nieuw if aan: tijd_aan += DT t_min, t_max = min(t_min, lucht), max(t_max, lucht) return keer_aan / uren, 100 * tijd_aan / (uren * 3600), t_min, t_max for breedte in (0.2, 0.5, 1.0, 2.0): per_uur, pct, lo, hi = nacht(16.5 - breedte / 2, 16.5 + breedte / 2) print(f"hysterese {breedte:.1f} K: {per_uur:4.1f} keer aan per uur, {pct:.0f} % aan, lucht {lo:.2f} tot {hi:.2f} °C")Uitvoer:
hysterese 0.2 K: 12.8 keer aan per uur, 42 % aan, lucht 16.18 tot 16.88 °C hysterese 0.5 K: 8.4 keer aan per uur, 42 % aan, lucht 16.01 tot 17.07 °C hysterese 1.0 K: 5.6 keer aan per uur, 42 % aan, lucht 15.76 tot 17.34 °C hysterese 2.0 K: 3.5 keer aan per uur, 42 % aan, lucht 15.28 tot 17.82 °C
Drie dingen vallen op. De inschakelduur is altijd dezelfde: de verwarming moet het verlies dekken, welke band je ook kiest. Het aantal schakelingen daalt sterk met de breedte. En de lucht schommelt telkens meer dan de band breed is. De volgorde van de regels in de lus is belangrijk: eerst beslissen met de meting, dan de lucht, de buffer en de sensor één stap verder zetten, allemaal met de oude waarden.
Hoe breed moet de hysterese zijn?
Met één drempel en een sensor die een beetje ruist, is het een ramp. De meting springt afwisselend boven en onder 16,5 °C, en de verwarming gaat 382 keer per uur aan: om de paar seconden. Een relais of een magneetklep is dan na enkele weken versleten. Een band van 0,2 K brengt dat al terug tot 14 keer per uur.
Een bredere band geeft minder schakelingen, maar een grotere schommeling. De simulatie (buiten 0 °C, sensor met 60 s vertraging, gemeten van het eerste tot het achtste uur) geeft:
| hysterese | keer aan per uur | lucht (°C) | gem. afwijking (K) | warmte in 7 h (kWh) |
|---|---|---|---|---|
| één drempel | 381,7 | 16,36 tot 16,67 | 0,03 | 2,34 |
| 0,2 K | 14,3 | 16,17 tot 16,88 | 0,16 | 2,35 |
| 0,5 K | 8,7 | 16,00 tot 17,10 | 0,25 | 2,34 |
| 1,0 K | 5,7 | 15,75 tot 17,36 | 0,38 | 2,33 |
| 1,5 K | 4,3 | 15,51 tot 17,59 | 0,50 | 2,37 |
| 2,0 K | 3,4 | 15,26 tot 17,84 | 0,63 | 2,36 |
| 3,0 K | 2,4 | 14,79 tot 18,31 | 0,87 | 2,35 |
Zonder vertraging volgt het aantal keer per uur uit het rekenvoorbeeld: het is omgekeerd evenredig met de breedte van de band. Met een trage sensor schiet de lucht aan elke kant verder door; dat werkt alsof de band breder is. Een vuistregel voor een korte vertraging:
Nee: de warmte die de verwarming levert, is altijd het verlies van de module. In de tabel verschilt ze tussen 0,2 en 3,0 K nauwelijks. Een smallere band laat de verwarming alleen vaker en korter aangaan. Wat wel energie spaart: een lagere gemiddelde temperatuur, of minder verlies (een nachtscherm).
Meetvertraging: de regeling schiet door
Een sensor ziet een verandering nooit meteen. De SHT31 zelf reageert in enkele seconden, maar hij hangt in een sensorkast, en de lucht in die kast moet eerst meewarmen. Zet de verwarming uit boven 17,0 °C, dan is de lucht rond de convector al warmer, en hij warmt nog verder op terwijl de sensor achterloopt. De temperatuur schiet door voorbij de grens, boven én onder.
| tijdconstante sensor | keer aan per uur | boven 17,0 (K) | onder 16,0 (K) | gem. afwijking (K) |
|---|---|---|---|---|
| 0 s | 9,1 | 0,04 | 0,02 | 0,24 |
| 60 s | 5,7 | 0,36 | 0,25 | 0,38 |
| 180 s | 3,6 | 0,87 | 0,64 | 0,61 |
| 300 s | 2,9 | 1,25 | 0,96 | 0,78 |
Een trage sensor laat de verwarming dus minder vaak schakelen, maar de lucht schommelt meer. Het is geen gratis bredere band: de regeling weet niet meer precies waar ze is. Met 300 s vertraging zakt de lucht tot 15,0 °C, onder de grens van 16,0 °C die je voor de sla gekozen had.
De doorschot is ongeveer de snelheid waarmee de lucht verandert maal de vertraging. Opwarmen gaat hier sneller (0,35 K per minuut) dan afkoelen (0,25 K per minuut): daarom schiet de lucht boven verder door dan onder. Waar hang je de sensor dus? Niet in de luchtstroom van de convector (dan schakelt hij te snel en regelt hij de convector in plaats van de module), niet in een dichte doos (te traag), maar midden in de ruimte, op de hoogte van de planten, in een kastje met openingen of een klein ventilatortje dat lucht aanzuigt.
Grenzen kiezen met eisen
De magneetklep van de convector gaat volgens de fabrikant 200 000 schakelingen mee (rekenwaarde). Het team stelt drie eisen: (1) de lucht zakt nooit onder 15,5 °C, (2) de klep houdt minstens tien stookseizoenen, (3) de gemiddelde afwijking van 16,5 °C is zo klein mogelijk. Een stookseizoen telt 200 dagen, met gemiddeld 12 uur per dag in het ritme van een koude nacht. Welke band kies je: 0,5, 1,0 of 2,0 K?
- de tabel van 'Hoe breed moet de hysterese zijn?'
- klep: 200 000 schakelingen; 200 dagen × 12 h per seizoen
- de band die aan alle eisen voldoet
- 1Eis 1: de laagste temperatuur is 16,00 °C (0,5 K), 15,75 °C (1,0 K) en 15,26 °C (2,0 K). De band van 2,0 K valt af.
- 2Eis 2, schakelingen per seizoen: (0,5 K) en (1,0 K).
- 3De klep houdt seizoenen (0,5 K) of seizoenen (1,0 K). De band van 0,5 K valt net af.
- 4Eis 3 kiest dan tussen wat overblijft: alleen 1,0 K, met een gemiddelde afwijking van 0,38 K.
Koelen in twee trappen: ventilatoren en dak
Overdag is het probleem omgekeerd. Op een heldere aprildag komt er door het kasdak tot 1,5 kW zonnewarmte binnen. Zonder koelen zou de lucht in het model tot 53 °C stijgen: sla verbrandt. De module koelt in twee trappen, elk met hysterese:
- Trap 1, de ventilatoren: ze draaien altijd zacht voor de basisventilatie (hoofdstuk 14). Boven 25 °C draaien ze vol (ongeveer 120 m³ lucht per uur), onder 24 °C weer zacht.
- Trap 2, het dak: boven 27 °C gaat het kasdak open, onder 25 °C weer dicht. Een open dak ververst ongeveer 180 m³ per uur.
Met alleen de ventilatoren haalt de lucht nog 34,1 °C; met ventilatoren en dak blijft ze onder 27,3 °C. Die dag draaien de ventilatoren 8 keer vol, samen 7,5 uur; het dak gaat 7 keer open, samen 3,7 uur. De verwarming gaat 19 keer aan, vooral 's nachts en vroeg in de ochtend (dagband vanaf 6 uur: 18,0 tot 19,0 °C).
Tussen 19 °C (verwarming uit) en 24 °C (ventilatoren vol) ligt een dode zone waarin geen enkele actuator iets doet. Die zone is bewust: verwarmen en koelen mogen nooit tegelijk, want dan betaal je voor warmte die je meteen weer wegblaast. In de code staat daarom een extra regel: als de verwarming aan is, draaien de ventilatoren niet vol.
Een dak openen duurt 7 s en een motor start met een grote stroom (hoofdstuk 26). De hysterese moet daarom breder zijn dan bij de ventilatoren: 2 K in plaats van 1 K. Het openen en sluiten zelf, met eindeloopschakelaars en time-out, is een toestandsmachine: dat programmeer je in hoofdstuk 32.
De regeling in C++
In pinnen.h komt één regel bij: const int VERWARMING = 12;. De nieuwe taak meet om de 2 s de SHT31, kiest de dag- of nachtband volgens de klok (DS3231, hoofdstuk 30) en schakelt de verwarming en de ventilatoren met hysterese. Ze komt in klimaat.ino (versie 3); hier staat ze als losse schets, zoals ze getest is. Twee dingen zijn nieuw: een uuroverzicht waarmee de regeling zichzelf beoordeelt, en een noodprogramma als de sensor niet antwoordt.
// klimaatregeling.ino - verwarming en ventilatoren van de klimaatmodule met hysterese (hoofdstuk 31)// Deze taak komt in klimaat.ino (versie 3) naast taakMeten(); hier als losse schets om ze te testen.#include <Wire.h>#include <RTClib.h>#include <Adafruit_SHT31.h>#include "pinnen.h" // ---------------------------------------------------------------- grenzen (graden C): aan onder LAAG, uit boven HOOGconst float DAG_LAAG = 18.0, DAG_HOOG = 19.0; // verwarming van 6 tot 22 uurconst float NACHT_LAAG = 16.0, NACHT_HOOG = 17.0; // verwarming 's nachtsconst float KOEL_UIT = 24.0, KOEL_AAN = 25.0; // ventilatoren vol boven 25, terug laag onder 24const int VENT_LAAG = 90, VENT_VOL = 255; // PWM: basisventilatie (hoofdstuk 14) of koelenconst unsigned long MEET_MS = 2000; // om de 2 s meten en beslissenconst unsigned long VENSTER_MS = 600000UL; // noodprogramma: vensters van 10 minuten // ---------------------------------------------------------------- toestandAdafruit_SHT31 sht;RTC_DS3231 rtc;float luchtT = NAN;bool verwarmen = false, koelen = false, noodprogramma = false;float gemAan = 0.5; // gemiddelde inschakelduur (0 tot 1) van het laatste uurunsigned long vorigeMeting = 0, vensterStart = 0;int starts = 0, vorigUur = -1; // voor het uuroverzichtunsigned long aanMs = 0;float tMin = 99.0, tMax = -99.0; // ---------------------------------------------------------------- meldingenvoid printTwee(int x) { if (x < 10) Serial.print('0'); Serial.print(x);} void melding(const char* tekst) { // "# 22:13:24 tekst" DateTime k = rtc.now(); Serial.print("# "); printTwee(k.hour()); Serial.print(':'); printTwee(k.minute()); Serial.print(':'); printTwee(k.second()); Serial.print(' '); Serial.println(tekst);} void uurOverzicht(int uur) { // elk vol uur: hoe deed de regeling het? if (vorigUur >= 0) { melding("uuroverzicht"); Serial.print(" keer aan: "); Serial.print(starts); Serial.print(" aan: "); Serial.print(aanMs / 36000.0, 0); // ms per uur -> procent Serial.print(" % lucht: "); Serial.print(tMin, 1); Serial.print(" tot "); Serial.print(tMax, 1); Serial.println(" C"); } vorigUur = uur; starts = 0; aanMs = 0; tMin = 99.0; tMax = -99.0;} // ---------------------------------------------------------------- de regelingvoid regelen(unsigned long nu, int uur) { bool dag = (uur >= 6 && uur < 22); float laag = dag ? DAG_LAAG : NACHT_LAAG; float hoog = dag ? DAG_HOOG : NACHT_HOOG; bool was = verwarmen, wasKoelen = koelen; if (isnan(luchtT)) { // geen meting: open lus met het gemiddelde van het laatste uur if (!noodprogramma) { noodprogramma = true; vensterStart = nu; melding("ALARM: geen temperatuur, noodprogramma"); } if (nu - vensterStart >= VENSTER_MS) vensterStart += VENSTER_MS; verwarmen = (nu - vensterStart) < (unsigned long)(gemAan * VENSTER_MS); koelen = false; } else { if (noodprogramma) { noodprogramma = false; melding("temperatuur terug: gewone regeling"); } if (!verwarmen && luchtT < laag) verwarmen = true; // hysterese: twee grenzen else if (verwarmen && luchtT > hoog) verwarmen = false; if (!koelen && luchtT > KOEL_AAN) koelen = true; else if (koelen && luchtT < KOEL_UIT) koelen = false; if (verwarmen) koelen = false; // nooit tegelijk verwarmen en koelen gemAan += ((verwarmen ? 1.0 : 0.0) - gemAan) * (MEET_MS / 3600000.0); tMin = min(tMin, luchtT); tMax = max(tMax, luchtT); } if (verwarmen && !was) starts++; if (verwarmen) aanMs += MEET_MS; if (koelen != wasKoelen) melding(koelen ? "ventilatoren vol: koelen" : "ventilatoren terug laag"); digitalWrite(VERWARMING, verwarmen ? HIGH : LOW); analogWrite(VENTILATOREN, koelen ? VENT_VOL : VENT_LAAG);} void taakKlimaat(unsigned long nu) { if (nu - vorigeMeting < MEET_MS) return; vorigeMeting += MEET_MS; float t, rv; if (sht.readBoth(&t, &rv)) luchtT = t; else luchtT = NAN; // de sensor antwoordt niet (draad los, sensor stuk) int uur = rtc.now().hour(); if (uur != vorigUur) uurOverzicht(uur); regelen(nu, uur);} void setup() { pinMode(VERWARMING, OUTPUT); digitalWrite(VERWARMING, LOW); // veilig starten: verwarming uit pinMode(VENTILATOREN, OUTPUT); Serial.begin(115200); Wire.begin(); rtc.begin(); if (!sht.begin(0x44)) Serial.println("# ALARM: geen SHT31 op adres 0x44"); melding("klimaatregeling gestart");} void loop() { taakKlimaat(millis());}Getest in een gesloten lus: een C++-versie van het warmtemodel speelt de module en geeft de temperatuur door aan een gesimuleerde SHT31. Om 2:10 gaat het stekkertje van de sensor een halfuur los. De seriële monitor:
# 22:00:00 klimaatregeling gestart # 23:00:00 uuroverzicht keer aan: 4 aan: 21 % lucht: 15.9 tot 19.1 C # 00:00:00 uuroverzicht keer aan: 4 aan: 26 % lucht: 15.9 tot 17.3 C # 01:00:00 uuroverzicht keer aan: 5 aan: 30 % lucht: 16.0 tot 17.3 C # 02:00:00 uuroverzicht keer aan: 5 aan: 31 % lucht: 15.9 tot 17.2 C # 02:10:02 ALARM: geen temperatuur, noodprogramma # 02:40:02 temperatuur terug: gewone regeling # 03:00:00 uuroverzicht keer aan: 6 aan: 36 % lucht: 15.8 tot 17.2 C # 04:00:00 uuroverzicht keer aan: 6 aan: 37 % lucht: 15.9 tot 17.2 C # 05:00:00 uuroverzicht keer aan: 5 aan: 37 % lucht: 15.9 tot 17.2 C # 06:00:00 uuroverzicht keer aan: 6 aan: 42 % lucht: 15.9 tot 17.2 C
Het uuroverzicht bevestigt de simulatie in Python: vijf à zes keer aan per uur, de meting tussen 15,8 en 17,3 °C, en een inschakelduur die stijgt naarmate het kouder wordt. Tijdens het noodprogramma regelt de Mega blind: hij zet de verwarming elke 10 minuten even lang aan als ze het afgelopen uur gemiddeld aan stond. Dat is een open lus, maar een verstandige: de lucht bleef in de test tussen 15,7 en 17,4 °C. Zonder de test isnan(luchtT) was elke vergelijking met nan onwaar geweest, en was de verwarming blijven staan zoals ze stond, aan of uit.
Een tweede test op een zonnige aprildag (10 tot 18 uur) toont de grens van trap 1: de ventilatoren draaien vanaf 10:11 vol, maar de lucht stijgt toch tot 34,0 °C om 13:47. Zonder dak lukt het niet.
Een regeling beoordelen met een meting
Werkt de regeling op de echte module zoals in de simulatie? Dat bewijs je met een meting. Voor een testnacht laat je de Mega elke 10 s een regel naar de computer sturen (hoofdstuk 30): tijdstip, gemeten temperatuur, stand van de verwarming. De eerste regels van het bestand nacht.csv:
tijdstip,temperatuur_C,verwarming 23:00:00,16.78,1 23:00:10,16.78,1 23:00:20,16.81,1 23:00:30,16.92,1 23:00:40,17.00,0 23:00:50,17.11,0
Vier kengetallen vatten een aan/uit-regeling samen: de gemiddelde afwijking van het midden van de band (nauwkeurigheid), de laagste en hoogste waarde (schommeling), het aantal keer aan per uur (slijtage) en de inschakelduur (energie).
# beoordeel.py - hoe goed regelde de verwarming vannacht? (testmeting: elke 10 s een regel)import csv MIDDEN = 16.5 # midden van de band 16,0 tot 17,0 °CSTAP = 10 # s tussen twee regels temps, aan = [], []with open("nacht.csv", newline="") as f: for rij in csv.DictReader(f): temps.append(float(rij["temperatuur_C"])) aan.append(rij["verwarming"] == "1") uren = len(temps) * STAP / 3600keer_aan = sum(1 for vorige, nu in zip(aan, aan[1:]) if nu and not vorige)gem = sum(temps) / len(temps)afwijking = sum(abs(t - MIDDEN) for t in temps) / len(temps)inschakelduur = sum(aan) / len(aan) print(f"meetduur {uren:.1f} h, {len(temps)} metingen")print(f"temperatuur gemiddeld {gem:.2f} °C, van {min(temps):.2f} tot {max(temps):.2f} °C")print(f"gemiddelde afwijking van {MIDDEN} °C: {afwijking:.2f} °C")print(f"verwarming {keer_aan} keer aan: {keer_aan / uren:.1f} keer per uur, {100 * inschakelduur:.0f} % van de tijd")print(f"warmte van het station: {0.8 * inschakelduur * uren:.2f} kWh")Uitvoer:
meetduur 7.0 h, 2520 metingen temperatuur gemiddeld 16.59 °C, van 15.93 tot 17.24 °C gemiddelde afwijking van 16.5 °C: 0.34 °C verwarming 37 keer aan: 5.3 keer per uur, 34 % van de tijd warmte van het station: 1.88 kWh
De gemeten waarden liggen dichter bij elkaar dan de echte luchttemperatuur (15,80 tot 17,42 °C): de sensor loopt achter en vlakt de toppen af. Een meting beoordeelt dus altijd de lucht zoals de sensor ze ziet. Wie de echte schommeling wil kennen, hangt voor de test een tweede, snelle sensor in de ruimte.
Formules, kengetallen en grenzen
| symbool | betekenis | eenheid |
|---|---|---|
| setpoint, gewenste waarde | °C | |
| meting | °C |
| symbool | betekenis | eenheid |
|---|---|---|
| warmtecapaciteit die meewarmt | J/K | |
| breedte van de band | K | |
| vermogen van de verwarming | W | |
| verlies bij het midden van de band | W |
| symbool | betekenis | eenheid |
|---|---|---|
| keer aan per uur | 1/h |
| symbool | betekenis | eenheid |
|---|---|---|
| tijdconstante van de sensor | s |
| symbool | betekenis | eenheid |
|---|---|---|
| tijdstap | s |
| kengetal | wat het zegt | module, januarinacht |
|---|---|---|
| gemiddelde afwijking van het midden | nauwkeurigheid | 0,39 K |
| laagste en hoogste waarde | schommeling | 15,8 tot 17,4 °C |
| keer aan per uur | slijtage van klep of relais | 5,3 |
| inschakelduur | energie | 34 %, 1,88 kWh in 7 h |
| klimaatmodule | aan / vol / open | uit / laag / dicht | pin |
|---|---|---|---|
| verwarming overdag (6-22 h) | onder 18,0 °C | boven 19,0 °C | D12 |
| verwarming 's nachts | onder 16,0 °C | boven 17,0 °C | D12 |
| ventilatoren vol (anders zacht) | boven 25 °C | onder 24 °C | D11 (PWM 255 / 90) |
| kasdak (hoofdstuk 32) | boven 27 °C | onder 25 °C | D6-D8 |
| sensor weg | verwarming blind, even lang als gemiddeld het laatste uur | ||
Waar regelen vandaan komt en waar het heen gaat
Regelen is de leerlijn waar de andere samenkomen: het proces is energie en warmte (hoofdstukken 18 en 19), de meting is elektronica en sensoren (22 en 30), de uitvoering is programmeren (29), en het ontwerp is een afweging met getallen. Ook de natuur regelt zo: homeostase is een regelkring. In Expert leer je regelaars die niet schommelen (PID) en modellen met afgeleiden in plaats van stapjes.
Meten, beslissen, doen: de eerste drempel en het eerste dakraam met twee grenzen.
Homeostase en de lichaamstemperatuur als regelkring.
Q = C · ΔT en het watervat als nachtbuffer: de bouwstenen van het warmtemodel.
De 20,2 W/K van de module: het verlies dat de verwarming moet dekken.
De vertraging van de sensor gedraagt zich als een RC-kring; de Schmitt-trigger als hysterese in hardware.
millis(), taken en pinnen.h: de basis van de nieuwe taak.
Het logboek waarmee je een regeling beoordeelt.
Het dak, de modi van de module en de veilige toestand bij een fout.
Tijdconstanten en modellen met differentiaalvergelijkingen in plaats van stapjes.
Regelaars die doseren in plaats van schakelen: P, I en D, zonder zaagtand.
Bloedsuiker en temperatuur: regelkringen in het lichaam, kwantitatief.
In het kort
- Een open lus stuurt zonder te meten; een gesloten lus meet de geregelde grootheid en corrigeert zo ook storingen die ze niet kent.
- Een blokschema toont regelaar, actuator, proces en sensor; de regelaar werkt met de fout .
- Cruisecontrol en lichaamstemperatuur zijn gesloten lussen; het lichaam gebruikt zijn actuatoren in trappen en regelt geleidelijk.
- Een aan/uit-regeling met hysterese heeft twee grenzen en onthoudt haar toestand; één drempel laat de actuator flikkeren.
- Zonder vertraging: en ; de inschakelduur is , onafhankelijk van de band.
- Een bredere band en een tragere sensor geven minder schakelingen maar meer schommeling; een trage sensor laat de lucht voorbij de grenzen schieten.
- Een regeling beoordeel je met kengetallen uit een meting: gemiddelde afwijking, schommeling, keer aan per uur en energie.
- De module verwarmt 's nachts tussen 16 en 17 °C en overdag tussen 18 en 19 °C, en koelt in twee trappen: ventilatoren boven 25 °C, dak boven 27 °C.
Wat je nu kent
- gesloten lus
- Regeling die de geregelde grootheid meet en haar actie aanpast aan het verschil met de gewenste waarde (terugkoppeling).
- open lus
- Sturing volgens een plan of opdracht, zonder te meten wat het resultaat is.
- blokschema
- Tekening van een regelkring met blokken (regelaar, actuator, proces, sensor) en pijlen voor de signalen.
- regelafwijking (fout)
- Het verschil tussen de gewenste waarde en de meting.
- storing
- Een invloed van buiten die de geregelde grootheid verandert, zoals de buitentemperatuur of een open deur.
- hysterese
- Een regelaar met twee grenzen: aan onder de ene, uit boven de andere; daartussen blijft hij in zijn toestand.
- inschakelduur
- Het deel van de tijd dat een aan/uit-actuator aan staat; gemiddeld dekt ze precies het verlies.
- meetvertraging
- De tijd die een sensor nodig heeft om een verandering te volgen; ze laat de regeling voorbij haar grenzen schieten.
- negatieve terugkoppeling
- Terugkoppeling die een afwijking verkleint: te warm geeft minder verwarming.
- voorsturing
- Een storing meten en er vooraf op reageren, zonder het resultaat te meten (open lus).