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?
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.
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.
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
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
Kontrollfragen
- todo
- todo
- todo
Weitere Ressourcen
Es gibt noch einige weitere Möglichkeiten und Algorithmen zum Entprellen eines Tasters.