
01 Die Taste – einfacher digitaler INPUT
Ein Taster ist eine sehr einfache Komponente. Es besitzt nur zwei Zustände: geöffnet und geschlossen. Im geschlossenem Zustand verhält es sich wie ein Stück Draht und im geöffnet Zustand unterbricht es den Stromkreis. Jeder Taster kann in zwei Kategorien eingeteilt werden: momentan oder permanent.
Ein permanenter Taster verharrt im aktuellen Zustand, bis er wieder betätigt wird. In diesem Teil des Tutorials beschäftigen wir uns mit dem momentanen Taster. Bei diesem Taster fließt der Strom nur beim Drücken, beim Loslassen wird der Stromkreis wieder unterbrochen. Nach diesem Prinzip arbeitet die Computer-Tastatur. Es gibt auch Taster, die genau umgekehrt funktionieren: Sie unterbrechen den Stromkreis, wenn man sie betätigt.
Du hast bisher mit dem Befehl digitalWrite() Signale nach außen versendet. Diesmal wirst du einkommende Signale an einen Taster mit dem Befehl digitalRead() lesen. An dieser Stelle haben wir ein kleines Problem. Wenn wir den Zustand des Tasters einlesen, haben wir keine Rückmeldung vom Arduino. Das heißt, wir müssen zusätzlich zum Lesen des Tasters irgendeine Interaktion einbauen. Das Feedback kann jede Form annehmen – eine LED, Töne usw.
Jedoch brauchen wir dazu nicht unbedingt ein elektronisches Element. Als Feedback werden wir die serielle Schnittstelle aus dem letzten Kapitel benutzen. Jedes Mal, wenn wir den Taster drücken wird eine 1, ansonsten einen 0 auf dem seriellen Monitor ausgegeben. Übrigens werden wir in Zukunft neue Module mit dem Serial Monitor zunächst testen. Das ist eine gängige Vorgehensweise, um Fehlerquellen zu minimieren.
Der Sketch
//002b_taster_serial
int buttonPin = 2;
void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT);
}
void loop()
{
//initialisiere die Variable zustandTaster und speichere
//in ihr den Zustand des Tasters.
int buttonState = digitalRead(buttonPin);
//sende den Wert der Variable buttonState an die Serielle Schnittstelle
Serial.println(buttonState);
delay(1); //Pausiere kurz - aus Stabilitätsgründen.
}
Der Aufbau
Verbinde den Minus-Pin des Tasters mit dem GND-Pin des Arduinos. Mache das Gleiche mit dem Plus-Pin des Tasters mit dem 5V-Pin. Das S auf dem Taster steht für Signal, verbinde diesen mit dem Arduino-Pin 50.
Der Sketch im Detail
Zunächst speichern wir die Pinnummer (in dem der Taster eingesteckt ist) in die Integer-Variable buttonPin.
int buttonPin = 2;
Im void setup() teilen wir dem Arduino mit, dass wir die serielle Schnittstelle benutzen wollen, indem wir Serial.begin() aufrufen. Die Baudrate innerhalb der Klammer ist auf den Standardwert 9600 festgelegt.
void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT);
}
Den pinMode() Befehl kennst du schon aus dem LED-Sketch. Diesen benutzen wir, um dem Arduino zu signalisieren, dass wir den ausgewählten Pin als Ein- oder Ausgang benutzen wollen. Beim Taster benutzen wir das Argument INPUT, da es sich um ein eingehendes Signal handelt. Die Variable buttonPin enthält die Pinnummer 2, die wir schon oben definiert hatten.
Erinnern wir uns: Im LED-Sketch haben wir pinMode(ledPin, OUTPUT); benutzt, da wir Signale zur LED geschickt haben (OUTPUT = nach außen).
In der void loop() Funktion passiert allerlei interessantes. Wir benötigen hier eine zweite Variable buttonState. Der Grund? Wir brauchen sie, damit wir den Zustand des Tasters festhalten und an die serielle Schnittstelle weitergeben können. Auch hier initialisieren wir die Variable mit int für Ganzzahlen, geben ihm den Namen buttonState und weisen ihm mit einem Gleichheitszeichen= einen Wert zu, der von digitalRead() kommt.
int buttonState = digitalRead(buttonPin);
Der Befehl digitalRead() nimmt nur ein Argument auf. Innerhalb der Klammern wird der zu lesende Pin eingetragen. Es werden nur digitale Werte ausgegeben: HIGH oder LOW.
Der digitalRead() Befehl fragt kontinuierlich den Zustand des Pins ab und überträgt den Wert in unserem Beispiel direkt an die Variable buttonState. In buttonState wird je nach Tasterzustand eine 0 für nicht gedrückt oder eine 1 für gedrückt eingetragen.
int buttonState = digitalRead(buttonPin);
Da wir jetzt den Zustand in der Variable buttonState gespeichert haben, können wir sie mithilfe der Serial.println() Funktion an den Computer weiterleiten und am seriellen Monitor ausgeben. Die Variable buttonState wird innerhalb der Klammern platziert.
Serial.println(buttonState);
In der letzten Zeile wird das Programm mit delay(1); relativ kurz pausiert. In diesem Beispiel ist das ein Tausendstel einer Sekunde. Dies wird aus Stabilitätsgründen benötigt.
delay(1);
Das Problem mit delay()
Wir werden später sehen, dass der Einsatz von delay() Funktionen von Nachteil sein kann. Im oberen Beispiel wäre ein zu hoher Wert nicht hilfreich. Angenommen, wir benutzen 1000 Millisekunden (=1 Sekunde). Falls du genau in dieser Sekunde des Pausierens den Taster drückst, kann der Befehl digitalRead() diese Eingabe nicht lesen, weil das Programm pausiert. Das Betätigen der Taste wird nicht registriert.
Probiere dies selber aus, in dem du in den oberen Sketch 2000ms in delay() einträgst. Drücke den Taster und du wirst sehen, dass die LED nicht immer angehen wird.
Es gibt Wege, dieses Dilemma zu umgehen. Später mehr davon.
Aufgabe
Schicke einen Text-String
Schicke zusätzlich zum Zustand des Tasters noch ein Text an den seriellen Monitor. Immer, wenn die Taste gedrückt wird soll der Text “Taste gedrückt“ erscheinen. Und falls sie nicht gedrückt wird soll der Text “Taste nicht gedrückt“ zusehen sein. Hier kommt es an wo du den String positionierst.