Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Gartenautomation
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Deutsch
  • English
Menu

ESP32 Tutorial: Taster-Interrupt mit Entprellung

Posted on 14. Juli 202513. Juli 2025 by Stefan Draeger

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.

Dieses Video auf YouTube ansehen.

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.

Inhaltsverzeichnis

  • Jeder GPIO kann ein Interruptpin sein
  • Kompakte Schaltung mit dem ESP32-C3 Super Mini
    • Benötigte Teile
  • Taster per Interrupt anbinden – so geht’s

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
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
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)

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen
Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

link zu Fabook
link zu LinkedIn
link zu YouTube
link zu TikTok
link zu Pinterest
link zu Instagram
  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}