Wenn du einen Taster am Mikrocontroller anschließt, wird dir sicher aufgefallen sein, dass mehrere Signale beim Betätigen erkannt werden. Dieses nennt man prellen.

Um dieses prellen am Taster zu verhindern, können wir recht einfach eine kleine Pause von wenigen Millisekunden nach dem Betätigen einlegen. Diese Pause sorgt dafür, dass beim Loslassen der Mikrocontroller dieses nicht erkennt.
Wie du einen Taster mit Micropython am Raspberry Pi Pico ausließt, habe ich dir im Beitrag Raspberry PI Pico #4 – Taster mit PullDown & PullUp abfragen ausführlich erläutert.
Warum zusätzlich ohne time.sleep?
Im Titel findest du den Zusatz „ohne time.sleep“, denn dieses finde ich besonders nützlich. Bei einem time.sleep legt der Mikrocontroller eine Pause ein und kann in der Zwischenzeit keine weiteren Operationen ausführen.
Wenn du nur eine kleine Schaltung zum Steuern einer LED, Relais etc. hast, dann kann das manchmal vernachlässigt werden. Jedoch sieht das anders aus, wenn du Sensorwerte abfragen und anzeigen lassen möchtest.
Eine kleine Schaltung mit zwei LEDs und einem Taster
Wollen wir nun eine kleine Schaltung auf einem Breadboard aufbauen.
Dazu benötigst du:
- einen Raspberry Pi Pico* / Pico W*
- ein 400 Pin Breadboard*,
- ein paar Breadboardkabel*, 10 cm, männlich – männlich,
- zwei 5 mm LEDs*,
- zwei 220 Ohm Widerstände*,
- einen Taster*,
- ein 10 kOhm Widerstand*
Das nachfolgende Beispiel kannst du auch alternativ mit einem ESP32* nachbauen. Dieser ist derzeit deutlich günstiger als der Raspberry Pi Pico W.
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Bauteil | Raspberry Pi Pico W |
---|---|
LED rot | |
Anode | GPIO 15 |
Kathode | GND, Pin 38 |
LED grün | |
Anode | GPIO 14 |
Kathode | GND, Pin 38 |
Taster | |
Pin 1 | GPIO 16, 3v3V |
Pin 2 | GND, Pin 38 |
In dem Code lasse ich im Hintergrund eine grüne LED im Takt von 100 ms. Blinken und kann recht einfach mit einem Tastendruck eine rote LED steuern.
Sollte man jedoch mit der Funktion time.sleep arbeiten, so würde das Betätigen eines Tasters nicht erkennt werden und die rote LED würde den Status nicht ändern.
Quellcode – Micropython Taster entprellen
# Importieren der benötigten Module from machine import Pin import time # LEDs an den Pins 14 & 15 als Ausgang definiert led_gruen = Pin(14, Pin.OUT) led_rot = Pin(15, Pin.OUT) # Taster am Pin 16 als Eingang definiert button = Pin(16, Pin.IN) # Variablen für die Werte # nächste Ausführung eines Tastendrucks next_button_action = 0 # Zeit min. zwischen zwei Tastendrucks button_delay = 100 # Funktion welche ausgeführt werden soll wenn # der Taster betätigt wird. # Parameter - pin def button_handler(pin): global next_button_action, button_delay if time.ticks_ms() < next_button_action: return next_button_action = time.ticks_ms() + button_delay if pin == button: # Umkehren des Signals am digital led_rot.toggle() # Interrupt auf den Taster legen button.irq(trigger = machine.Pin.IRQ_RISING, handler = button_handler) # Hintergrundaktivität # einfach eine LED im Takt von 100ms # blinken lassen # Hier nutzen wir die gleiche Funktion wie auch beim Taster! next_led_action = 0 led_delay = 100 while True: if time.ticks_ms() < next_led_action: continue next_led_action = time.ticks_ms() + led_delay led_gruen.toggle()