LBotics.at

Zur Steuerung des Programmablaufs stehen auf dem KeplerBRAIN V4 Controller drei Taster zur Verfügung. Die Zustände dieser Taster können auf unterschiedliche Arten bestimmt werden. Entweder kann abgefragt werden, ob der Kontakt in einem Taster geschlossen (closed) ist, oder das Drücken eines Tasters (pressed) kann auch als nur ein Ereignis ausgewertet werden, auch wenn der Kontakt des Tasters während des Drückens längere Zeit geschlossen ist.

Die if-Abfrage

Eine if-Abfrage entscheidet über den weiteren Programmablauf. Nach dem Schlüsselwort if wird eine Bedingung angegeben, die darüber entscheidet, ob ein Programmcode ausgeführt werden soll oder nicht. Ist die Bedingung erfüllt, werden alle Anweisungen ausgeführt, die mit geschwungenen Klammern zusammengefasst sind.

if (Bedingung)
{
  Anweisung 1;
  Anweisung 2;
...
}

Soll nur eine einzige Anweisung ausgeführt werden, wenn die Bedingung erfüllt ist, so können die geschwungenen Klammern auch weggelassen werden.

if (Bedingung) Anweisung;

Weiter gibt es auch die Möglichkeit einen Block von Anweisungen festzulegen, die ausgeführt werden sollen, wenn die Bedingung nicht erfüllt ist. Diese stehen nach dem Schlüsselwort else.

if (Bedingung)
{
  Anweisung 1;
  Anweisung 2;
  ...
}
else
{
  Anweisung 1;
  Anweisung 2;
  ...
}

Sinngemäß können die geschwungenen Klammern auch entfallen, wenn nach dem Schlüsselwort else nur eine einzige Anweisung ausgeführt werden soll.

if (Bedingung) Anweisung;
else Anweisung;
Vergleichsoperatoren für Bedingungen

In einer Bedingung werden zwei oder mehrere Werte miteinander verglichen. Meist soll überprüft werden, ob eine Variable einen bestimmten Wert hat. Für diese Überprüfung können in den Bedingungen einer if-Abfrage folgende Operatoren verwendet werden:

if (a==1) {...} == ist gleich Hat die Variable a den Wert 1?
if (a!=1) {...}  !=  ungleich  Ist der Wert der Variable a ungleich 1?
if (a<4) {...}  kleiner  Ist der Wert der Variable a kleiner als 4?
if (a>20) {...}  größer  Ist der Wert der Variable a größer als 20?
if (a<=10) {...}  <=  kleiner gleich  Ist der Wert der Variable a kleiner gleich 10?
if (a>=25) {...}  >=  größer gleich  Ist der Wert der Variable a größer gleich 25?
  
Verknüpfungsoperatoren für Bedingungen

Sollen in einer Bedingung mehrere Bedingungen verknüpft werden, so gibt es dafür die beiden Operatoren && und || für das logische UND und das logische ODER.

Bei einer Verknüpfung mit && - dem logischen UND - ist die Gesamtbedingung erfüllt, wenn beide Bedingungen erfüllt sind.

Bei einer Verknüpfung mit || - dem logischen ODER - gilt die Gesamtbedingung dann als erfüllt, wenn entweder die eine, die andere oder beide Bedingungen erfüllt sind.

if ((a==1)&&(b!=2)) {...} Hat die Variable a den Wert 1 UND ist der Wert von b ungleich 2?
if ((a==1)||(b==1)) {...}  Hat die Variable a den Wert 1 ODER hat die Variable b den Wert 1?
 
Programmbeispiel 1 - Zustand eines Tasters

In diesem Beispiel soll die rote Leuchtdiode leuchten, während der linke Taster gedrückt ist und nicht leuchten, wenn der linke Taster nicht gedrückt ist.

#include "KeplerBRAIN_V4.h"
 
void setup()
{
KEPLERBRAIN_INIT();
}
 
void loop()
{
if (READ_BUTTON_CLOSED(B1)==1) WRITE_LED(L3,1);
else WRITE_LED(L3,0);
}
Erklärungen zu diesem Programmbeispiel

Zeile 10: if (READ_BUTTON_CLOSED(B1)==1)

Mit der Funktion READ_BUTTON_CLOSED(port) kann überprüft werden ob der elektrische Kontakt in einem Taster geschlossen ist oder nicht.

Mit dem Parameter port wählt man den gewünschten Taster aus: B1, B2, B3

Als Rückgabewert liefert diese Funktion die Werte 0 oder 1.

Programmbeispiel 2 - Drücken eines Tasters

In diesem Beispiel soll durch kurzes Drücken des Tasters 1 der Wert einer Variable verringert und durch Drücken von Taster 2 erhöht werden. Der aktuelle Wert der Variable wird auf dem Display angezeigt.

#include "KeplerBRAIN_V4.h"
 
uint8_t MeineZahl;
 
void setup()
{
KEPLERBRAIN_INIT();
WRITE_LCD_TEXT(1, 1, "Zahl:");
MeineZahl = 0;
}
 
void loop()
{
if (READ_BUTTON_PRESSED(B1)==1)
{
MeineZahl = MeineZahl - 1;
}
if (READ_BUTTON_PRESSED(B2)==1)
{
MeineZahl = MeineZahl + 1;
}
WRITE_LCD_INT(7, 1, String(MeineZahl));
}
Erklärungen zu diesem Programmbeispiel

Zeile 14: if (READ_BUTTON_PRESSED(B1)==1)

Im Gegensatz zur Funktion READ_BUTTON_CLOSED(port) die den aktuellen Zustand eines Tasters zurückliefert, kann mit dieser Funktion auf das einmalige Drücken eines Tasters reagiert werden. Wird diese Funktion mehrmals aufgerufen während der Kontakt in einem Taster geschlossen ist, so liefert diese Funktion nur beim ersten Aufruf den Wert 1 zurück. Alle weiteren Aufrufe liefern so lange den Wert 0 zurück bis der Taster wieder losgelassen wird.

Mit dem Parameter port wird der gewünschte Taster festgelegt: B1, B2, B3

Als Rückgabewert liefert diese Funktion die Werte 0 oder 1.

Unterschied zwischen CLOSED und PRESSED

Zur Veranschaulichung der unterschiedlichen Auswertung der Taster kann bei diesem Beispiel die Funktion READ_BUTTON_PRESSED() gegen die Funktion READ_BUTTON_CLOSED() ausgetauscht werden.

Man erkennt, dass es nicht möglich sein wird, den Taster so kurz zu drücken, dass der Wert der Variable MeineZahl nur um eins erhöht wird.

Prellen eines Schaltkontakts

Zusätzlich tritt beim Schließen des mechanischen Schaltkontakts in einem Taster ein Effekt auf, der als "Prellen" bezeichnet wird. Wird bei einem Taster zum Beispiel eine Feder auf einen Metallkontakt gedrückt, so gibt es zunächst mehrere unterbrochene Berührungen der beiden Kontakte bis dann ein ununterbrochener Kontakt besteht. Dieser Vorgang dauert zwar nur sehr kurz, dennoch wird von einem Mikrocontroller jedes einzelne Schließen des Kontakts erfasst und liefert somit mehrere Ereignisse beim Schließen des Kontakts in einem Taster.

Auch dieses "Prellen" eines Tasters wird mit der Funktion READ_BUTTON_PRESSED() abgefangen.