🔘

Taster und Entprellung

Projekt B03 - Eingaben verarbeiten

Beginner
Taster
LED
Pull-up
1
Lernziele

Was du lernst

  • GPIO als Eingang - Pins zum Lesen von Signalen konfigurieren
  • Pull-up/Pull-down - Definierte Zustände bei offenem Taster
  • Entprellung - Mechanisches Prellen softwareseitig filtern
  • Flanken erkennen - Unterschied zwischen gedrückt halten und einmal drücken

Voraussetzungen

Projekt B01 und B02 abgeschlossen

Komponenten

Was du brauchst

🔘

Taster (Push Button)

Schließt den Stromkreis nur solange er gedrückt wird. Typisch: 4 Pins (je 2 verbunden).

In Wokwi: "pushbutton" suchen

💡

LED + 220Ω Widerstand

Zeigt visuell an, ob der Taster erkannt wurde.

Von Projekt B01 bereits bekannt

Pull-up Widerstand?

Der Arduino hat interne Pull-ups! Du brauchst keinen externen Widerstand. Wir nutzen INPUT_PULLUP im Code.

2
Theorie

Warum Pull-up?

Das Problem

Ein offener GPIO-Pin hat keinen definierten Zustand - er "schwebt" (floating) und kann zufällig HIGH oder LOW sein.

Die Lösung: Pull-up

Ein Pull-up Widerstand zieht den Pin auf HIGH, wenn der Taster offen ist.

  • Taster offen: GPIO = HIGH (1)
  • Taster gedrückt: GPIO = LOW (0)

Schaltung mit Pull-up

   5V
     │
    [R] ← Pull-up (intern!)
     │
     ├──► GPIO (liest HIGH)
     │
    [/] ← Taster
     │
    GND

Gedrückt: GPIO → GND = LOW
            

Das Prellen

Warum ein Tastendruck mehrfach erkannt wird

Was passiert?

Mechanische Taster "prellen" - der Kontakt öffnet und schließt mehrmals sehr schnell, bevor er stabil ist.

In der Praxis

Ein Tastendruck kann als 5-10 Tastendrücke erkannt werden!

Lösung: Debouncing

  • Software: Kurze Pause nach Erkennung
  • Hardware: Kondensator (optional)

Signal ohne Entprellung

HIGH ─┐   ┌┐  ┌┐  ┌───────────
      │   ││  ││  │
LOW   └───┘└──┘└──┘

      ↑ Prellen (mehrere Flanken)
            

Nach Entprellung

HIGH ─┐               ┌────────
      │               │
LOW   └───────────────┘

      ↑ Saubere Flanke
            
3
Code

Schritt 1: Taster ohne Entprellung

// Schritt 1: Einfaches Taster-Lesen (noch ohne Entprellung)

const int LED_PIN = 7;
const int TASTER_PIN = 6;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(TASTER_PIN, INPUT_PULLUP);  // Mit internem Pull-up
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(TASTER_PIN) == LOW) {  // LOW = gedrueckt
    digitalWrite(LED_PIN, HIGH);
    Serial.println("Taster gedrueckt!");
  } else {
    digitalWrite(LED_PIN, LOW);
  }
  delay(10);
}

Problem

Die LED leuchtet nur solange der Taster gedrückt wird. Und "Taster gedrückt!" erscheint sehr oft in der Konsole!

3
Code

Schritt 2: Einfache Entprellung

// Schritt 2: Mit einfacher Entprellung

const int LED_PIN = 7;
const int TASTER_PIN = 6;
int ledZustand = LOW;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(TASTER_PIN, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(TASTER_PIN) == LOW) {  // Gedrueckt?
    delay(50);  // Entprellzeit abwarten
    if (digitalRead(TASTER_PIN) == LOW) {  // Immer noch?
      ledZustand = !ledZustand;  // LED umschalten
      digitalWrite(LED_PIN, ledZustand);
      Serial.println("Klick!");
      // Warten bis losgelassen
      while (digitalRead(TASTER_PIN) == LOW) {
        delay(10);
      }
    }
  }
  delay(10);
}

Verbesserung

Jetzt wird pro Tastendruck nur einmal "Klick!" ausgegeben und die LED toggelt zuverlässig.

3
Code

Schritt 3: Mit Zähler

// Fertige Version: Taster mit Zaehler

const int LED_PIN = 7;
const int TASTER_PIN = 6;
int zaehler = 0;
int ledZustand = LOW;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(TASTER_PIN, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("Druecke den Taster!");
}

void loop() {
  if (digitalRead(TASTER_PIN) == LOW) {
    delay(50);  // Entprellen
    if (digitalRead(TASTER_PIN) == LOW) {
      zaehler++;
      ledZustand = !ledZustand;
      digitalWrite(LED_PIN, ledZustand);
      Serial.print("Tastendruck #");
      Serial.println(zaehler);
      while (digitalRead(TASTER_PIN) == LOW) {
        delay(10);
      }
    }
  }
  delay(10);
}

Ergebnis

Jeder Tastendruck wird gezählt und die LED toggelt. Perfekt zum Testen der Entprellung!

Ausprobieren

Simulation in Wokwi

Wokwi Projekt

Füge einen Taster (pushbutton) und eine LED hinzu:

Verbindungen

  • Taster Pin 1 → Pin 6
  • Taster Pin 2 → GND
  • LED → Pin 7 (mit Widerstand)
4
Challenges

Erweiterungen

⏱️

Challenge 1: Langer Druck

Erkenne ob der Taster kurz (<500ms) oder lang (>1s) gedrückt wurde. Unterschiedliche Aktionen!

✌️

Challenge 2: Doppelklick

Erkenne einen Doppelklick (zwei Klicks innerhalb von 300ms).

🔢

Challenge 3: Binärzähler

Nutze 3 LEDs um den Zählerstand binär anzuzeigen (0-7).

🎮

Challenge 4: Modi

Wechsle mit dem Taster zwischen verschiedenen Blink-Modi der LED.

🔘

Geschafft!

Du kannst jetzt Eingaben verarbeiten

GPIO Input

Pins als Eingang nutzen

Pull-up

Interne Widerstände

Debouncing

Saubere Erkennung

Nächstes Projekt

B04: Potentiometer - Analoge Werte lesen und LED dimmen

← →
1 / 11