Iteratie
Bij een iteratie (herhaling) wordt een deel van het programma meerdere keren uitgevoerd. Je hebt er een specifiek stukje code voor nodig, een while() of een for() functie.
- Bij while() wordt het programma gepauzeerd en de code van de while()-lus herhaalt zolang de voorwaarde waar is.
- Bij for() wordt de code een vast aantal keren herhaald, bijvoorbeeld 10 keer, en dan stop je.
Kijk nog eens naar de basistructuur van een Arduino sketch. De loop() fase is eigenlijk een verborgen while()-lus. Die wordt oneindig keren herhaald.
Lees de documentatie van de while-functie.
De functie heeft 1 parameter namelijk de voorwaarde.
- De actie zoveel keer uitgevoerd zolang de voorwaarde voldaan is.
- Indien er niet aan de voorwaarde voldaan is, dan slaat de computer de while-functie over.
while(voorwaarde) {
proces;
}
- voorwaarde: hier ga je na hoelang je je proces zal herhalen
- proces: wat er moet gebeuren als de voorwaarde voldaan is.
Omdat de for-lus iets complexer is wordt die behandeld in module 6.
Opdracht 1
Maak de schakeling met een drukknop:
Kopieer beide codes in een nieuwe sketch, onderzoek het verschil tussen een if...else() en een while() functie. Let op wat er gebeurt met de tijd wanneer je de drukknop indrukt. Open hiervoor de serial monitor.
Drukknop met if...else() en timer
// Fase 1: declaratie en initialisatie fase (wordt eenmalig doorlopen bij opstarten)
const int knopPin = 2; // Drukknop aangesloten op digitale pin 2
int knopStatus = 0; // Variabele die de status van de drukknop opslaat
long timer = 0; // Variabele om de tijd in op te slaan, datatype long omdat dit snel grote getallen worden
// Fase 2: setup fase (wordt eenmalig doorlopen bij opstarten)
void setup() {
pinMode(knopPin, INPUT); // Zet knopPin als input
pinMode(LED_BUILTIN, OUTPUT); // Zet de interne led, pin 13 als uitgang
Serial.begin(9600); // Start de seriële communicatie
}
// Fase 3: loop fase (wordt blijvend herhaald)
void loop() {
knopStatus = digitalRead(knopPin); // Lees de status van de knop en stockeer in knopStatus
if (knopStatus) == HIGH) { // Indien de drukknop is ingedrukt
digitalWrite(LED_BUILTIN, HIGH); // Zet de led aan
} else{
digitalWrite(LED_BUILTIN, LOW); // Zoniet, zet led uit
}
timer= millis (); // Start tijd met de functie millis() en stockeer in timer
Serial.println (timer); // Print de verstreken tijd in ms
}
Drukknop met while() en timer
// Fase 1: declaratie en initialisatie fase (wordt eenmalig doorlopen bij opstarten)
const int knopPin = 2; // Drukknop aangesloten op digitale pin 2
int knopStatus = 0; // Variabele die de status van de drukknop opslaat
long timer = 0; // Variabele om de tijd in op te slaan, datatype long omdat dit snel grote getallen worden
// Fase 2: setup fase (wordt eenmalig doorlopen bij opstarten)
void setup() {
pinMode(knopPin, INPUT); // Zet knopPin als input
pinMode(LED_BUILTIN, OUTPUT); // Zet de interne led, pin 13 als uitgang
Serial.begin(9600); // Start de seriële communicatie
}
// Fase 3: loop fase (wordt blijvend herhaald)
void loop() {
while (digitalRead(knopPin) == HIGH) { // Wanneer de drukknop is ingedrukt
digitalWrite(LED_BUILTIN, HIGH); // Zet de led aan
}
timer= millis (); // Start tijd met de functie millis() en stockeer in timer
Serial.println (timer); // Print de verstreken tijd in ms
digitalWrite (LED_BUILTIN, LOW); // Indien de knop niet is ingedruk, led uit
}
millis()
In bovenstaande oefening gebruiken we een nieuwe functie om tijd te registreren. Lees de documentatie van de functie millis(). De functie heeft geen extra info (parameters) nodig.
Herinner je opdracht 3 bij de functie delay() waarbij de vraag was:
Kan je 2 leds laten knipperen met de delay() functie waarbij LED 1 elke 700ms pinkt en LED 2 elke 1200ms pinkt?
Met een delay() functie lukt dat niet, maar met een millis() functie kan dat wel.
De oplossing vind je bij de Arduino examples. Ga naar File > Examples > 02.Digital > BlinkWithoutDelay.
De while-lus is een voorwaardelijke herhaling.
Bij de voorwaarde geef je aan welke voorwaarde moet voldaan zijn om de instructie binnen de while-lus uit te voeren. Meestal zal dit een bepaalde tijdspanne zijn.
Als er niet meer aan de voorwaarde wordt voldaan, zal er verder gegaan worden met de instructie na de while-lus.