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.

9 Verdieping

9.1Timers

Toestandsdiagram met timer

Uit het voorbeeld met de PIR-sensor blijkt dat er een soort klokje in de sensor zit verwerkt. De sensor blijft een tijdje HIGH als output geven, ook al loopt er niemand meer voorbij. Je kunt echter ook zelf zo’n klokje programmeren, dat noemen we een timer. In dit hoofdstuk leer je om zelf een timer te gebruiken.

Een timer is een soort kookwekker. Je kunt de wekker instellen zodat deze over een bepaalde tijd, bijvoorbeeld 5 minuten, afloopt en dan een bel of alarm laat horen. Zo is het ook met een timer, alleen gaat het meestal niet om minuten, maar om seconden of zelfs miliseconden.

Hoe kun je een timer in een toestandsdiagram gebruiken? Daarvoor heb je een actie en een gebeurtenis nodig. Dit is de actie die je kunt gebruiken voor een timer:

Als je het vergelijkt met een kookwekker: stel de wekker in, bijvoorbeeld op 10 seconden van nu. Resetten betekent dat je de timer weer terugzet naar de oorspronkelijke tijd nog voordat de timer is afgelopen. Het resetten van de timer is eigenlijk hetzelfde als het starten van de timer, daarom hebben we ze bij elkaar gezet.

Een gebeurtenis die hoort bij de timer is:

Als je het vergelijkt met een kookwekker: de kookwekker laat een bel of alarm horen.

Hieronder vind je een voorbeeld voor een systeem met een lantaarnpaal. De lantaarnpaal gaat aan zodra er beweging is gedetecteerd. De lantaarnpaal gaat weer uit als er een bepaalde tijd geen beweging is gedetecteerd. Er zijn twee toestanden:

Toestandsdiagram met timer

Toestandsdiagram met timer

Micro:bit code met timer

In dit deel laten we zien hoe je een timer kunt programmeren voor de Micro:bit en welke blokken je daarvoor nodig hebt. We laten de volgende onderdelen zien:

De timer starten Voor het coderen van een timer heb je een variable nodig, we noemen deze variabele: timerEindtijd.

Het starten van de timer doe je als volgt.

De looptijd (ms) geeft aan hoe lang de Micro:bit al aan staat, in miliseconden. Daar tel je 5000 miliseconden (= 5 seconden) bij op. De timer loopt dus over 5 seconden af.

De timer loopt af

Om na te gaan of de timer afloopt gebruik je het volgende:

Je controleert dus op de looptijd van de Micro:bit inmiddels groter of gelijk is aan de eindtijd van de timer. Als dat zo is, zijn de 5 seconden verstreken en loopt de timer dus af.

Een voorbeeld:

Je start de timer bij de looptijd van 12.000 milliseconden (dat is 12 seconden). De timerEindtijd wordt dan 12.000 + 5.000 = 17.000 milliseconden. Bij een looptijd van 12.500 milliseconden gaat de timer niet af, want de volgende uitdrukking is dan NIET WAAR:

12.500 >= 17.000

Een paar seconden later is de looptijd bijvoorbeeld 17.400 milliseconden. De timer loopt dan wel af, want de volgende uitdrukking is dan WAAR:

17.400 >= 17.000

De timer resetten of herstarten

Het resetten of herstarten van een timer is hetzelfde als het starten van de timer.

De timer uitzetten

Het uitzetten van een timer kan niet en hoeft ook niet. Als in een bepaalde toestand binnen het toestandsdiagram de timer niet belangrijk is, wordt simpelweg niet gecontroleerd of de timer afloopt. Eigenlijk is de vergelijking met de kookwekker in die zin niet helemaal goed. Een kookwekker geeft namelijk een alarm (hard piepen bijvoorbeeld) waardoor jij weet dat het tijd is om de eieren uit de pan te halen. Als je niet wilt dat het alarm afgaat moet je de kookwekker eerder uitzetten.

Bij een timer werkt dat iets anders. Het programma controleert steeds of de tijd al is verstreken. En als de timer niet meer nodig is, controleer het programma niet meer of de tijd al is verstreken.

Solution to Exercise 1

De looptijd wordt bijgehouden in milliseconden. Het uitvoeren van de blokjes kost veel meer tijd dan 1 milliseconde, vaak zelfs meer dan 100 milliseconden. De kans is dus groot dat de looptijd niet precies gelijk is aan de eindtijd van de timer. Dus moet je ook controleren of de looptijd groter is dan de eindtijd, vandaar >= (groter of gelijk aan) en niet = (gelijk aan).

Opdracht: knipperend lampje

Opdracht: dodemansknop

9.2Toestandsdiagrammen koppelen (hier komt misschien ooit iets)

Gebruik signalen

Wellicht ook: abstractie door samenpakken van toestanden (en hergebruiken in code / subtoestanden)

Wellicht ook hier (of elders): tellen in toestandsdiagrammen

Ook leuk: voorbeeld van gekoppeld toestandsdiagram uitwerken op 1 Micro:bit en daarna op 2

9.3Events op de Micro:bit (hier komt misschien ooit iets)

Leg hier uit:

  1. wat events op de microbit zijn

  2. hoe die soms (hotelschakelaar voorbeeld) gebruikt kunnen worden om eenvoudige event-driven code te schrijven

  3. misschien iets uitleggen waarom dat niet op alle platformen eenvoudig werkt (maar met interrupts lukt het wel)