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:
start timer / reset 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:
timer loopt af
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:
Toestand 1: lamp is uit
Toestand 2: lamp is aan

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
de timer loopt af
de timer resetten
de timer uitzetten
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.000Een 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.000De 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:
wat events op de microbit zijn
hoe die soms (hotelschakelaar voorbeeld) gebruikt kunnen worden om eenvoudige event-driven code te schrijven
misschien iets uitleggen waarom dat niet op alle platformen eenvoudig werkt (maar met interrupts lukt het wel)