Stell dir vor, dein Mikrocontroller ist ein fleißiger Arbeiter, der ununterbrochen eine Aufgabe erledigt. Was passiert aber, wenn plötzlich ein wichtiges Ereignis eintritt, wie z.B. ein Knopfdruck oder ein Signal von einem Sensor? Normalerweise müsste der Mikrocontroller seine aktuelle Aufgabe unterbrechen, das Ereignis behandeln und dann zu seiner ursprünglichen Aufgabe zurückkehren. Genau das machen Interrupts möglich! Sie erlauben es deinem Mikrocontroller, sofort auf Ereignisse zu reagieren, ohne lange Wartezeiten oder ineffizientes Abfragen. In diesem Tutorial lernst du, wie du Interrupts in MicroPython nutzen kannst, um dein Projekt reaktionsschneller und effizienter zu machen.
Für dieses Tutorial benötigst du:
Der Schaltplan ist relativ einfach:
from machine import Pin
import time
# Definiere die Pins
led_pin = Pin(16, Pin.OUT) # LED an GPIO16
button_pin = Pin(14, Pin.IN, Pin.PULL_UP) # Taster an GPIO14 mit internem Pull-Up
# Globale Variable, um den Interrupt-Handler schneller zu machen
led_state = False
# Interrupt-Handler Funktion
def button_pressed_handler(pin):
global led_state # Zugriff auf die globale Variable
led_state = not led_state # LED-Zustand umschalten
led_pin.value(led_state) # LED setzen
# Interrupt konfigurieren
button_pin.irq(trigger=Pin.IRQ_FALLING, handler=button_pressed_handler)
# Hauptschleife (tut andere Dinge)
while True:
# Hier könnte dein Hauptprogramm laufen
# ...
print("Das Hauptprogramm läuft...")
time.sleep(2)
machine.Pin
: Ermöglicht die Steuerung der GPIO-Pins.time
: Für Zeitfunktionen (z.B. time.sleep()
).led_pin = Pin(16, Pin.OUT)
: Definiert GPIO16 als Ausgangspin für die LED.button_pin = Pin(14, Pin.IN, Pin.PULL_UP)
: Definiert GPIO14 als Eingangspin für den Taster. Pin.PULL_UP
aktiviert den internen Pull-Up Widerstand. Das bedeutet, dass der Pin standardmäßig HIGH (1) ist, wenn der Taster nicht gedrückt wird. Wenn der Taster gedrückt wird, wird der Pin auf LOW (0) gezogen.led_state = False
: Eine globale Variable, die den aktuellen Zustand der LED speichert. Sie ist False
(ausgeschaltet) initialisiert. Der Grund für die globale Variable ist, dass Interrupts oft schnell sein müssen und globaler Variablenzugriff schneller ist als z.B. auf Objekte zuzugreifen.button_pressed_handler
):
global led_state
: Erlaubt der Funktion, die globale Variable led_state
zu ändern.led_state = not led_state
: Kehrt den Wert von led_state
um (True wird zu False und umgekehrt).led_pin.value(led_state)
: Setzt den Wert des LED-Pins entsprechend dem neuen Wert von led_state
.button_pin.irq(...)
):
button_pin.irq(trigger=Pin.FALLING, handler=button_pressed_handler)
: Konfiguriert den Interrupt für den Taster-Pin.
trigger=Pin.FALLING
: Der Interrupt wird ausgelöst, wenn der Pegel am Pin von HIGH auf LOW fällt (d.h. wenn der Taster gedrückt wird). Alternativ gäbe es Pin.IRQ_RISING
(wenn der Pegel von LOW auf HIGH steigt), Pin.IRQ_ANYEDGE
(bei jeder Pegeländerung) und Pin.IRQ_LOW_LEVEL
/ Pin.IRQ_HIGH_LEVEL
(wenn der Pegel konstant Low/High ist).handler=button_pressed_handler
: Gibt an, welche Funktion aufgerufen werden soll, wenn der Interrupt ausgelöst wird.while True
):
gc.collect()
: Wenn du mit Ressourcenproblemen zu kämpfen hast, erwäge, gc.collect()
im Hauptprogramm aufzurufen, um Speicher freizugeben, anstatt dies im Interrupt-Handler zu tun.Interrupts sind ein mächtiges Werkzeug, um dein Mikrocontroller-Projekt reaktionsschneller und effizienter zu machen. Sie ermöglichen es, auf Ereignisse zu reagieren, ohne die Hauptschleife zu blockieren. Denke daran, Interrupt-Handler kurz und effizient zu halten, um die beste Performance zu erzielen. Mit dem Raspberry Pi Pico und MicroPython kannst du Interrupts einfach und schnell in deine Projekte integrieren.