ESP32 - GPIO Interrupt

In deze tutorial leert u hoe u de GPIO interrupts op een ESP32 gebruikt. GPIO interrupts op de ESP32 maken een snelle en efficiënte verwerking van externe gebeurtenissen mogelijk, wat ze essentieel maakt voor realtime toepassingen in IoT en embedded systemen. Door deze interrupts goed te begrijpen en correct te configureren, kunt u robuuste en responsieve projecten maken die direct reageren op veranderingen in de omgeving.

ESP32 GPIO Interrupt

Hardware Vereist

1×ESP32 ESP-WROOM-32 Ontwikkelingsmodule
1×USB-kabel Type-C
1×Drukknop (Push Button)
1×Breadboard (experimenteerprint)
1×Jumper wires (verbindingsdraden)
1×(Aanbevolen) Schroefklem Uitbreidingsboard voor ESP32
1×(Aanbevolen) Breakout Expansion Board for ESP32
1×(Aanbevolen) Stromsplitter voor ESP32

Of u kunt de volgende kits kopen:

1×DIYables Sensorkit (30 sensoren/displays)
1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Wat is een GPIO Interrupt?

Een GPIO interrupt is een signaal dat de processor dwingt om zijn huidige uitvoering te onderbreken en direct over te schakelen naar een specifieke code, bekend als een interrupt service routine (ISR). Hierdoor kan de ESP32 hoge prioriteitstaken onmiddellijk afhandelen zonder continu de GPIO-pinnen te hoeven controleren (polling).

Interrupts in ESP32

De ESP32 ondersteunt verschillende typen GPIO interrupts:

  • Rising Edge: Wordt geactiveerd wanneer de GPIO-pin van LOW naar HIGH overgaat.
  • Falling Edge: Wordt geactiveerd wanneer de GPIO-pin van HIGH naar LOW overgaat.
  • Both Edge: Wordt geactiveerd bij elke statusverandering, zowel van LOW naar HIGH als van HIGH naar LOW.
  • Level Low: Wordt geactiveerd zolang de GPIO-pin LOW blijft.
  • Level High: Wordt geactiveerd zolang de GPIO-pin HIGH blijft.

Hoe configureert u GPIO Interrupts op de ESP32

Om een GPIO interrupt op de ESP32 te configureren, volgt u deze stappen:

Initialiseer de GPIO: Stel de GPIO-pin in als input of output, afhankelijk van wat nodig is. Bijvoorbeeld:

pinMode(GPIO_Pin, INPUT_PULLUP);

Koppel de Interrupt: Gebruik de attachInterrupt() functie om de GPIO-pin te koppelen aan een ISR.

attachInterrupt(GPIO_Pin, ISR_function, mode);

Deze functie neemt drie argumenten aan:

  • GPIO_Pin: Hiermee geeft u aan welke GPIO-pin als interruptPin wordt gebruikt, oftewel welke pin de ESP32 moet monitoren.
  • ISR_function: De naam van de functie die wordt aangeroepen zodra de interrupt plaatsvindt.
  • mode: Definieert de voorwaarde die de interrupt activeert. Er zijn vijf vooraf gedefinieerde constanten die u kunt gebruiken:
    • RISING: Activeert wanneer de pin van LOW naar HIGH gaat (op Rising Edge).
    • FALLING: Activeert wanneer de pin van HIGH naar LOW gaat (op Falling Edge).
    • CHANGE: Activeert bij elke verandering in de pinstatus (op Both Edge).
    • HIGH: Activeert wanneer de pin HIGH is (op Level High).
    • LOW: Activeert wanneer de pin LOW is (op Level Low).

    Definieer de ISR-functie: Schrijf de interrupt service routine die wordt uitgevoerd bij het triggeren van de interrupt.

    De Interrupt Service Routine (ISR) is een functie die wordt aangeroepen zodra er een interrupt optreedt op de GPIO-pin. De syntaxis ziet er zo uit:

    void IRAM_ATTR ISR_function() { Statements; }

    Laten we duiken in een praktisch voorbeeld van het gebruik van interrupts met een ESP32 GPIO-pin die is aangesloten op een knop.

Aansluitschema

ESP32 Button Wiring Diagram

This image is created using Fritzing. Click to enlarge image

Als u niet weet hoe u ESP32 en andere componenten van stroom moet voorzien, vindt u instructies in de volgende tutorial: Hoe ESP32 van stroom te voorzien.

ESP32 Interrupts 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 dit voorbeeld:

  • De BUTTON_PIN is gedefinieerd als GPIO21.
  • De pinMode() functie stelt de GPIO-pin in als input met een interne pull-up weerstand.
  • De attachInterrupt() functie koppelt de ISR handleButtonPress aan de BUTTON_PIN, ingesteld om te triggeren bij een vallende flank (falling edge).
  • De functie handleButtonPress is de ISR die wordt uitgevoerd wanneer de knop wordt ingedrukt.

De bovenstaande code laat zien hoe interrupt-code eruitziet, maar dit werkt mogelijk niet goed in de praktijk omdat het de Serial.println() functie gebruikt, die langer duurt om uit te voeren dan toegestaan is in een interrupt service routine.

Om te testen hoe interrupts werken, zie het praktische codevoorbeeld hieronder:

#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; }

Snelle Stappen

  • Als u voor het eerst de ESP32 gebruikt, bekijk dan hoe u de omgeving instelt voor ESP32 in Arduino IDE.
  • Voer de bedrading uit zoals op bovenstaande afbeelding.
  • Sluit de ESP32 via een micro USB-kabel aan op uw pc.
  • Open Arduino IDE op uw pc.
  • Selecteer het juiste ESP32 board (bijv. ESP32 Dev Module) en de betreffende COM-poort.
  • Kopieer bovenstaande code en open deze in Arduino IDE.
  • Klik op de knop Upload in Arduino IDE om de code naar de ESP32 te verzenden.
  • Druk meerdere keren op de knop.
  • Bekijk het resultaat op de Serial Monitor.
COM6
Send
Button pressed! Button pressed! Button pressed! Button pressed!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

U zult merken dat één druk op de knop meerdere “pressed” meldingen op de Serial Monitor kan veroorzaken. Dit is geen interruptprobleem maar een kenmerk van de knop zelf (bouncing). Om te leren hoe u dit oplost, verwijzen we u naar de ESP32 - Button - Debounce tutorial.

U kunt een ander voorbeeld met interrupts vinden in deze ESP32 - Rotary Encoder tutorial.

Belangrijke Overwegingen

  • Geen Parameters of Return Values: Een ISR-functie mag geen parameters hebben en mag niets teruggeven.
  • ISR Uitvoeringstijd: Houd de ISR zo kort en efficiënt mogelijk. Lange ISR’s kunnen ertoe leiden dat andere interrupts worden gemist of dat de systeemprestaties verslechteren.
  • Gelijktijdigheid: Wees voorzichtig met gedeelde bronnen die binnen ISR’s worden gebruikt. Gebruik atomaire bewerkingen of schakel interrupts tijdelijk uit om race conditions te voorkomen. Gebruik specifiek het sleutelwoord volatile voor variabelen die zowel binnen als buiten de ISR worden benaderd.
  • IRAM_ATTR: Plaats ISR-code in IRAM met het attribuut IRAM_ATTR om snelle uitvoering te garanderen zonder wachten op flash-geheugen.

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Bekijk onze video-tutorial voor een visuele begeleiding bij dit project! De video biedt extra inzichten en helpt bij het begrijpen van het gebruik van ESP32 GPIO interrupts.

Gerelateerde Tutorials

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!