Taster entprellen

Dieses Lab zeigt Ihnen wie sie einen Taster für eine solidere Eingabe entprellen können.

Vorkenntnisse:

Ziel:

  • Taster entprellen.

What is it with bouncing?

Button Bounce

Beim testen des vorherigen Beispiels ist ihnen vlt aufgefallen, dass diese Methode nicht immer sicher einen Tastendruck erkannt hat. Um genau zu sein, hat das Programm zu viele Tastendruücke erkannt. Dies liegt an der mechanischen Bauweise solcher Taster.

Das Signal ist nicht wie zu erwarten ein sauberer übergang von HIGH zu LOW, sondern sieht eher so aus.

Debounce Transition1

Es gibt nun verschiedene Lösungen für dieses Problem:

  • eine Hardware Schaltung zum entprellen bauen.
  • eine einfache blockierende Entprelllogik in Software.
  • eine nicht blockierende Entrelllogik in Software.

Wir wollen uns hier nur die letzten beiden Lösungen anschauen.

Button not bouncing

Das Ergebnis sollte eine saubere Erkennung des Tasters sein.

Blocking Debounce

Hier sehen Sie eine Mögliche Lösung:

from machine import Pin
import time

led = Pin(14, Pin.OUT)
btn = Pin(27, Pin.IN, Pin.PULL_UP)


def toggle(led):
    led.value(not led.value())


# Set btn state to HIGH as btn is low active.
last_btn_state = 1

while True:
    current_btn_state = btn.value()

    if current_btn_state != last_btn_state:
        time.sleep(0.03)
        if current_btn_state == 0:
            toggle(led)

    last_btn_state = current_btn_state

Task (Abgabe)

Skizzieren Sie ein Ablaufdiagram für den gegebenen Code.

Nonblocking Debounce

Wie beim blinken der LED haben wir nun auch das Problem das die sleep funktion die CPU blockiert. Das Prinzip für einen nicht blockierendes Entprellen des Tasters, ist sehr ähnlich zum nicht blockierenden blinken einer LED.

from machine import Pin
import time

led = Pin(14, Pin.OUT)
btn = Pin(27, Pin.IN, Pin.PULL_UP)


def toggle(led):
    led.value(not led.value())


# Set btn state to HIGH as btn is low active.
last_btn_state = 1
last_debounce_ticks = 0
BTN_DEBOUNCE_MS = 30

while True:
    current_btn_state = btn.value()

    if current_btn_state != last_btn_state:
        current_ticks = time.ticks_ms()
        if time.ticks_diff(current_ticks, last_debounce_ticks) > 30:
            if current_btn_state == 0:
                toggle(led)
            last_debounce_ticks = current_ticks

    last_btn_state = current_btn_state

Task

Beschreiben Sie den Algorithmus zum entprellen des Tasters in eigenen Worten.

Kontrollfragen

  1. todo
  2. todo
  3. todo

Weitere Ressourcen

Es gibt noch einige weitere Möglichkeiten und Algorithmen zum Entprellen eines Tasters.