ESP32 Tutorial: Taster-Interrupt mit Entprellung
Bei vielen Projekten mit dem ESP32 ist es sinnvoll, bestimmte Aktionen â wie z.âŻB. einen Updatevorgang â nur bei Bedarf und klar getrennt von der eigentlichen Programmlogik auszufĂŒhren. Anstatt regelmĂ€Ăig auf einen Taster zu prĂŒfen, bietet sich die Verwendung eines Interrupts mit Entprellung an. In diesem Beitrag zeige ich dir, wie du mit MicroPython einen Taster via Interrupt abfragst und dabei eine einfache ZeitprĂŒfung zur Entprellung integrierst. Dadurch wird sichergestellt, dass ein Tasterdruck nicht mehrfach ausgelöst wird, selbst wenn der Kontakt mechanisch prellt. https://youtu.be/k8WnJxvzstI Die eigentliche Programmlogik â hier symbolisch durch ein einfaches Wechselblinken zweier LEDs dargestellt â lĂ€uft dabei unabhĂ€ngig weiter. So lĂ€sst sich der Taster sauber als externer Trigger verwenden, z.âŻB. fĂŒr einen Updatevorgang, der in einem separaten Beitrag behandelt wird.
Jeder GPIO kann ein Interruptpin sein
Einer der groĂen Vorteile beim ESP32 ist die FlexibilitĂ€t der verfĂŒgbaren GPIOs: Nahezu jeder freie GPIO-Pin kann als Interruptquelle genutzt werden. Im Gegensatz zu manchen Ă€lteren Mikrocontroller-Plattformen, bei denen nur bestimmte Pins Interrupts unterstĂŒtzen, erlaubt der ESP32 in MicroPython die Verwendung beliebiger EingĂ€nge fĂŒr Interrupts â solange sie nicht durch Sonderfunktionen blockiert sind (z.âŻB. Flash, Boot-Modus etc.). Das bedeutet konkret: Du kannst deinen Taster einfach an einen freien digitalen Eingang anschlieĂen und diesen Pin mit einer sogenannten Interrupt-Service-Routine (ISR) verknĂŒpfen. Diese ISR wird automatisch aufgerufen, sobald sich der Zustand des Pins Ă€ndert â z.âŻB. bei einem Tasterdruck. Dabei lassen sich verschiedene Triggerarten verwenden: - Pin.IRQ_FALLING â löst aus, wenn das Signal von HIGH auf LOW fĂ€llt (typisch bei Taster mit Pull-Up) - Pin.IRQ_RISING â löst aus, wenn das Signal von LOW auf HIGH wechselt - Pin.IRQ_RISING | Pin.IRQ_FALLING â löst bei jeder Ănderung aus (steigende oder fallende Flanke) So lĂ€sst sich der ESP32 sehr flexibel und effizient steuern â insbesondere bei Projekten, in denen Benutzeraktionen sofort und ohne Verzögerung erkannt werden sollen.
Kompakte Schaltung mit dem ESP32-C3 Super Mini
FĂŒr dieses Beispiel verwende ich den ESP32-C3 Super Mini, der sich durch seine kompakte Bauweise und vollstĂ€ndige GPIO-AusfĂŒhrung besonders gut fĂŒr einfache Demonstrationsschaltungen eignet. Trotz der geringen GröĂe stehen alle wichtigen Funktionen des ESP32-C3 zur VerfĂŒgung â inklusive Interrupt-FĂ€higkeit, WLAN und geringem Stromverbrauch. NatĂŒrlich lĂ€sst sich dieses Projekt genauso gut mit jedem anderen ESP32-Modul (z.âŻB. DevKitC, NodeMCU oder ESP32-S3) umsetzen. Die Pinbelegung muss lediglich entsprechend angepasst werden. In der folgenden Schaltung wird ein Taster an GPIO 21 angeschlossen, um per Interrupt einen Befehl auszulösen. Zwei LEDs (blau und grĂŒn) sind zusĂ€tzlich an GPIO 10 und GPIO 1 angeschlossen und dienen als einfache AktivitĂ€tsanzeige.
Schaltung - ESP32-C3 Mini mit LEDs und Taster ĂŒber PullUp Widerstand Benötigte Teile FĂŒr den Nachbau dieser kleinen Beispielschaltung brauchst du nur wenige, leicht erhĂ€ltliche Bauteile. Ideal fĂŒr Einsteiger und Bastelprojekte: - ESP32 Mikrocontroller* Zum Beispiel der kompakte ESP32-C3 Super Mini* â andere Varianten funktionieren ebenso. - Printtaster* (12Ă12 mm) Ein ganz normaler Drucktaster fĂŒr Breadboards. Optional mit farbiger Tasterkappe. - Widerstand 10âŻkΩ* Als Pull-Up-Widerstand, wenn kein interner genutzt wird oder zur Sicherheit bei mechanisch prellenden Tastern. - Breadboard* (Steckbrett) FĂŒr schnellen und flexiblen Aufbau ohne Löten. - Breadboardkabel* (Dupont-Kabel) Einige Jumper-Kabel zum Verbinden von Mikrocontroller, Taster und LEDs. 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!
Taster per Interrupt anbinden â so gehtâs
Die Programmierung eines Taster-Interrupts mit MicroPython ist unkompliziert. Der Taster wird an einen freien GPIO angeschlossen â in diesem Beispiel an GPIO 21 â und anschlieĂend mit einer Interrupt-Service-Routine (ISR) verknĂŒpft: # Taster an GPIO 21 (z.âŻB. mit externem Pull-Up-Widerstand oder internem PullUp) taster = Pin(21, Pin.IN) taster.irq(trigger=Pin.IRQ_FALLING, handler=taster_auswertung) â ïž Achte darauf, wie der Taster beschaltet ist! Damit ein stabiler HIGH-Pegel im Ruhezustand anliegt, ist ein Pull-Up-Widerstand erforderlich. Beim DrĂŒcken des Tasters wird der Pin gegen GND gezogen (LOW), wodurch der Interrupt ausgelöst wird.
ESP32-C3 Pinout Du hast zwei Möglichkeiten: - â Externer Pull-Up-Widerstand (z.âŻB. 10âŻkΩ zwischen GPIO und 3.3âŻV): Sicherste Variante, funktioniert an jedem Pin. - â Interner Pull-Up aktivieren (nur wenn der verwendete GPIO dies unterstĂŒtzt): taster = Pin(21, Pin.IN, Pin.PULL_UP) đ« Aber Vorsicht: Nicht alle GPIOs des ESP32 unterstĂŒtzen interne Pull-Ups. PrĂŒfe im Datenblatt oder in der GPIO-Referenz deines Moduls, ob der gewĂ€hlte Pin einen internen Pull-Up unterstĂŒtzt, bevor du darauf vertraust. # ============================================= # Titel: Wechselblinkende LEDs und Taster-Interrupt mit Entprellung am ESP32 # Beschreibung: # In diesem Beispiel wird gezeigt, wie zwei LEDs abwechselnd blinken, # wĂ€hrend ein Taster ĂŒber einen Interrupt ausgewertet wird. Eine Entprellung # erfolgt softwareseitig durch zeitgesteuerte PrĂŒfung innerhalb der Interruptfunktion. # # Autor: Stefan Draeger # Webseite: https://draeger-it.blog # ============================================= from machine import Pin import time # Letzter gĂŒltiger Tastendruck (fĂŒr Entprellung) letzter_ausloeser = 0 sperrzeit_ms = 500 # Mindestabstand zwischen zwei Auslösungen in Millisekunden # Interrupt-Service-Routine fĂŒr den Taster def taster_auswertung(pin): global letzter_ausloeser aktuelle_zeit = time.ticks_ms() # Nur auslösen, wenn Sperrzeit ĂŒberschritten wurde if time.ticks_diff(aktuelle_zeit, letzter_ausloeser) > sperrzeit_ms: letzter_ausloeser = aktuelle_zeit print("Taster gedrĂŒckt â Aktion ausgelöst!") # Taster an GPIO 21 (z.âŻB. mit externem Pull-Up-Widerstand oder internem PullUp) taster = Pin(21, Pin.IN) taster.irq(trigger=Pin.IRQ_FALLING, handler=taster_auswertung) # LEDs an GPIO 10 und GPIO 1 led_blau = Pin(10, Pin.OUT) led_gruen = Pin(1, Pin.OUT) # Intervall fĂŒr das Wechselblinken in Millisekunden blink_intervall = 500 # Startzustand fĂŒr Blinksteuerung letzter_wechsel = time.ticks_ms() zustand = False # False = LED blau an, grĂŒn aus # Hauptprogramm while True: aktuelle_zeit = time.ticks_ms() # Wechseln, wenn Intervall abgelaufen ist if time.ticks_diff(aktuelle_zeit, letzter_wechsel) > blink_intervall: zustand = not zustand led_blau.value(zustand) led_gruen.value(not zustand) letzter_wechsel = aktuelle_zeit # Kurze Pause, um CPU-Auslastung zu reduzieren (nicht blockierend) time.sleep(0.05) Read the full article















