Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

7 Van toestandsdiagram naar code

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.

Toestandsdiagram van led en drukknop met toggle-functie

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 OPSTARTEN

Dit 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 uit

7.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 1

Beide 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 uit

Gebruik 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.

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 losknop ingedrukt
1-2: zet lamp aan
23-
3-4: zet lamp uit
41-

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.

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

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

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.

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