ESP32 - GPIO-Unterbrechung

In diesem Tutorial lernen wir, wie man die GPIO-Unterbrechungen am ESP32 verwendet. GPIO-Unterbrechungen am ESP32 ermöglichen eine reaktionsschnelle und effiziente Handhabung externer Ereignisse, was sie für Echtzeitanwendungen in IoT und eingebetteten Systemen unverzichtbar macht. Indem Sie diese Unterbrechungen verstehen und richtig konfigurieren, können Sie robuste und reaktionsschnelle Projekte erstellen, die unmittelbar auf die Umgebung reagieren.

ESP32 GPIO-Unterbrechung

Erforderliche Hardware

1×ESP32 ESP-WROOM-32 Entwicklungsmodul
1×USB-Kabel Typ-A zu Typ-C (für USB-A PC)
1×USB-Kabel Typ-C zu Typ-C (für USB-C PC)
1×Push Button
1×Breadboard
1×Verbindungskabel
1×(Empfohlen) Schraubklemmen-Erweiterungsboard für ESP32
1×(Empfohlen) Breakout Expansion Board for ESP32
1×(Empfohlen) Stromverteiler für ESP32

Oder Sie können die folgenden Kits kaufen:

1×DIYables ESP32 Starter-Kit (ESP32 enthalten)
1×DIYables Sensor-Kit (30 Sensoren/Displays)
1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

Was ist ein GPIO-Interrupt?

Ein GPIO-Interrupt ist ein Signal, das den Prozessor dazu veranlasst, seine aktuelle Ausführung zu stoppen und zu einem bestimmten Codeabschnitt zu springen, der als Interrupt Service Routine (ISR) bekannt ist. Dadurch kann der ESP32 hochprioritäre Aufgaben sofort ausführen, ohne dass die GPIO-Pins kontinuierlich abgefragt werden müssen.

Unterbrechungen im ESP32

Der ESP32 unterstützt verschiedene Arten von GPIO-Unterbrechungen:

  • Aufsteigende Flanke: Ausgelöst, wenn der GPIO-Pin von LOW zu HIGH wechselt.
  • Fallende Flanke: Ausgelöst, wenn der GPIO-Pin von HIGH zu LOW wechselt.
  • Beide Flanken: Ausgelöst bei jeder Zustandsänderung, entweder von LOW nach HIGH oder HIGH nach LOW.
  • Niedrigpegel: Ausgelöst, wenn der GPIO-Pin LOW bleibt.
  • Hochpegel: Ausgelöst, wenn der GPIO-Pin HIGH bleibt.

So konfigurieren Sie GPIO-Interrupts auf dem ESP32

Um einen GPIO-Interrupt am ESP32 zu konfigurieren, müssen Sie diese Schritte befolgen:

GPIO initialisieren: Stellen Sie den Pinmodus des GPIO je nach Bedarf auf Eingang oder Ausgang ein. Zum Beispiel:

pinMode(GPIO_Pin, INPUT_PULLUP);

Interrupt anhängen: Verwenden Sie die Funktion attachInterrupt(), um den GPIO-Pin mit einer ISR zu verbinden.

attachInterrupt(GPIO_Pin, ISR_function, mode);

Diese Funktion akzeptiert drei Argumente:

  • GPIO_Pin: Gibt den GPIO_Pin an, der als Interrupt-Pin verwendet werden soll, und welcher Pin vom ESP32 überwacht werden soll.
  • ISR_function: Der Name der Funktion, die aufgerufen wird, sobald der Interrupt auftritt.
  • mode: Definiert die Bedingung, die den Interrupt auslöst. Es gibt fünf vordefinierte Konstanten, die verwendet werden können:
    • RISING: Auslösen, wenn der Pin von LOW nach HIGH wechselt (bei Rising Edge).
    • FALLING: Auslösen, wenn der Pin von HIGH auf LOW wechselt (bei Falling Edge).
    • CHANGE: Auslösen bei jeder Änderung des Zustands des Pins (bei Both Edge).
    • HIGH: Auslösen, wenn der Pin HIGH ist (bei Level High).
    • LOW: Auslösen, wenn der Pin LOW ist (bei Level Low).

    Definieren Sie die ISR-Funktion: Schreiben Sie die Interrupt-Service-Routine, die ausgeführt wird, wenn der Interrupt ausgelöst wird.

    Die Interrupt Service Routine (ISR) ist eine Funktion, die jedes Mal aufgerufen wird, wenn ein Interrupt am GPIO-Pin auftritt. Ihre Syntax sieht unten wie folgt aus.

    void IRAM_ATTR ISR_function() { Statements; }

    Lass uns in ein praktisches Beispiel eintauchen, wie man Interrupts mit dem GPIO-Pin eines ESP32 verwendet, der mit einem Knopf verbunden ist.

Verdrahtungsdiagramm

ESP32-Taster-Verdrahtungsdiagramm

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

Wenn Sie nicht wissen, wie Sie ESP32 und andere Komponenten mit Strom versorgen, finden Sie Anleitungen im folgenden Tutorial: Wie man ESP32 mit Strom versorgt.

ESP32-Unterbrechungen-Code

#define BUTTON_PIN 21 // The ESP32 pin GPIO21 connected to the button void IRAM_ATTR handleButtonPress(); void setup() { Serial.begin(9600); // Initialize the GPIO pin as an input pinMode(BUTTON_PIN, INPUT_PULLUP); // Attach interrupt to the GPIO pin attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), handleButtonPress, FALLING); } void loop() { // Main code here } // Interrupt Service Routine (ISR) void IRAM_ATTR handleButtonPress() { Serial.println("Button pressed!"); }

In diesem Beispiel:

  • Der BUTTON_PIN ist als GPIO21 definiert.
  • Die Funktion pinMode() setzt den GPIO-Pin als Eingang mit einem internen Pull-up-Widerstand.
  • Die Funktion attachInterrupt() hängt die ISR handleButtonPress an den BUTTON_PIN an und konfiguriert sie so, dass sie bei einer fallenden Flanke ausgelöst wird.
  • Die Funktion handleButtonPress ist die ISR, die ausgeführt wird, wenn der Knopf gedrückt wird.

Der obige Code zeigt, wie Interrupt-Code aussieht, aber er funktioniert in der Praxis möglicherweise nicht, weil er die Funktion Serial.println() verwendet, die länger für die Verarbeitung benötigt, als in einer Interrupt-Service-Routine zulässig ist.

Um zu testen, wie Unterbrechungen funktionieren, siehe das praktische Code-Beispiel unten:

#define BUTTON_PIN 21 // The ESP32 pin GPIO21 connected to the button volatile bool buttonPressed = false; // use volatile for variable that is accessed from inside and outside ISR void IRAM_ATTR handleButtonPress(); void setup() { Serial.begin(9600); // Initialize the GPIO pin as an input pinMode(BUTTON_PIN, INPUT_PULLUP); // Attach interrupt to the GPIO pin attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), handleButtonPress, FALLING); } void loop() { // Main code here if (buttonPressed) { Serial.println("Button pressed!"); buttonPressed = false; // Reset the flag } // Other code here } // Interrupt Service Routine (ISR) void IRAM_ATTR handleButtonPress() { // Serial.println("Button pressed!"); // do NOT use function that takes long time to execute buttonPressed = true; }

Schnelle Schritte

  • Wenn dies das erste Mal ist, dass Sie ESP32 verwenden, sehen Sie wie man die Umgebung für ESP32 in der Arduino-IDE einrichtet.
  • Verbinden Sie die Verkabelung gemäß dem obigen Bild.
  • Schließen Sie das ESP32-Board über ein Micro-USB-Kabel an Ihren PC an.
  • Öffnen Sie die Arduino-IDE auf Ihrem PC.
  • Wählen Sie das richtige ESP32-Board aus (z. B. ESP32 Dev Module) und den COM-Port.
  • Kopieren Sie den obigen Code und öffnen Sie ihn mit der Arduino-IDE.
  • Klicken Sie auf die Upload-Schaltfläche in der Arduino-IDE, um den Code auf den ESP32 hochzuladen.
  • Drücken Sie den Knopf mehrmals.
  • Überprüfen Sie das Ergebnis im Serial Monitor.
COM6
Send
Button pressed! Button pressed! Button pressed! Button pressed!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Sie werden möglicherweise feststellen, dass ein einzelner Tastendruck im Serial Monitor zu mehreren Tastendrücken führt. Dies ist kein Interrupt-Problem, sondern ein Problem mit dem Knopf selbst. Um zu erfahren, wie man dies behebt, lesen Sie das Tutorial ESP32 - Button - Debounce.

Sie können ein weiteres Beispiel sehen, das Unterbrechungen verwendet, in diesem ESP32 - Rotary Encoder Tutorial.

Wichtige Überlegungen

  • No Parameters or Return Values: Eine ISR-Funktion darf keine Parameter haben und sollte nichts zurückgeben.
  • ISR Execution Time: Halten Sie den ISR-Code so kurz und effizient wie möglich. Lange ISRs können dazu führen, dass das System andere Unterbrechungen verpasst oder die Gesamtleistung beeinträchtigt wird.
  • Concurrency: Achten Sie auf gemeinsam genutzte Ressourcen, auf die innerhalb von ISRs zugegriffen wird. Verwenden Sie atomare Operationen oder deaktivieren Sie bei Bedarf Interrupts, um Rennbedingungen zu vermeiden. Speziell verwenden Sie das volatile-Schlüsselwort für Variablen, auf die sowohl innerhalb als auch außerhalb der ISR-Funktion zugegriffen wird.
  • IRAM_ATTR: Platzieren Sie den ISR-Code im IRAM mit dem IRAM_ATTR-Attribut, um sicherzustellen, dass er schnell läuft, ohne aus dem Flash-Speicher lesen zu müssen.

Video Tutorial

Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.

Verwandte Tutorials

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!