Steuerung / Verzweigung

sonst falls

sonst-falls-Block

Block

Der sonst falls Block kann als Erweiterung des falls Blocks gesehen werden. Er kann nur direkt im Anschluss an einen zuvor gesetzten falls oder sonst falls Block gesetzt werden. Die Positionierung unnter anderen Blöcken ist in ArduBlock zwar grundsätzlich möglich, jedoch wird der Compiler der Arduino IDE hier einen Fehler melden und den Code nicht auf den Microcontroller laden können.
Der sonst falls Block funktioniert im Prinzip genau wie der falls Block. Daher ist es hilfreich sich, falls noch nicht geschehen, zuerst mit diesem auseinander zu setzen. Auch der sonst falls Block hat eine Bedingung, die im teste Parameter vorgegeben werden kann und die entweder wahr (true) oder falsch (false) sein kann. Wenn die Bedingung wahr ist, dann werden Befehle, die im dann Feld eingetragen wurden ausgeführt, wenn die Bedingung jedoch falsch ist werden diese Befehle übersprungen.

Es können beliebig viele sonst falls Blöcke unter einen falls Block gehängt werden. Die Blöcke werden dann von oben nach unten abgearbeitet. Wenn eine Bedingung nicht erfüllt ist, dann wird die nächste Bedingung getestet und so weiter.

Achtung: Wenn eine Bedingung erfüllt ist, dann werden die nachfolgend angehängten sonst falls Blöcke übersprungen. Aus einer Kette eines falls und einem oder mehreren sonst falls Blöcken kann immer nur höchstens ein dann ausgeführt werden.

teste

In den teste Parameter wird eine Bedingung eingesetzt. Diese kann nur zwei mögliche Zustände haben. Entweder die Bedingung ist wahr (true) oder falsch (false). Es kann ein digitaler Eingang abgefragt, an dem entweder ein Signal anliegt, dann ist dieser wahr und der Code wird ausgeführt oder wenn kein Signal anliegt und die Bedingung nicht erfüllt ist der Code dann eben übersprungen wird.

Es können auch zwei Variablen oder eine Variable mit einem festen Wert verglichen werden. Zum Beispiel, dass die Temperatur eines Sensors über 28°C liegen muss um einen Pin umzuschalten, der dann einen Ventilator steuert. Weiter unten wird dies in einem Beispiel erklärt.

dann

In den dann Abschnitt kann eine Folge von weiteren Blöcken zu Anweisung von Befehlen eingefügt werden. Dies kann zum Beispiel ein digitalWrite Block sein, der einen Pin HIGH oder LOW schält oder eine Variable, die gesetzt werden soll oder sogar weitere falls Blöcke, wobei sich hier auch die Verwendung eines sonst falls Blocks anbietet.

Beispiel

Für dieses Beispiel ist es hilfreich den analogWrite Block und den sonst Block bereits zu kennen.
Nun soll das Beispiel aus der falls Block-Referenz wieder heran gezogen werden. Wir gehen davon aus, dass eine Variable namens temperatur angelegt wurde, die die aktuelle Temperatur in °C angibt. Es soll ein Ventilator über die Temperatur gesteuert werden.

Der Pin 3 steuert den Ventilator. Dieser soll als analoger Ausgang verwendet werden. Wenn der Pin 3 auf einen Wert von 50 gesetzt wird läuft der Ventilator auf der Stufe 1, wenn er auf 100 gesetzt wird dann läuft der Ventilator auf der Stufe 2. Wenn der Ausgang auf 0 gesetzt wird ist der Ventilator aus.
Nun hat der Ventilator drei Zustände. Stufe 1, Stufe 2 und aus. Bei einer Temperatur von über 28°C soll der Ventilator auf der Stufe 2 laufen. Bei einer Temperatur von 24°C bis einschließlich 28°C soll der Ventilator auf der Stufe 1 laufen und bei einer Temperatur von unter 24°C soll er aus sein.
Für die Zweite Bedingung wird ein sonst falls Block verwendet.
So könnte das Beispiel in ArduBlock aussehen:

elseif-besipiel

Code

Im Code für den Arduino wird der Baustein mit der Funktion else if(teste){dann} umgesetzt. ("else if" ist Englisch und heißt übersetzt "sonst wenn" oder "sonst falls"). Wo hier teste eingetragen wurde müsste dann natürlich die zu überprüfende Bedingung eingetragen werden. Wo hier dann eingetragen ist müssen dann natürlich die auszuführenden Befehle eingetragen werden.

Im Code würde das Beispiel dann folgendermaßen aussehen:

if (( temperatur > 28 )) {
  analogWrite(3 , 100);
}
else if(( ( temperatur <= 28 ) && ( temperatur >= 24 ) )) {
  analogWrite(3 , 50);
}
else {
  analogWrite(3 , 0);
}