ESP32 GPIO Interrupts
Jump to navigation
Jump to search
ESP32 provides up to 32 interrupt slots for each core. Each interrupt has a certain priority level and can be classified into two types.
Hardware interrupts – These occur in response to an external event. For example, a GPIO interrupt (when a key is pressed) or a touch interrupt (when touch is detected).
In ESP32 we can define an interrupt service routine function that will be called when the GPIO pin changes its logic level.
All GPIO pins in an ESP32 board can be configured to act as interrupt request inputs.
Button example:
struct Button {
const uint8_t PIN;
uint32_t numberKeyPresses;
bool pressed;
};
Button button1 = {18, 0, false};
//variables to keep track of the timing of recent interrupts
unsigned long button_time = 0;
unsigned long last_button_time = 0;
void IRAM_ATTR isr() {
button_time = millis();
if (button_time - last_button_time > 250)
{
button1.numberKeyPresses++;
button1.pressed = true;
last_button_time = button_time;
}
}
void setup() {
Serial.begin(115200);
pinMode(button1.PIN, INPUT_PULLUP);
attachInterrupt(button1.PIN, isr, FALLING);
}
void loop() {
if (button1.pressed) {
Serial.printf("Button has been pressed %u times\n", button1.numberKeyPresses);
button1.pressed = false;
}
}