← Back to CoursesStemExpert
StemExpert
Intermediate · Werkboek · 32. Toestandsmachines
StemExpert · Brecht Corbeel · schoolium.me
StemExpert
I32. Toestandsmachines — werkboek
IIntermediate · deel I8 · Regelen en robotica

Werkboek · hoofdstuk 32Toestandsmachines

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.

5× oefenen7× toepassen4× uitdagen± 427 min0/16 gedaan
Een knop, een paar lampen en een klok: het klassieke voorbeeld van een toestandsmachine.
Een knop, een paar lampen en een klok: het klassieke voorbeeld van een toestandsmachine.
Hoe lees je een opdracht?
Drie tredenOefenen Toepassen Uitdagen

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.
  1. a
    OPENEN
    • Atoestand
    • Bgebeurtenis
    • Cactie
  2. b
    De eindeloopschakelaar 'open' wordt ingedrukt.
    • Atoestand
    • Bgebeurtenis
    • Cactie
  3. c
    De motor stilzetten.
    • Atoestand
    • Bgebeurtenis
    • Cactie
  4. d
    12 s voorbij zonder eindpunt.
    • Atoestand
    • Bgebeurtenis
    • Cactie
  5. e
    Wachten tot de voetgangers overgestoken zijn (alles rood).
    • Atoestand
    • Bgebeurtenis
    • Cactie
  6. 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.
DICHTOPENENmotor: openOPENtimer startSLUITENmotor: dichtbewegingeindeloop open[5 s niemand]eindeloop dichtbeweging of fotocelbeweging offotocel /timer opnieuw
De automatische deur uit het handboek.
  1. a
    Vul de tabel in: na elke gebeurtenis de nieuwe toestand en de actie.
    gebeurtenisnieuwe toestandactie
  2. 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.
DICHTOPENENmotor: openenOPENGESTOPTmotor stilSLUITENmotor: dichtDAK_FOUTmotor stilwens openeindeloop openwens dichteindeloop dichtknop[t > 12 s]knopknop / wens = dicht[t > 12 s]herstel
Het kasdak als toestandsmachine.
  1. a
    Vul de tabel in. Schrijf in elk vakje de nieuwe toestand, of een streepje.
    toestandknopwens openwens dichteindeloop openeindeloop dichtt > 12 s
  2. b
    In DICHT staat bij 'knop' geen overgang in het diagram. Wat doet een knopdruk dan toch (kijk in dak.cpp)?
  3. 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;
  }
}
  1. a
    Volg de machine stap voor stap. In welke toestand eindigt ze, en wat is teller?
    tekentoestand na de stapteller
  2. 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).
  1. a
    Teken het toestandsdiagram met toestanden, gebeurtenissen, acties en een beginpunt.
  2. 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).
  1. a
    Teken de uitbreiding in het toestandsdiagram: nieuwe toestand, overgangen, acties.
  2. b
    Schrijf de nieuwe case en de aanpassingen in naar() en in de knop.
  3. c
    Uit welke toestand(en) mag de nachtstand beginnen? Waarom niet uit elke toestand?
  4. d
    Test je programma en beschrijf je scenario: wat heb je gedaan om elke nieuwe overgang te zien gebeuren?
Zo wordt dit beoordeeld
SchakelingAlle leds werken met een weerstand, knop naar GND met INPUT_PULLUP.
DiagramNACHT_KNIPPER met overgangen [uur ≥ 23] uit AUTO_GROEN en [uur = 6] naar ALLES_ROOD_2, acties benoemd.
CodeEén nieuwe waarde in de enum, een case met break, knipperen met millis() zonder delay(), knop genegeerd.
TestElke 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;
  }
}
  1. a
    Er ontbreekt een break. Wat gebeurt er daardoor als de klep DICHT is en het CO₂-gehalte 900 ppm is?
  2. b
    Hoe lang wacht de machine echt in WACHTEN? Waarom?
  3. c
    Welke veiligheidsvoorwaarde ontbreekt (denk aan de modi en het dak)?
  4. 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.
DICHTOPENENmotor: openOPENtimer startSLUITENmotor: dichtbewegingeindeloop open[5 s niemand]eindeloop dichtbeweging of fotocelbeweging offotocel /timer opnieuw
De deur uit het handboek.
  1. a
    Voeg een toestand FOUT toe. Welke gebeurtenissen en time-outs leiden ernaartoe?
  2. b
    In welke toestand start de deur na een stroomuitval? Hoe weet het programma dat?
  3. c
    Wat moet de deur doen als de stroom wegvalt, en hoe doe je dat zonder elektronica?
Zo wordt dit beoordeeld
FoutenOnmogelijke combinaties en time-outs (bv. OPENEN langer dan 8 s) leiden naar FOUT; FOUT zet de motor stil en geeft alarm.
StartDe eindeloopschakelaars bepalen de begintoestand; onbekende stand: een veilige keuze met uitleg.
Fail-safeEen 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.
KLAARdeur losVULLENklep openVERWARMEN40 °C (hysterese)WASSENtrommel draaitPOMPENpomp aanSPOELENklep open, draaienCENTRIFUGEREN1200 omw/minFOUTalles uit, deur op slotstartniveau40 °C30 minleeg10 min8 min /deur los[t > 5 min][t > 3 min]
De wasmachine uit het handboek.
  1. a
    De machine moet twee keer spoelen. Voeg een teller toe en pas de overgangen aan, zonder toestanden te kopiëren.
  2. 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.
  3. 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.
knoplampje 'wacht'auto groenauto oranjeauto roodvoetg. groenvoetg. rood0102030405060708090t (s)
De test van het voetgangerslicht.
  1. a
    Op welke tijdstippen wordt de knop ingedrukt? Welke druk heeft geen effect, en waarom?
  2. b
    Hoe lang wacht de voetganger die op 41 s drukt tot hij groen krijgt?
  3. c
    Waarom gaat het lampje 'wacht' aan op 5 s en uit op 25 s?
  4. 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?
  1. a
    De vlotter op D2 met INPUT_PULLUP: contact dicht (LOW) = genoeg water.
  2. b
    Een CO₂-klep die open staat zonder stroom (normaal open), gestuurd met een MOSFET.
  3. c
    De MOSFET van de verwarming met 10 kΩ pull-down: als de Mega uitvalt, is de verwarming uit. Is dat in januari veilig?
  4. 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.
  1. a
    Schrijf het woordenboek OVERGANGEN en de functie verwerk().
  2. b
    Voeg een verzameling ONMOGELIJK toe: combinaties die op een sensorfout wijzen en naar FOUT leiden.
  3. 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.
  1. 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?
  2. 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).
  3. c
    Vul de actietabel aan: wat doen lampen, pomp en ventilatoren in elke combinatie van modus en energietoestand?
    modusenergielampenpompventilatoren
  4. d
    Schrijf de switch van de energiemachine in C++ (de laadtoestand staat in de variabele soc).
  5. e
    Beschrijf een testscenario dat elke overgang van de energiemachine laat zien, ook samen met ALARM en ONDERHOUD.
Zo wordt dit beoordeeld
KeuzeHet nadeel van één grote machine (verdubbeling van toestanden) is gezien; twee machines naast elkaar, elk met één aspect.
DiagramDrie toestanden, overgangen met hysterese (bv. 20/25 % en 40/45 %), begin volgens de laadtoestand.
ActietabelElke combinatie ingevuld; ONDERHOUD en ALARM behouden hun veiligheidsregels ook als het zuinig moet.
Codeenum, switch met break, overgangen alleen bij de grenzen, geen delay().
TestScenario 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
  1. a
    Wat gebeurde er tussen 9:30 en 9:52? Waarom kon het dak toen niet bewegen?
  2. b
    Het stekkertje van de SHT31 ging om 10:40:00 los. Waarom begint het alarm pas om 10:40:28?
  3. c
    Het dak ging om 10:45 open terwijl de module in ALARM was. Is dat een fout?
  4. d
    Tussen 11 en 12 uur ging het dak vier keer open. Geef twee manieren om dat pendelen te verminderen.
  5. 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.'
  1. a
    Geef twee argumenten voor een noodstop in software en twee voor een noodstop in hardware.
  2. 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.
  1. a
    Maak een lijst van toestanden en gebeurtenissen.
  2. b
    Teken het toestandsdiagram, met time-outs en een toestand FOUT.
  3. 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
ToestandenStilstaan beneden/boven met deur open of dicht, rijden omhoog/omlaag, FOUT; logisch benoemd.
OvergangenKnoppen, deur dicht, verdiepingssensor, lichtsluis, time-out tijdens het rijden.
VeiligheidNooit 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