7.1Inleiding¶
Een toestandsdiagram geeft de werking van een systeem weer. Als je een toestandsdiagram maakt voordat je het systeem echt gaat bouwen of programmeren, kun je jezelf een hoop fouten besparen. Uit het toestandsdiagram kun je namelijk opmaken of het systeem werkt zoals het moet werken. Als je ziet dat er een fout in zit, pas je eerst het toestandsdiagram aan. Dat kost veel minder tijd dan het aanpassen van een programma. Begin daarom altijd eerst met het maken van een toestandsdiagram.
Als je denkt dat het toestandsdiagram goed is kun je het programma gaan maken. Gelukkig is het omzetten van een toestandsdiagram naar een programma redelijk eenvoudig, in dit hoofdstuk leggen we uit hoe dat moet.
Ondersteuning: klassikale unplugged opdrachten¶
Doe ter voorbereiding op het werken met logische operatoren en met if-then-else structuren de volgende unplugged activiteiten met de klas.
7.2Van plaatje naar pseudocode¶
Als je het toestandsdiagram eenmaal klaar hebt, dan is het maken van een programma dat kan worden uitgevoerd op de Microbit eenvoudig. We laten dat zien aan de hand van het volgende toestandsdiagram voor een systeem bestaande uit een lamp en een drukknop. Als de drukknop wordt ingedrukt (en weer losgelaten) gaat de lamp aan. Wordt de drukknop nogmaals ingedrukt (en weer losgelaten) gaat de lamp uit. Je hebt dit toestandsdiagram al gezien in het vorige hoofdstuk.

Figure 1:Toestandsdiagram van led en drukknop met toggle-functie
Om een toestandsdiagram om te zetten in een programma gebruik je ALS-DAN-constructies. De toestand sla je op in een variabele. Hieronder zie je een uitwerking in pseudo-code. Het bestaat uit twee delen:
EENMALIG BIJ OPSTARTENDit deel wordt één keer uitgevoerd. Hierin kun je bijvoorbeeld de starttoestand aangeven.
HERHAAL:Alles wat hier staat wordt steeds weer opnieuw uitgevoerd, zolang het systeem aan is.
Alle toestanden krijgen een nummer: 1 - Lamp is uit, knop is los 2 - Lamp is aan, knop is ingedrukt 3 - Lamp is aan, knop is los 4 - Lamp is uit, knop is ingedrukt
EENMALIG BIJ OPSTARTEN:
toestand wordt 1
HERHAAL:
ALS (toestand is 1) DAN
ALS (de drukknop is ingedrukt) DAN
toestand wordt 2
zet lamp aan
ANDERS ALS (toestand is 2) DAN
ALS (de drukknop is losgelaten) DAN
toestand wordt 3
lamp blijft aan
...Zie je de relatie tussen het toestandsdiagram en de pseudo-code?
Solution to Exercise 3
EENMALIG BIJ OPSTARTEN:
toestand wordt 1
HERHAAL:
ALS (toestand is 1) DAN
ALS (de drukknop is ingedrukt) DAN
toestand wordt 2
zet lamp aan
ANDERS ALS (toestand is 2) DAN
ALS (de drukknop is losgelaten) DAN
toestand wordt 3
lamp blijft aan
ANDERS ALS (toestand is 3) DAN
ALS (de drukknop is ingedrukt) DAN
toestand wordt 4
zet lamp uit
ANDERS ALS (toestand is 4) DAN
ALS (de drukknop is losgelaten) DAN
toestand wordt 1
lamp blijft uit7.3Verdieping: Van plaatje naar pseudocode¶
Toestand-eerst of overgang-eerst¶
Er is ook een andere manier, waarbij je start vanuit de toestandsovergangen in plaats van de toestanden.
EENMALIG BIJ OPSTARTEN:
toestand wordt 1
HERHAAL:
ALS (de drukknop is ingedrukt) DAN
ALS (toestand is 1) DAN
toestand wordt 2
zet lamp aan
ANDERS ALS (toestand is 3) DAN
toestand wordt 4
zet lamp uit
ANDERS ALS (de drukknop niet is ingedrukt) DAN
ALS (toestand is 2) DAN
toestand wordt 3
ANDERS ALS (toestand is 4) DAN
toestand wordt 1Beide manieren werken. Het hangt van de situatie en het specifieke platform dat je gebruikt (Micro:bit, Arduino, Lego Mindstormd) af wat het makkelijkste is.
Gebruik in deze module altijd toestand-eerst, tenzij duidelijk anders is aangegeven.
Events¶
Bij sommige platformen, waaronder Micro:bit, kun je gebruik maken van events. Events zijn gebeurtenissen die gekoppeld kunnen worden aan een stukje code. Een voorbeeld van een event is het indrukken van een knop. De Micro:bit houdt op de achtergrond in de gaten of een event plaatsvindt. Zodra het event gebeurt, start de Micro:bit met uitvoeren van de gekoppelde code. In pseudocode ziet dat er zo uit:
EENMALIG BIJ OPSTARTEN:
toestand wordt 1
BIJ (knop indrukken)
ALS (toestand is 1) DAN
toestand wordt 2
zet lamp aan
ANDERS ALS (toestand is 3) DAN
toestand wordt 4
zet lamp uitGebruik in deze module altijd HERHAAL en geen BIJ (events), tenzij duidelijk anders is aangegeven.
7.4Pseudocode controleren met een tabel¶
Om er zeker van te zijn dat je hebt nagedacht over alle toestandsovergangen is het goed om een tabel maken met alle mogelijke combinaties. Neem het toetstandsdiagram uit Figure 1 van de vorige paragraaf.
Toestand 1: schakelaar los, lamp uit
Toestand 2: schakelaar ingedruk, lamp aan
Toestand 3: schakelaar los, lamp aan
Toestand 4: schakelaar ingedrukt, lamp uit
Hieronder zie je een tabel met alle mogelijke toestandsovergangen. Voor elke combinatie moet er staan wat de nieuwe toestand wordt en welke actie wordt uitgevoerd. Als er een streepje staat (-), dan is er geen toestandsovergang en geen actie.
| Toestand ↓ / Toestandsovergang → | knop los | knop ingedrukt |
|---|---|---|
| 1 | - | 2: zet lamp aan |
| 2 | 3 | - |
| 3 | - | 4: zet lamp uit |
| 4 | 1 | - |
Controleer of de pseudocode uit de vorige paragraaf past bij de tabel. Begin bij toestand 1, kijk of alle acties kloppen en kijk of alle overgangen kloppen. Ga daarna door met toestand 2 en zo verder tot je de hele tabel gehad hebt.
7.5Van pseudocode naar programma¶
Bekijk je pseudocode uit Exercise 3 nog eens en maak dan volgende opdracht.
Solution to Exercise 4

7.6Verbreding: Coderen met gebeurtenissen¶
In dit hoofdstuk hebben we met drukknoppen een lamp met toggle functie gemaakt. De code uit opdracht4code bekijkt de status van de drukknop om te bepalen of er een toestandsovergang is. Er zijn vier toestanden nodig,
In paragraaf 5.5 heb je geleerd dat er nog een tweede manier is om te bekijken of er een toestandsovergang is. Daarbij bekijkt je code of de status veranderd is. We noemen dat een toestandsovergang bij een gebeurtenis.
Toestandsdiagram¶
Door gebruik te maken van gebeurtenissen, hebben we nog maar twee toestanden nodig. Je ziet dat in het volgende toestandsdiagram.
Onderstaande toestandsdiagram lijkt erg veel op het toestandsdiagram van de drukknop zonder toggle functie van Exercise 1 uit hoofstuk %s. Het verschil is dat het toestandsdiagram uit het vorige hoofdstuk de status van een knop gebruikt, terwijl het toestandsdiagram hieronder een gebeurtenis met een knop gebruikt. In het onderstaande toestandsdiagram kun je aan het woord zojuist zien dat het over gebeurtenissen gaat. Soms is het lastig te zien of er een status of een gebeurtenis bij een overgang hoort. Je moet dan goed de beschrijving lezen. Let op dat je zelf altijd heel duidelijk bent wanneer je een status of een gebeurtenis gebruikt.

Toestandsdiagram van een lamp met toggle functie op basis van overgangen bij gebeurtenis.
Micro:bit code¶
In Micro:bit code gebruik je het onderstaande blok om de status van een knop op te vragen.

Blok voor de actuele status van een knop in Micro:bit-code
In Micro:bit code is er geen blok die aangeeft of een knop zojuist is ingedrukt. We kunnen dat oplossen door zelf een variabele en wat code te maken. De knop ziet er dan zo uit.

Blok voor gebeurtenis met een knop in Micro:bit-code
De hele code van een lamp uit het bovenstaande toestandsdiagram, inclusief het maken van de knop voor een gebeurtenis, ziet er zo uit.

Code van een lamp die aan of uit gaat als er een gebeurenis is waarbij een drukknop wordt ingedrukt.