Een programma dat onthoudt waar het is: van verkeerslicht tot de modi van de klimaatmodule
Je leert eerst toestanden en gebeurtenissen herkennen en diagrammen lezen, tekent en programmeert daarna je eigen machines, zoekt fouten, en ontwerpt tot slot een uitbreiding van de modi van de klimaatmodule. Voor opdracht 32.6 heb je een Arduino met leds nodig, voor 32.12 Python.
Een knop, een paar lampen en een klok: het klassieke voorbeeld van een toestandsmachine.
Hoe lees je een opdracht?
Drie tredenOefenenToepassenUitdagen
Elk hoofdstuk bouwt op: eerst oefenen (één stap, direct toepassen), dan toepassen (meerdere stappen, in een context), dan uitdagen (transfer, open problemen, andere leerlijnen erbij).
De StemExpert-schaal5
Eén moeilijkheidsschaal van 1 tot 9 over de drie niveaus heen: Fundamental loopt van 1 tot 4, Intermediate van 3 tot 7, Expert van 6 tot 9. Zo zie je dat de uitdaging van het ene niveau de oefening van het volgende is.
Oefenen
Oefenen
één stap, direct toepassen
32.1
Toestand, gebeurtenis of actie?
Oefenen3Begrijpen10 min
Het gaat telkens over het kasdak of het voetgangerslicht.
a
OPENEN
Atoestand
Bgebeurtenis
Cactie
b
De eindeloopschakelaar 'open' wordt ingedrukt.
Atoestand
Bgebeurtenis
Cactie
c
De motor stilzetten.
Atoestand
Bgebeurtenis
Cactie
d
12 s voorbij zonder eindpunt.
Atoestand
Bgebeurtenis
Cactie
e
Wachten tot de voetgangers overgestoken zijn (alles rood).
Atoestand
Bgebeurtenis
Cactie
f
Het lampje 'wacht' aanzetten.
Atoestand
Bgebeurtenis
Cactie
32.2
Een diagram volgen
Oefenen3Analyseren12 min
De deur staat DICHT. Dit gebeurt na elkaar: beweging, eindeloop open, 5 s niemand, fotocel, eindeloop open, beweging, 5 s niemand, eindeloop dicht.
De automatische deur uit het handboek.
a
Vul de tabel in: na elke gebeurtenis de nieuwe toestand en de actie.
gebeurtenis
nieuwe toestand
actie
b
Waarom is de overgang na 'fotocel' belangrijk?
32.3
Van diagram naar tabel
Oefenen4Tekenen20 min
Maak zelf de toestandstabel van het dak, zonder in het handboek te kijken.
Het kasdak als toestandsmachine.
a
Vul de tabel in. Schrijf in elk vakje de nieuwe toestand, of een streepje.
toestand
knop
wens open
wens dicht
eindeloop open
eindeloop dicht
t > 12 s
b
In DICHT staat bij 'knop' geen overgang in het diagram. Wat doet een knopdruk dan toch (kijk in dak.cpp)?
c
Welk vakje zou je veranderen als het dak in DAK_FOUT elke minuut opnieuw moet proberen? Is dat een goed idee?
32.4
Voorspel de uitvoer
Oefenen4Programmeren15 min
Een kleine toestandsmachine in C++. De functie stap() krijgt na elkaar de tekens k, x, k, x, x, k, k, x, x.
enum T { ROOD, GROEN, ORANJE };
T t = ROOD;
int teller = 0;
void stap(char g) { // g: 'k' = knop, 'x' = tijd voorbij
switch (t) {
case ROOD: if (g == 'k') { t = GROEN; teller++; } break;
case GROEN: if (g == 'x') t = ORANJE; break;
case ORANJE: if (g == 'x') t = ROOD; else if (g == 'k') teller += 10; break;
}
}
a
Volg de machine stap voor stap. In welke toestand eindigt ze, en wat is teller?
teken
toestand na de stap
teller
b
Wat verandert er als de break na de case ROOD ontbreekt? Geef een teken waarbij het verschil zichtbaar wordt.
32.5
De waterkoker
Oefenen4Tekenen15 min
Een waterkoker heeft een schakelaar die je naar beneden duwt, een bimetaal dat hem terug omhoog laat springen als het water kookt, en een beveiliging die hem uitschakelt als hij zonder water staat (de bodem wordt dan veel heter dan 100 °C).
a
Teken het toestandsdiagram met toestanden, gebeurtenissen, acties en een beginpunt.
b
Welke toestand is de veilige toestand? Is de droogkookbeveiliging fail-safe?
Toepassen
Toepassen
meerdere stappen, in een context
32.6
Maak: het voetgangerslicht met een nachtstand
Toepassen5Maken60 min
Bouw het voetgangerslicht uit het handboek op een breadboard (vijf leds met 220 Ω, een lampje 'wacht', een knop naar GND). Voeg daarna een nachtstand toe: van 23 tot 6 uur knippert het oranje licht voor de auto's (1 s aan, 1 s uit), de voetgangerslichten zijn uit en de knop doet niets. Om 6 uur gaat het licht eerst 5 s alles rood, dan AUTO_GROEN. Neem aan dat er een functie uur() bestaat (voor een test kan ze de minuten van millis() teruggeven).
a
Teken de uitbreiding in het toestandsdiagram: nieuwe toestand, overgangen, acties.
b
Schrijf de nieuwe case en de aanpassingen in naar() en in de knop.
c
Uit welke toestand(en) mag de nachtstand beginnen? Waarom niet uit elke toestand?
d
Test je programma en beschrijf je scenario: wat heb je gedaan om elke nieuwe overgang te zien gebeuren?
Zo wordt dit beoordeeld
Schakeling
Alle leds werken met een weerstand, knop naar GND met INPUT_PULLUP.
Diagram
NACHT_KNIPPER met overgangen [uur ≥ 23] uit AUTO_GROEN en [uur = 6] naar ALLES_ROOD_2, acties benoemd.
Code
Eén nieuwe waarde in de enum, een case met break, knipperen met millis() zonder delay(), knop genegeerd.
Test
Elke nieuwe overgang aantoonbaar getest (bv. met een versnelde klok).
32.7
Vind de fouten: de CO₂-klep
Toepassen5Programmeren20 min
Een leerling programmeerde de CO₂-klep als toestandsmachine: onder 800 ppm de klep 30 s open, dan 5 minuten wachten zodat de CO₂ zich mengt.
enum Klep { DICHT, OPEN, WACHTEN };
Klep klep = DICHT;
unsigned long sinds = 0;
void taakCo2(unsigned long nu, float co2) {
switch (klep) {
case DICHT:
if (co2 < 800) { klep = OPEN; sinds = nu; digitalWrite(CO2_KLEP, HIGH); }
case OPEN:
if (nu - sinds >= 30000) { klep = WACHTEN; digitalWrite(CO2_KLEP, LOW); }
break;
case WACHTEN:
if (nu - sinds >= 300000) klep = DICHT;
break;
}
}
a
Er ontbreekt een break. Wat gebeurt er daardoor als de klep DICHT is en het CO₂-gehalte 900 ppm is?
b
Hoe lang wacht de machine echt in WACHTEN? Waarom?
c
Welke veiligheidsvoorwaarde ontbreekt (denk aan de modi en het dak)?
d
Schrijf de verbeterde versie.
32.8
De automatische deur veiliger
Toepassen5Ontwerpen25 min
De deur zit in de gang tussen de woonmodule en de rest van het station. Het is ook een vluchtweg bij brand.
De deur uit het handboek.
a
Voeg een toestand FOUT toe. Welke gebeurtenissen en time-outs leiden ernaartoe?
b
In welke toestand start de deur na een stroomuitval? Hoe weet het programma dat?
c
Wat moet de deur doen als de stroom wegvalt, en hoe doe je dat zonder elektronica?
Zo wordt dit beoordeeld
Fouten
Onmogelijke combinaties en time-outs (bv. OPENEN langer dan 8 s) leiden naar FOUT; FOUT zet de motor stil en geeft alarm.
Start
De eindeloopschakelaars bepalen de begintoestand; onbekende stand: een veilige keuze met uitleg.
Fail-safe
Een vluchtdeur gaat open of is met de hand te openen zonder stroom (veer, vrijloop).
32.9
De wasmachine uitbreiden
Toepassen5Tekenen20 min
Pas het diagram aan.
De wasmachine uit het handboek.
a
De machine moet twee keer spoelen. Voeg een teller toe en pas de overgangen aan, zonder toestanden te kopiëren.
b
In FOUT blijft de deur op slot zolang er water in de trommel staat. Hoe komt het water eruit? Voeg toe wat nodig is.
c
Het water moet ook tijdens WASSEN op 40 °C blijven. Waar hoort de regeling met hysterese thuis?
32.10
Een tijdsdiagram lezen
Toepassen5Analyseren15 min
Lees de antwoorden af in het tijdsdiagram.
De test van het voetgangerslicht.
a
Op welke tijdstippen wordt de knop ingedrukt? Welke druk heeft geen effect, en waarom?
b
Hoe lang wacht de voetganger die op 41 s drukt tot hij groen krijgt?
c
Waarom gaat het lampje 'wacht' aan op 5 s en uit op 25 s?
d
In welke toestand is de machine op 60 s? En op 35 s?
32.11
Fail-safe of niet?
Toepassen6Begrijpen20 min
Beoordeel telkens: wat gebeurt er als de draad breekt of de stroom wegvalt? Is dat de veilige toestand?
a
De vlotter op D2 met INPUT_PULLUP: contact dicht (LOW) = genoeg water.
b
Een CO₂-klep die open staat zonder stroom (normaal open), gestuurd met een MOSFET.
c
De MOSFET van de verwarming met 10 kΩ pull-down: als de Mega uitvalt, is de verwarming uit. Is dat in januari veilig?
d
Een eindeloopschakelaar als maakcontact: ingedrukt = LOW.
32.12
De deur als tabel in Python
Toepassen6Programmeren30 min
Maak van de toestandstabel van de automatische deur een Python-programma, zoals de wasmachine in het handboek.
a
Schrijf het woordenboek OVERGANGEN en de functie verwerk().
b
Voeg een verzameling ONMOGELIJK toe: combinaties die op een sensorfout wijzen en naar FOUT leiden.
c
Test met: beweging, eindeloop open, beweging, 5 s niemand, fotocel, eindeloop dicht, eindeloop open. Wat is de uitvoer?
Uitdagen
Uitdagen
transfer, open problemen, leerlijnen combineren
32.13
Habitat: een zuinige modus
Uitdagen7Habitat75 min
Het energiebeheer van hoofdstuk 20 zegt: boven 40 % laadtoestand mogen de lampen volgens schema branden, tussen 20 en 40 % alleen op het zonne-overschot, onder 20 % niet. Onder 20 % moet de module ook de pomp terugschroeven (5 in plaats van 10 minuten per uur) en de ventilatoren zacht laten draaien. Ontwerp hoe de modi hiermee omgaan.
a
Een collega wil een zesde modus ZUINIG naast DAG en NACHT. Een ander wil een aparte, kleine toestandsmachine voor de energie. Vergelijk beide: hoeveel toestanden krijg je, en wat gebeurt er als het 's nachts zuinig moet?
b
Teken de toestandsmachine voor de energie met drie toestanden (VOL, ZON, ZUINIG) en hysterese op de grenzen (bv. terug naar boven pas 5 procentpunt hoger).
c
Vul de actietabel aan: wat doen lampen, pomp en ventilatoren in elke combinatie van modus en energietoestand?
modus
energie
lampen
pomp
ventilatoren
d
Schrijf de switch van de energiemachine in C++ (de laadtoestand staat in de variabele soc).
e
Beschrijf een testscenario dat elke overgang van de energiemachine laat zien, ook samen met ALARM en ONDERHOUD.
Zo wordt dit beoordeeld
Keuze
Het nadeel van één grote machine (verdubbeling van toestanden) is gezien; twee machines naast elkaar, elk met één aspect.
Diagram
Drie toestanden, overgangen met hysterese (bv. 20/25 % en 40/45 %), begin volgens de laadtoestand.
Actietabel
Elke combinatie ingevuld; ONDERHOUD en ALARM behouden hun veiligheidsregels ook als het zuinig moet.
Code
enum, switch met break, overgangen alleen bij de grenzen, geen delay().
Test
Scenario met dalende en stijgende laadtoestand, rond de grenzen heen en weer, en een alarm tijdens ZUINIG.
32.14
Een logboek van de module lezen
Uitdagen6Analyseren30 min
Dit is de seriële monitor van de test uit het handboek (klimaat.ino versie 4).
# 05:50:00 klimaatmodule v4 (hoofdstuk 32)
# 05:50:00 modus OPSTART
# 05:50:00 dak: DICHT
# 05:50:05 modus NACHT
# 06:00:00 modus DAG
# 09:30:03 modus ONDERHOUD
# 09:52:03 modus DAG
# 10:40:28 oorzaak: geen temperatuur
# 10:40:28 modus ALARM
# 10:45:00 dak: OPENEN
# 10:45:07 dak: OPEN
# 10:50:00 modus DAG
# 10:51:38 dak: SLUITEN
# 10:51:45 dak: DICHT
# 11:06:10 dak: OPENEN
# 11:06:17 dak: OPEN
# 11:12:24 dak: SLUITEN
# 11:12:31 dak: DICHT
# 11:21:52 dak: OPENEN
# 11:21:59 dak: OPEN
# 11:30:14 dak: SLUITEN
# 11:30:21 dak: DICHT
# 11:37:30 dak: OPENEN
# 11:37:37 dak: OPEN
# 11:50:54 dak: SLUITEN
# 11:51:01 dak: DICHT
# 11:56:44 dak: OPENEN
# 11:56:51 dak: OPEN
# 15:39:34 dak: SLUITEN
# 15:39:46 dak: DAK_FOUT
# 15:39:48 oorzaak: dak haalt zijn eindpunt niet
# 15:39:48 modus ALARM
# 16:45:00 dak: SLUITEN
# 16:45:00 modus DAG
# 16:45:03 dak: DICHT
# 22:00:00 modus NACHT
# 23:10:08 oorzaak: vlotter droog
# 23:10:08 modus ALARM
# 23:40:00 modus NACHT
a
Wat gebeurde er tussen 9:30 en 9:52? Waarom kon het dak toen niet bewegen?
b
Het stekkertje van de SHT31 ging om 10:40:00 los. Waarom begint het alarm pas om 10:40:28?
c
Het dak ging om 10:45 open terwijl de module in ALARM was. Is dat een fout?
d
Tussen 11 en 12 uur ging het dak vier keer open. Geef twee manieren om dat pendelen te verminderen.
e
Wat gebeurde er om 15:39 en om 16:45? Hoe lang was de module in totaal in ALARM?
32.15
Debat: mag de software de noodstop zijn?
Uitdagen6Argumenteren20 min
In de modi-code stopt een korte druk op S1 een bewegend dak: de knop werkt via de Mega. Een collega zegt: 'Dat is geen echte noodstop. Die moet de motor rechtstreeks spanningsloos maken, ook als het programma hangt.'
a
Geef twee argumenten voor een noodstop in software en twee voor een noodstop in hardware.
b
Hoe zou je een hardwarenoodstop voor het dak aansluiten (tip: DAK_ENABLE en de voeding van de H-brug)?
32.16
Ontwerp: een lift met twee verdiepingen
Uitdagen6Ontwerpen40 min
Het station krijgt een goederenlift tussen de kelder (batterijen) en het gelijkvloers. Er is een knop op elke verdieping en in de lift, een sensor per verdieping, een deur met een schakelaar 'deur dicht', een lichtsluis in de deuropening en een motor met rem.
a
Maak een lijst van toestanden en gebeurtenissen.
b
Teken het toestandsdiagram, met time-outs en een toestand FOUT.
c
Welke regels mogen nooit geschonden worden? Hoe zorg je dat de lift ze ook bij een fout in de software niet schendt?
Zo wordt dit beoordeeld
Toestanden
Stilstaan beneden/boven met deur open of dicht, rijden omhoog/omlaag, FOUT; logisch benoemd.
Overgangen
Knoppen, deur dicht, verdiepingssensor, lichtsluis, time-out tijdens het rijden.
Veiligheid
Nooit rijden met de deur open; bij een fout stilstaan met de rem erop; rem fail-safe (Otis).
ZelfevaluatieKleur per doel: lukt al / bijna / nog niet
Ik kan in een systeem toestanden, gebeurtenissen, overgangen en acties herkennen en benoemen.
Ik kan een toestandsdiagram lezen en tekenen met de notatie gebeurtenis [voorwaarde] / actie.
Ik kan een toestandsdiagram omzetten in een toestandstabel en ermee controleren of elke combinatie bedacht is.
Ik kan een toestandsmachine programmeren met enum en switch-case, zonder delay(), met de tijd in een toestand.
Ik kan fouten opsporen met time-outs en onmogelijke combinaties, en per fout een veilige toestand kiezen.
Ik kan uitleggen wat fail-safe betekent en wat een waakhond doet.
Ik kan de modi van de klimaatmodule ontwerpen, programmeren en met een testscenario controleren.