06|03 Eine LED mit einer while-Schleife regeln
Die while-Schleife beginnt mit dem while-Schlüsselwort, gefolgt von einem Testausdruck zwischen öffnenden und schließenden Klammern. Die öffnenden und schließenden Klammern markieren den Schleifenkörper. Eine while-Schleife führt einen Block-Code so lange aus, bis eine bestimmte Kondition erfüllt ist.
Spezifikationen
- Signalart: digital
- Spannung: 3,3V – 5V
- Pinabstand: 2,54mm
Was ist der Unterschied zur for-Schleife? Bei der for-Schleife ist die Wiederholungshäufigkeit bereits bekannt. Die while-Schleife können wir so konstruieren, dass die Wiederholung von mehreren Faktoren abhängt – die Anzahl der Wiederholungen also offen sein kann. Außerdem wird der Schleifenköper der for-Schleife immer ausgeführt – eine Eintrittskondition gibt es nicht.
####Bild
Der Sketch
Der folgende Sketch macht exakt das gleiche, wie die for-Schleife aus dem letzten Kapitel: Er blinkt 10 mal.
int i = 0;
void setup()
{
while(i < 10)
{
Serial-println(++i);
delay(500);
}
}
void loop()
{
//leer
}
Testausdruck im Schleifenkopf
Im Schleifenkopf der while-Schleife befindet sich ein Testausdruck, der bestimmt, ob die Anweisungen in der Schleife ausgeführt werden oder nicht. Hier kannst du alle Vergleichsoperatoren (>,<,=) einsetzen. Ist der Testausdruck wahr, werden die Schleifenanweisungen ausgeführt, ansonsten nicht. Im gegensatz zur for-Schleife kann jede gültige Variable aus dem Sketch verwendet werden. Die Variable i wurde außerhalb der while-Schleife definiert – muss aber mit einem Wert initialisiert werden. Sonst erhält sie einen Zufallswert.
int i = 0;
while(i < 10)
{
...
}
In der ersten Runde checkt der Schleifenkopf, ob i kleiner als 10 ist. Wenn das zutrifft ist die Kondition wahr und der Schleifenköper wird ausgeführt. Im Sketchbeispiel incrementiert ++i den Wert um 1 und sendet das Ergebnis an Serial.println(). Sobald i = 10 ist, wird die Schleife unterbrochen und das Programm geht weiter zur nächsten Zeile.
while(i < 10)
{
Serial-println(++i);
delay(500);
}
Lass uns sehen, was in den einzelnen Schleifen passiert:
1. Schleife: 1 < 10 >>> Ausdruck ist wahr, führe die Schleife weiter aus.
2. Schleife: 2 < 10 >>> Ausdruck ist wahr, führe die Schleife weiter aus.
3. Schleife: 3 < 10 >>> Ausdruck ist wahr, führe die Schleife weiter aus.
4. Schleife: 4 < 10 >>> Ausdruck ist wahr, führe die Schleife weiter aus.
5. Schleife: 5 < 10 >>> Ausdruck ist wahr, führe die Schleife weiter aus.
6. Schleife: 6 < 10 >>> Ausdruck ist wahr, führe die Schleife weiter aus.
7. Schleife: 7 < 10 >>> Ausdruck ist wahr, führe die Schleife weiter aus.
8. Schleife: 8 < 10 >>> Ausdruck ist wahr, führe die Schleife weiter aus.
9. Schleife: 9 < 10 >>> Ausdruck ist wahr, führe die Schleife weiter aus.
10. Schleife: 10 < 10 >>> Ausdruck ist falsch, führe die Schleife nicht weiter aus.
Aufgabe
Deine Aufgabe wird es sein mit der while-Schleife ein Sketch zu schreiben, der folgende Funktion erfüllen soll: Der Aufbau beinhaltet eine RGB-LED und ein Potentiometer. Sobald der Wert des Potentiometers über den Wert 512 steigt, soll die grüne LED blinken. Sinkt der Wert unter 512 erlischt die grüne LED und die rote LED leuchtet durchgehend. Versuche es zuerst selber, bevor du die untere Lösung dir anschaust.
Der Aufbau
####bild
Der Sketch
int potiPin = A0;
int ledRPin = 2;
int ledGPin = 3;
void setup()
{
Serial.begin(9600);
pinMode(ledRPin, OUTPUT);
pinMode(ledGPin, OUTPUT);
digitalWrite(ledGPin, LOW);
digitalWrite(ledGPin, LOW);
}
void loop()
{
while(analogRead(potiPin) > 512)
{
digitalWrite(ledRPin, LOW);
digitalWrite(ledGPin, HIGH);
delay(500);
digitalWrite(ledGPin, LOW);
delay(500);
}
digitalWrite(ledRPin, HIGH);
}
Im Detail
An dieser Stelle gehe ich nur auf die besonderen Zeilen ein. Schon im setup schalte ich die LEDs auf LOW. Für den weiteren Verlauf weiss ich somit, dass die LEDs ausgeschaltet sind.
void setup()
{
...
digitalWrite(ledGPin, LOW);
digitalWrite(ledGPin, LOW);
}
Solange der Potentiometer-Wert unter 512 bleibt, wird die while-Schleife ignoriert und die rote LED auf HIGH geschaltet. Fällt der Wert unter 512 wird die Schleife aufgerufen. Anstatt eine Variable zu benutzen, können wir analogRead() direkt innerhalb im Schleifenkopf platzieren (auf den Semicolon verzichten). Als erstes schalten wir im Schleifenkörper die rote LED aus. Danach wird die grüne LED solange ein- und ausgeschaltet bis der Potentiometer-Wert unter 512 fällt.
...
while(analogRead(potiPin) > 512)
{
digitalWrite(ledRPin, LOW);
digitalWrite(ledGPin, HIGH);
delay(500);
digitalWrite(ledGPin, LOW);
delay(500);
}
digitalWrite(ledRPin, HIGH);
...