Deze video bestaat uit twee delen:
deel 1:
deel 2:
In deze tweede video onstaat een probleem met ‘_init.h’. Dat probleem zouden jullie niet meer moeten hebben als je de init.h file gebruikt die bij video 4 genoemd wordt. Zie hier.
Vraag 14.1: een vingeroefening
Programmeer in Arduino een if-statement. Nog even niet met sensoren en output-pinnen, gewoon een if-statement dat controleert of een variabele groter is dan 100, en afhankelijk daarvan iets naar de Serial
uitprint.
Zorg er wel voor dat er ook een else-tak is die iets anders uitprint. Speel even met de waarde van de variabele om het if-statement verschillende dingen te laten doen.
Vraag 14.2: iets slimmer wachten
Let op: Lees zeker even de tips op het einde van deze post!
De delay-functie in Arduino wacht altijd een vaste tijd. Wat nu als je wilt wachten tot er bijvoorbeeld een knop is ingedrukt, maar verder wil je niets doen. Dan is het prima om een while-loop te gebruiken waarin wel een voorwaarde, maar verder helemaal geen code zit! Bijvoorbeeld:
while( analogRead(SLIDER1_PIN) < 512 ) { // niks tussen accolades, } // maar de herhaling // vindt wel plaats (tot // voorwaarde niet meer // waar is)
Probeer met z’n ‘niksige’ while-loop een programma te maken dat een ledje aanzet zodra er een knop ingedrukt wordt.
Maak het programma zo dat er een functie met de naam ‘wachtOpKnop
‘ inzit.
Voor de bonus: maak een versie waarbij de knop schakelt tussen twee lichtjes: 1 druk op de knop en de linker-LED brandt, nog een druk en de linker-LED gaat uit, en de rechter-LED gaat aan. Weer een druk op de knop en de boel draait weer om.
De tips aan het einde van deze post:
- Vergeet niet dat in onze (europese) versie van de DangerShield de knoppen tegen-intuitieve waarden teruggeven: false als de knop ingedrukt is; true als de knop losgelaten is. (In de amerikaanse versie, die wij niet gebruiken, is dit omgekeerd.)
- Een lastigheid die hoort bij dit soort electronica had is dender: In de paar milliseconden vlak nadat de onderdelen van de knop contact met elkaar maken (of juist elkaar weer loslaten), varieert de uitleeswaarde van de knop heel snel tussen 0 en 1, totdat-ie even later stabiel op z’n vaste waarde blijft hangen. Dit is een bekend natuurkundig verschijnsel, wat we met software moeten oplossen.
Een makkelijke en gebruikelijke manier om te dealen met die dender is om een korte delay in te voeren:- Eerst wacht je met een (lege) while-loop op het eerste signaal dat de knop naar beneden (of naar boven) gaat.
- Dan voer je een delay van b.v. 150 milliseconden (of minder) uit. In die periode kan de input van de knop varieren (denderen) zonder dat je programma er last van heeft.
- Daarna pas zet je de LED aan of uit of doe je iets anders spectaculairs.
Deze methode met delay is niet fool-proof, het kan nog wel een beetje mis gaan als je delay-tijd te kort, of weer wat te lang is. Maar voor nu is dat nu niet erg.
Vraag 14.3: tellen en herhalen
Kun je nu je programma van opdracht 4.2 zó aanpassen dat je steeds 5 keer de knop moet indrukken voordat er lichtjes aan- of uitgaan?
- Doe dit niet door code vijf keer te herhalen.
- Gebruik een teller-variabele die bijhoudt hoe vaak de knop is ingedrukt.
- Gebruik die variabele in een while-loop die stopt wanneer de teller 5 wordt.
- Als het goed is heb je het wachten op de knop in een functie staan. Je kunt deze nieuwe functionaliteit op twee manieren indelen in functies. Kies zelf maar:
- Maak een nieuwe functie ‘
wachtOpKnopXKeer(int x)
‘ die zelf weer de functie ‘wachtOpKnop()
‘ aanroept (in de while-loop). Het is cool als deze nieuwe functie een parameter gebruikt zodat-ie flexibel is in het aantal keer dat er gewacht moet worden. - Verwerk de code om meerdere keren te wachten in de bestaande functie ‘
wachtOpKnop()
‘. In dat geval zul je uitkomen op een while-loop binnen een while-loop. Zoals je al zag bij if-statements zijn dit soort ‘constructies-binnen-een-constructies’ in programmeren heel gebruikelijk, dus het is goed om te oefenen.
Wees wel zo goed om de naam van de functie nu aan te passen zodat-ie beter zegt wat-ie doet.
- Maak een nieuwe functie ‘
Vraag 14.4 en 14.5: overgang naar volgende opdracht: je eigen delay()
We gaan verder met verschillende vormen van wachten ;-).
Kun je, in de documentatie van Arduino, achterhalen wat de functie ‘millis()’ oplevert?
Gebruik de functie millis(), samen met de ervaring in het maken van wacht-code uit de vorige opdrachten, om een eigen versie van delay() te maken. Omdat de naam delay al bestaat, zul je een eigen naam moeten bedenken. Maar hij moet werken zoals delay: 1 parameter die aangeeft hoeveel milliseconden er niks gedaan moet worden, en dan de aangegeven tijd ook echt niks doen. De functie hoeft geen returnwaarde op te leveren.
Voor de bonus: kun je een combinatie maken: een delay die een aantal milliseconden wacht, maar ook te onderbreken is met een knop? Dus als ik tijdens het wachtinterval op de knop druk, dan stopt de delay ook.
Vraag 14.6: Je kunt ‘m uitzetten, maar hij zet zichzelf weer aan.
Maak nu een Arduino programmaatje dat:
- 3 seconden na het opstarten ‘het licht aandoet’ (een LEDtje dus).
- Als het licht aan is, kun je ‘m uitzetten met een knopje (niet de reset-knop :-)).
- Als je op dat knopje druk voordat het licht aan is, hoor je een korte ‘bzzzt’ om aan te geven dat die knop in de ‘uit-fase’ niet gebruikt kan worden.
- Zodra het lichtje is uitgezet, treedt de 3-seconden periode weer in werking. Dus drie seconden nadat het licht uitgezet is, gaat-ie weer aan. (Gebruik hiervoor maar gewoon het feit dat de loop() ‘loop-t’).
tip: In je init.h file staat de code voor de functie ds_init. Daaruit kunt je de code kopieren om de buzzer even te laten buzzen.