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.

Hardware Vereist
Of u kunt de volgende kits kopen:
| 1 | × | DIYables Sensorkit (30 sensoren/displays) | |
| 1 | × | DIYables Sensorkit (18 sensoren/displays) |
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:
Koppel de Interrupt: Gebruik de attachInterrupt() functie om de GPIO-pin te koppelen aan een ISR.
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:
Laten we duiken in een praktisch voorbeeld van het gebruik van interrupts met een ESP32 GPIO-pin die is aangesloten op een knop.
Aansluitschema

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
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:
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.
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.