Mail to Code: Tutorial

Lernt, wie man den Code für Rechenknechte schreibt.

English version English Version

if Bedingung

Bedingte Codeausführung

Das if-Statement dient dazu, Programmteile nur dann auszuführen, wenn eine gegebene Bedingung erfüllt ("True") ist. Als einfachstes Beispiel wird eine LED nur dann eingeschaltet, wenn ein GPIO im Modus "Eingang" den Wert "1"zurück gibt, was "True" entspricht. Das entsprechende Codebeispiel sieht so aus:

1
2
3
4
5
6
7
8
9
10
void setup() {
  pinMode(13, OUTPUT); // Set pin 13 to output
  pinMode(7, INPUT_PULLUP); // Set pin 7 to input
}
 
void loop() {
  if ( !digitalRead(7) ){ // is switch closed?
    digitalWrite(13, HIGH);
  }
}
    
Für dieses Programm muss ein Schalter swischen GPIO 7 und Masse, sowie eine LED mit einem Reihenwiderstand zwischen GPIO 13 und Masse angeschlossen sein. Bedenkt, dass der interne Pull-Up Widerstand am Pin des Schalters aktiviert ist. Somit liefert digitalRead() als Rückgabewert eine "1", wenn der Schalter OFFEN ist und eine "0", wenn der Schalter geschlossen wurde.
Bei nicht betätigtem Schalter liefert digitalRead(7) eine "1" (True) als Rückgabewert. Da in der Bedingung allerdings !digitalWrite(7) abgefragt wird, wandelt das Programm den Rückgabewert "1" in "0" (False) um. Der Programmteil in dem if{} Block wird also nicht ausgeführt.
Wird der Schalter geschlossen, so liefert digitalWrite(7) als Rückgabewert "0", die durch den ! (NICHT) Operator in eine "1" gewandelt wird. Die Bedingung !digitalRead(7) liefert jetzt "True" als Rückgabewert, womit die Anweisung in dem if{} Block ausgeführt wird. Die LED beginnt zu leuchten.
Die "if" Funktion prüft also, ob die Funktion digitalRead(7) den Wert "0" zurückgibt. Die (unnötig) lange Schreibweise lautet:
if ( digitalRead(7) == 0 )
Programmierer lieben's kurz, verwenden daher meist lieber:
if ( !digitelWrite(7) )
Beide Versionen können verwendet werden und führen zu dem selben Verhalten des Programms.
Wird der Schalter wieder losgelassen (geöffnet), so bleibt die LED eingeschaltet. Wir müssen also eine zweite Bedingung im Programm definieren, die dafür sorgt, dass die LED bei geöffnetem Schalter wieder ausgeschaltet wird:

1
2
3
4
5
6
7
8
9
10
11
12
13
void setup() {
  pinMode(13, OUTPUT); // Set pin 13 to output
  pinMode(7, INPUT_PULLUP); // Set pin 7 to input
}
 
void loop() {
  if ( !digitalRead(7) ){ // is switch closed?
    digitalWrite(13, HIGH);
  }
  if(digitalRead(7){ // Is switch open?
    digitalWrite(13, LOW);
  }
}
    
In der zweiten Bedingung wird der Rückgabewert von digitalRead(7) nicht invertiert. Ist der Schalter also geöffnet, so wird eine "1" zurückgegeben und die LED ausgeschaltet.

else

Die "if" Bedingung kann mit einer "else" Bedingung kombiniert werden. Der "else" Block muss direkt auf den "if" Block folgen und wird immer dann ausgeführt, wenn die "if" Bedingung nicht erfüllt ist. Das Beispiel kann also auch wie folgt geschrieben werden:

1
2
3
4
5
6
7
8
9
10
11
12
13
void setup() {
  pinMode(13, OUTPUT); // Set pin 13 to output
  pinMode(7, INPUT_PULLUP); // Set pin 7 to input
}
 
void loop() {
  if( !digitalRead(7) ){ // is switch closed?
    digitalWrite(13, HIGH);
  }
  else{ // Is switch open?
    digitalWrite(13, LOW);
  }
}
    
Am Verhalten der LED ändert sich nichts. Diese leuchtet nur, wenn der Schalter geschlossen ist.

else if

Betrachten wir ein Beispiel mit zwei Schaltern:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int LED_pause = 0;
 
void setup() {
  pinMode(13, OUTPUT); // Set pin 13 to output
  pinMode(6, INPUT_PULLUP); // Set pin 6 to input
  pinMode(7, INPUT_PULLUP); // Set pin 7 to input
}
 
void loop() {
  if ( !digitalRead(7) ){
    LED_pause = 500;
  }
  else if ( !digitalRead(6) ){
    LED_pause = 1000;
  }
  else{
    LED_pause = 50;
  }
 
  digitalWrite(13, HIGH);
  delay(LED_pause);
  digitalWrite(13, LOW);
  delay(LED_pause);
}
    
Wird das Programm ausgeführt, so blinkt die LED sehr schnell, wenn beide Schalter geöffnet sind. Wird der Schalter an GPIO 7 geschlossen, so blinkt die LED langsamer und wenn der Schalter an GPIO 6 geschlossen wird, ganz langsam.
Werden beide Schalter geschlossen, so ist die Blinkfrequenz gleich der, als wenn nur Schalter 7 geschlossen ist, obwohl doch auch die else if Bedingung erfüllt ist und somit LED_pause auf 1000 gesetzt werden sollte. Der if, else if, else Block bricht komplett ab, sobald eine der Bedingungen erfüllt wurde. Alle darunter stehenden Bedingungen werden nicht mehr geprüft und daher auch nicht ausgeführt!

Verschachtelte "if" Statements

Innerhalb des Blocks eines "if" Statements dürfen sich weitere "if" befinden:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
int LED_pause = 0;
 
void setup() {
  pinMode(13, OUTPUT); // Set pin 13 to output
  pinMode(6, INPUT_PULLUP); // Set pin 6 to input
  pinMode(7, INPUT_PULLUP); // Set pin 7 to input
}
 
void loop() {
 
  if ( !digitalRead(6) ){// Switch 6 is closed
      if ( digitalRead(7) ){// Switch 7 is open
          LED_pause = 500;
      }
  }
 
  if ( !digitalRead(7) ){// Switch 7 is closed
      if ( digitalRead(6) ){// Switch 6 is open
          LED_pause = 1000;
      }
  }
 
  if ( !digitalRead(6) ){// Switch 6 is closed
      if ( !digitalRead(7) ){// Switch 7 is closed
          LED_pause = 100;
      }
  }
 
  if ( digitalRead(6) ){// Switch 6 is open
      if ( digitalRead(7) ){// Switch 7 is open
          LED_pause = 50;
      }
  }
 
  digitalWrite(13, HIGH);
  delay(LED_pause);
  digitalWrite(13, LOW);
  delay(LED_pause);
}
    

Durch die Verschachtelung der "if" Statements, können auch Schalterkombintaionen zuverkässig abgefragt werden.

Bedingungen kombinieren

Im Kapitel zur booleschen Algebra ist zu sehen, wie mehrere Bedingungen zu einem Gesamtergebnis von "True" oder "False" kombiniert werden können. Das Beispiel mit den beiden Schaltern kann so abgeändert werden, dass auch Schalterkombinationen abgefragt werden, ohne dass verschachtelte "if" Statements benötigt werden:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int LED_pause = 0;
 
void setup() {
  pinMode(13, OUTPUT); // Set pin 13 to output
  pinMode(6, INPUT_PULLUP); // Set pin 6 to input
  pinMode(7, INPUT_PULLUP); // Set pin 7 to input
}
 
void loop() {
  if ( digitalRead(6) && !digitalRead(7) ){ // Only switch 7 closed
    LED_pause = 500;
  }
  else if ( !digitalRead(6)  && digitalRead(7) ){ // Only switch 6 closed
    LED_pause = 1000;
  }
  else if ( !digitalRead(6)  && !digitalRead(7) ){ // Switch 6 AND 7 closed
    LED_pause = 100;
  }
  else{ // None of the above, both switches open
    LED_pause = 50;
  }
 
  digitalWrite(13, HIGH);
  delay(LED_pause);
  digitalWrite(13, LOW);
  delay(LED_pause);
}
    
Damit erhalten wir 4 Kombinationsmöglichkeiten, um die Blinkfrequenz der LED mit den beiden Schaltern zu beeinflussen.
Es können beliebig viele "else if" Statements zwischen "if" und "else" eingefügt werden.

Berechnungen in "if" Statements

Für die "if" Funktion gelten alle Werte verschieden von "0" als "True" und der Anweisungsblock wird ausgeführt. Somit können wir eine LED je nach erfüllter Bedingung mehrfach blinken lassen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int blink_number = 0;
 
void setup() {
  pinMode(13, OUTPUT); // Set pin 13 to output
  pinMode(6, INPUT_PULLUP); // Set pin 6 to input
  pinMode(7, INPUT_PULLUP); // Set pin 7 to input
}
 
void loop() {
 
  // Only switch 7 closed and blink_nummer is 0
  if ( digitalRead(6) && !digitalRead(7) && !blink_number ){
    blink_number = 3;
  }
 
  // Only switch 6 closed and blink_nummer is 0
  if ( !digitalRead(6)  && digitalRead(7)  && !blink_number ){
    blink_number = 5;
  }
 
  if ( blink_number ) { // blink_number NOT 0
    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
    blink_number--; // decrease by 1
  }
 
}
    
In diesem Programm wird die Variable blink_number in Abhängigkeit davon, welcher Schalter kurz geschlossen wurde, auf einen Wert höher als 0 gesetzt. Ist blink_number von 0 verschieden, so wird die LED einmal blinken gelassen und der Wert von blink_number um 1 verringert. Ist blink_number schießlich 0, so liefert das unterste "if" Statement "False" und die LED blinkt nicht mehr weiter.
Das Beispiel funktioniert auch, wenn blink_number auf einen Wert kleiner als 0 gesetzt und nach jedem Blinken um 1 erhöht wird:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int blink_number = 0;
 
void setup() {
  pinMode(13, OUTPUT); // Set pin 13 to output
  pinMode(6, INPUT_PULLUP); // Set pin 6 to input
  pinMode(7, INPUT_PULLUP); // Set pin 7 to input
}
 
void loop() {
 
  // Only switch 7 closed and blink_nummer is 0
  if ( digitalRead(6) && !digitalRead(7) && !blink_number ){
    blink_number = -3;
  }
 
  // Only switch 6 closed and blink_nummer is 0
  if ( !digitalRead(6)  && digitalRead(7)  && !blink_number ){
    blink_number = -5;
  }
 
  if ( blink_number ) { // blink_number NOT 0
    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
    blink_number++; // decrease by 1
  }
}
    

Wie bereits zuvor geschrieben, der Wert "0" entspricht "False", jeder von "0" verschiedene Wert entspricht "True".





Du findest diese Seite klasse?

Gummibärchen als Nervennahrung beim Programmieren und der Betrieb dieses Servers verschlingen mein Geld.
Helft mit einer Motivationsspritze, dieses Projekt am Laufen zu halten.

Klick hier oder scan den QR Code, um eine Spende zu überweisen.



Vielen Dank!

Fragen? Anregungen? Fehler gefunden?
Kontakt per E-mail: question@h1i1.de