Digitaler Input/Output
Unter digitalem Input/Output versteht man Schaltungen, welche lediglich zwei Zustände kennen: EIN oder AUS. Im Falle des Arduino entspricht der Zustand EIN dabei einer elektrischen Spannung von 5V und AUS einer Spannung von 0V. Je nachdem ob man diese Zustände einliesst oder ausgibt spricht man von Input oder Output. Am Arduino verwenden wir vor allem die Digitalen PINs (D0-D13) für digitale Schaltungen. Es können jedoch auch die Analogen PINs verwendet werden, falls noch mehr Ein- bzw. Ausgänge benötigt werden.
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
#define TASTER 7 // Taster an digitalPin 7 #define LED 13 // LED an digitalPin 13 void setup() { pinMode(TASTER, INPUT); // TasterPin als Input nutzen pinMode(LED, OUTPUT); // LEDPin als Output nutzen } void loop() { digitalWrite(LED, digitalRead(TASTER)); // LED anmachen, wenn Taster gedrückt } |
Debounce
Es kann passieren, dass der Befehl digitalRead() zu schnell hintereinander gelesen wird und wir deshalb mehrere “Pushs” erhalten. Dies kann vermieden werden, wenn wir ein sog. Debouncing hinzufügen. Diese arbeitet mit der Funktion millis() um sich den letzten Zeitpunkt des Drückens zu merken und ein kleine Verzögerung hinzuzufügen.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
#define BUTTON 2 // Taster an Pin 2 #define LED 13 // LED an Pin 13 int ledState = HIGH; // Aktueller Status der LED int buttonState; // Aktueller Status des Tasters int lastButtonState = LOW; // Der letzte Staus des Tasters long lastDebounceTime = 0; // Die letzte Zeit als der Taster gedrückt wurde long debounceDelay = 50; // Die Verzögerung des Tasters void setup() { pinMode(BUTTON, INPUT); pinMode(LED, OUTPUT); } void loop() { int reading = digitalRead(BUTTON); // Taster einlesen und in reading speichern if (reading != lastButtonState) // Vergleich ob der Status sich verändert hat { lastDebounceTime = millis(); // Speichern der Zeit } if ((millis() - lastDebounceTime) > debounceDelay) // Checken der vergangenen Zeit { buttonState = reading; // Zuweisen der Wertes } digitalWrite(LED, buttonState); // Die LED ein oder aus schalten lastButtonState = reading; // Speichert den aktuellen Status } |
Interner PullUp Widerstand
Bis jetzt haben wir einen extra 10kOhm Widerstand verwendet um die Spannung am PIN anzuheben wenn der Taster nicht gedrückt wurde. Der Microkontroller verfügt aber auch über eigene, interne Pullup Widerstände, die sich per Programmierung aktivieren lassen. Diese Methode funktioniert nur bei einer negativen Logik ist dann aber sehr komfortabel, da nur noch ein Taster und kein Widerstand benötigt wird. Denn internen PullUp aktiviert man, indem direkt nach dem Aufruf von pinMode() im setup() die Funktion digitalWrite(pin, HIGH) gerufen wird.
Code Block | ||
---|---|---|
| ||
#define TASTER 2 void setup() { pinMode(TASTER, INPUT); digitalWrite(TASTER, HIGH); } |
Aufgaben
1. Nutzt den Taster um zwischen zwei LEDs hin- und her zu wechseln.
2. Programmiert den Code so, dass erst nach viermaligem drücken der Wechsel erfolgt.
3. Programmiert einen Papagei, welcher eine eingegebene Sequenz wiederholt.