De loop die je gebruikt is eigenlijk al een while lus maar dan eentje die altijd blijft doorgaan. Een while lus dient ervoor om iets uit te voeren zolang een bepaalde voorwaarde waar is.
Enkele voorbeelden hiervan zijn.
– Laat de pomp het vat vullen zolang het NIET vol is of omgekeerd laat de pomp het vat leegpompen zolang het vat NIET leeg is.
– Zolang de noodstop stroom doorlaat moet de machine in werking zijn.
– Zolang …
Testen we het verhaal van de noodstop uit en is de machine een machine die om de beurt een led aanschakelt dan krijg je onderstaand stukje code.
ToestandSWITCH = digitalRead(SWITCH);
while (ToestandSWITCH == HIGH){
ToestandSWITCH = digitalRead(SWITCH);
digitalWrite(LEDG2,HIGH);
digitalWrite(LEDR2,LOW);
delay(200); // 200 ms niets doen
digitalWrite(LEDG2,LOW);
digitalWrite(LEDR2,HIGH);
delay(200);
}
Bij while heb je wel het nadeel dat als je iets wil uitvoeren als er een een bepaalde toestand voldaan is je vaak zowel voor de while lus als in de while lus die toestand moet controleren. In vele gevallen is daardoor de do while een betere keuze. Hierbij gaat eerst de actie uitgevoerd worden (ongeacht de vraag) en dan pas de vraag gesteld worden die beslist of de actie nogmaals uitgevoerd zal worden.
Hierdoor krijg je dat als de vraag meteen fout is vanaf aanvang er bij de while geen enkele keer iets zal uitgevoerd worden en bij de doe while de acties minimaal 1 keer uitgevoerd worden. Een voorbeeld hiervan is
bool ToestandSWITCH;
do {
ToestandSWITCH = digitalRead(SWITCH);
digitalWrite(LEDG2,HIGH);
digitalWrite(LEDR2,LOW);
delay(200);
digitalWrite(LEDG2,LOW);
digitalWrite(LEDR2,HIGH);
delay(200);
}
while (ToestandSWITCH == HIGH);
Als je deze code test lijkt het of er geen invloed is van de SWITCH, kan je dit verklaren ?
TIP : De code zit in loop() !
Beter is de do while te gebruiken om te wachten tot de knop een bepaalde toestand heeft. Zolang die toestand niet bereikt werd moet je de toestand lezen, vanaf de toestand bereikt wordt mag het programma verder gaan met uitvoeren.
bool ToestandSWITCH;
do {
ToestandSWITCH = digitalRead(SWITCH);
}
while (ToestandSWITCH == LOW);
digitalWrite(LEDG2,HIGH);
digitalWrite(LEDR2,LOW);
delay(200);
digitalWrite(LEDG2,LOW);
digitalWrite(LEDR2,HIGH);
delay(200);
Zoals je merkt lijkt het allemaal zeer erg op elkaar maar is de uitwerking toch allemaal anders, het is een kwestie van een aantal keren proberen en gewoon te raken aan de werking van de verschillende lussen. De beste tip die we kunnen geven is een programma stapje bij stapje op te bouwen. Werk je bijvoorbeeld met een startknop dan zorg je er eerst voor dat die werkt, dan dat er gewacht wordt op het indrukken en dan pas alle acties die moeten gebeuren als de knop werd ingedrukt. Op deze manier is het veel eenvoudiger om fouten op te sporen want de uitdaging is telkens een klein stukje code.
Meer While en Do While voorbeelden
De code die ervoor zorgt dat er gewacht wordt op het indrukken van de knop door middel van de DO WHILE en dat ervoor zorgt dat code continu zal herhalen zolang de sensor onder een waarde blijft door middel van de WHILE kan je hier downloaden.
Volgende les : herhaling van de belangrijkste code
Deze tutorial kan je gebruiken als referentie om een overzicht te bekomen van mogelijke code.