For-lus
Een for-lus is een manier om een stuk code een bepaald aantal keer te herhalen. Dit aantal geef je op bij het begin van de lus. Een for-lus bestaat uit drie delen, gescheiden door puntkomma's:
- De initialisatie: hier geef je aan met welke variabele en waarde de lus moet starten. Je leest dit als: "start met i gelijk aan 0".
- De voorwaarde: hier geef je aan hoe lang de lus herhaald moet worden. Je leest dit als: "zolang i kleiner is dan 3".
- De stap: hier geef je aan met welke waarde de variabele moet vermeerderd of verminderd worden na het uitvoeren van de code binnen de lus. Je leest dit als: "verhoog i met 1 na elke herhaling".
for (int i = 0; i < 3; i++) {
Serial.println(i);
}Het resultaat van deze for lus is volgende tekst in de seriële monitor:
0
1
2i++ is een verkorte manier om i = i + 1 te schrijven. Dit betekent dat de waarde van i met 1 verhoogd wordt na elke herhaling van de lus.
In dit voorbeeld wordt de waarde van i geïnitialiseerd op 0. Je maakt deze variabele nieuw aan, waardoor i voorafgegaan moet worden door int. De lus zal blijven herhalen zolang i kleiner is dan 3. Na elke herhaling wordt de waarde van i met 1 verhoogd.
Het resultaat van dit voorbeeld is dat de getallen 0, 1, 2 geprint worden naar de seriële monitor. Merk op dat de lus stopt als i gelijk is aan 3, omdat de voorwaarde i < 3 dan niet meer waar is. 3 wordt dus niet meer geprint.
Hieronder volgt het stappenplan van wat er in dit voorbeeld gebeurt:
| Code | Uitleg |
|---|---|
int i = 0; | i wordt geïnitialiseerd op 0. |
i < 3; | De voorwaarde wordt gecontroleerd. Omdat i gelijk is aan 0, is de voorwaarde waar. |
Serial.println(i); | De waarde van i, 0, wordt geprint naar de seriële monitor. |
i++; | i wordt verhoogd met 1, i is nu gelijk aan 1. |
i < 3; | De voorwaarde wordt gecontroleerd. Omdat i gelijk is aan 1, is de voorwaarde waar. |
Serial.println(i); | De waarde van i, 1, wordt geprint naar de seriële monitor. |
i++; | i wordt verhoogd met 1, i is nu gelijk aan 2. |
i < 3; | De voorwaarde wordt gecontroleerd. Omdat i gelijk is aan 2, is de voorwaarde waar. |
Serial.println(i); | De waarde van i, 2, wordt geprint naar de seriële monitor. |
i++; | i wordt verhoogd met 1, i is nu gelijk aan 3. |
i < 3; | De voorwaarde wordt gecontroleerd. Omdat i gelijk is aan 3, is de voorwaarde niet waar. De lus stopt. |
Voorbeelden
Aftelklok
for (int sec = 3; sec > 0; sec--) {
Serial.println(sec);
delay(1000);
}
Serial.println("Start!");Resultaat:
3
2
1
Start!Zelfmachten
Zelfmachten - een twijfelachige Nederlandse vertaling van self powers - zijn getallen die tot zichzelf verheven worden. Bijvoorbeeld, 33 is gelijk aan 3 * 3 * 3 = 27. In Arduino kan je een macht berekenen met de functie pow(basis, exponent).
for (int i = 1; i <= 5; i++) {
Serial.print(i);
Serial.print("^");
Serial.print(i);
Serial.print(" = ");
Serial.println(pow(i, i));
}Resultaat:
1^1 = 1
2^2 = 4
3^3 = 27
4^4 = 256
5^5 = 3125Tip
Serial.print() en Serial.println() verwachten een String of een getal als parameter. Beide tegelijk doorgeven kan niet, maar je kan wel getallen omzetten naar Strings met de functie String(). Strings kan je vervolgens met de +-operator aan elkaar plakken. Zo kan je alles in één keer printen:
for (int i = 1; i <= 5; i++) {
Serial.println(String(i) + "^" + String(i) + " = " + String(pow(i, i)));
}Range-based for-lus
Een range-based for-lus is een speciale vorm van de for-lus die je kunt gebruiken om door alle elementen van een Array te itereren zonder dat je een indexvariabele hoeft te definiëren. Dit maakt de code vaak eenvoudiger en leesbaarder.
De syntax van een range-based for-lus is als volgt:
for (type item : arrayNaam) {
// code om item te gebruiken
}Je leest deze lus als: "voor elk element item in de Array arrayNaam, voer de volgende code uit".
int Leds[] = {2, 3, 4, 5, 6};
void setup() {
for(int led : Leds) {
pinMode(led, OUTPUT);
}
}Dit is eenvoudiger dan - maar heeft hetzelfde resultaat als - de traditionele for-lus met een indexvariabele:
int Leds[] = {2, 3, 4, 5, 6};
void setup() {
for(int i = 0; i < 5; i++) {
pinMode(Leds[i], OUTPUT);
}
}Merk op dat het in de range-based for-lus niet nodig is om de grootte van de Array te kennen of te berekenen. Je hoeft de 5 niet naar 6 te veranderen als je een element toevoegt aan de Leds Array. De lus zal namelijk automatisch door alle elementen van de Array itereren.