{"id":176281,"date":"2026-02-19T14:41:59","date_gmt":"2026-02-19T14:41:59","guid":{"rendered":"https:\/\/randomnerdtutorials.com\/?p=176281"},"modified":"2026-05-08T06:37:27","modified_gmt":"2026-05-08T06:37:27","slug":"esp-idf-esp32-gpio-interrupts","status":"publish","type":"post","link":"https:\/\/randomnerdtutorials.com\/esp-idf-esp32-gpio-interrupts\/","title":{"rendered":"ESP-IDF: ESP32 GPIO Interrupts (Button with Debouncing)"},"content":{"rendered":"\n<p>In this guide, you&#8217;ll learn how to set ESP32 GPIO interrupts with ESP-IDF (Espressif IoT Development Framework). The ESP32 is a microcontroller that offers several General Purpose Input\/Output (GPIO) pins that can be configured as GPIO interrupts. With the GPIOs set as interrupts, you can monitor the pin state for changes (rising edge, falling edge, etc.). This allows you to run a function immediately when a GPIO state changes with non-blocking code.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" fetchpriority=\"high\" decoding=\"async\" width=\"1200\" height=\"675\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP32-ESP-IDF-GPIO-Interrupts-Button-Debouncing.jpg?resize=1200%2C675&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP-IDF ESP32 GPIO Interrupts Button with Debouncing\" class=\"wp-image-187411\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP32-ESP-IDF-GPIO-Interrupts-Button-Debouncing.jpg?w=1920&amp;quality=100&amp;strip=all&amp;ssl=1 1920w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP32-ESP-IDF-GPIO-Interrupts-Button-Debouncing.jpg?resize=300%2C169&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP32-ESP-IDF-GPIO-Interrupts-Button-Debouncing.jpg?resize=1024%2C576&amp;quality=100&amp;strip=all&amp;ssl=1 1024w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP32-ESP-IDF-GPIO-Interrupts-Button-Debouncing.jpg?resize=768%2C432&amp;quality=100&amp;strip=all&amp;ssl=1 768w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP32-ESP-IDF-GPIO-Interrupts-Button-Debouncing.jpg?resize=1536%2C864&amp;quality=100&amp;strip=all&amp;ssl=1 1536w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" \/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<p>Before following this guide, you need to install the ESP-IDF extension on VS Code IDE (Microsoft Visual Studio Code). Follow the next guide to install it, if you haven&#8217;t already:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/randomnerdtutorials.com\/programming-esp32-esp-idf-vs-code\/\"><strong>Getting Started Guide:<\/strong> Programming ESP32 with ESP-IDF using VS Code<\/a><\/li>\n<\/ul>\n\n\n\n<p>You will also need an <a href=\"https:\/\/makeradvisor.com\/tools\/esp32-dev-board-wi-fi-bluetooth\/\" target=\"_blank\" rel=\"noopener\" title=\"\">ESP32 development board<\/a> model of your choice.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introducing Interrupts<\/h2>\n\n\n\n<p>Interrupts are useful for making things happen automatically in microcontroller programs and can help solve timing problems. Interrupts and event handling provide mechanisms to respond to external events, enabling the ESP32 to react quickly to changes without continuously polling (continuously checking the current value of a pin or variable).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What are Interrupts?<\/h3>\n\n\n\n<p>Interrupts are signals that pause the normal execution flow of a program to handle a specific event. When an interrupt happens, the processor stops the execution of the main program to execute a task and then gets back to the main program. That task is also referred to as an <em>interrupt handling\/service routine<\/em>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" width=\"992\" height=\"291\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2019\/03\/interrupt.png?resize=992%2C291&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"How interrupts work\" class=\"wp-image-81979\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2019\/03\/interrupt.png?w=992&amp;quality=100&amp;strip=all&amp;ssl=1 992w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2019\/03\/interrupt.png?resize=300%2C88&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2019\/03\/interrupt.png?resize=768%2C225&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 992px) 100vw, 992px\" \/><\/figure><\/div>\n\n\n<p>Using interrupts is especially useful to trigger an action whenever motion is detected or whenever a pushbutton is pressed without the need for constantly checking its state.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">ESP32 GPIO Interrupts with ESP-IDF<\/h2>\n\n\n\n<p>To set an interrupt GPIO in ESP-IDF, you need to follow these next steps:<\/p>\n\n\n\n<p><strong>1. Create a queue:<\/strong> in <span class=\"rnthl rntliteral\">app_main()<\/span>, use <span class=\"rnthl rntliteral\">xQueueCreate()<\/span> function to make a queue for sending data from ISR to the main task.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>button_queue = xQueueCreate(10, sizeof(uint32_t));<\/code><\/pre>\n\n\n\n<p><strong>2. Configure GPIO:<\/strong> set up the pin as an input with pull-up resistor enabled and interrupt on rising edge using <span class=\"rnthl rntliteral\">gpio_config()<\/span>.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>#define BUTTON_GPIO GPIO_NUM_4 \n\ngpio_config_t io_conf = {\n    .intr_type = GPIO_INTR_POSEDGE, \/\/ Rising edge interrupt trigger\n    .mode = GPIO_MODE_INPUT,\n    .pin_bit_mask = (1ULL &lt;&lt; BUTTON_GPIO),\n    .pull_down_en = GPIO_PULLDOWN_DISABLE,\n    .pull_up_en = GPIO_PULLUP_ENABLE\n};\ngpio_config(&amp;io_conf);<\/code><\/pre>\n\n\n\n<p><strong>3. Install ISR service and add handler:<\/strong> call <span class=\"rnthl rntliteral\">gpio_install_isr_service(0)<\/span> to set up the interrupt, then <span class=\"rnthl rntliteral\">gpio_isr_handler_add()<\/span> to attach your ISR function to the button pin.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>gpio_install_isr_service(0);<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>gpio_isr_handler_add(BUTTON_GPIO, button_isr, NULL);<\/code><\/pre>\n\n\n\n<p><strong>4. Define the ISR function:<\/strong> create a function with <span class=\"rnthl rntliteral\">IRAM_ATTR<\/span>; in that function, you can check the debounce time, increment counter, and send the new counter value to the queue using <span class=\"rnthl rntliteral\">xQueueSendFromISR()<\/span>.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>static void IRAM_ATTR button_isr(void *arg) {<\/code><\/pre>\n\n\n\n<p><strong>5. Handle data in main loop:<\/strong> in <span class=\"rnthl rntliteral\">app_main()<\/span>, use an infinite loop with <span class=\"rnthl rntliteral\">xQueueReceive()<\/span> to wait for queue items and process them.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>if (xQueueReceive(button_queue, &amp;button_counter, portMAX_DELAY)) {<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><em>gpio_config_t<\/em> structure<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Public Member<\/strong><\/td><td><strong>Value<\/strong><\/td><\/tr><tr><td>uint64_t pin_bit_mask<\/td><td>GPIO pin set with bit mask, for example: (1ULL &lt;&lt; 2)<\/td><\/tr><tr><td>gpio_mode_t mode<\/td><td>GPIO_MODE_DISABLE, GPIO_MODE_INPUT, GPIO_MODE_OUTPUT, GPIO_MODE_OUTPUT_OD, GPIO_MODE_INPUT_OUTPUT_OD, GPIO_MODE_INPUT_OUTPUT<\/td><\/tr><tr><td>gpio_pullup_t pull_up_en<\/td><td>GPIO_PULLUP_DISABLE, GPIO_PULLUP_ENABLE<\/td><\/tr><tr><td>gpio_pulldown_t pull_down_en<\/td><td>GPIO_PULLDOWN_DISABLE, GPIO_PULLDOWN_ENABLE<\/td><\/tr><tr><td>gpio_int_type_t intr_type<\/td><td>GPIO_INTR_DISABLE, GPIO_INTR_POSEDGE, GPIO_INTR_NEGEDGE, GPIO_INTR_ANYEDGE, GPIO_INTR_LOW_LEVEL, GPIO_INTR_HIGH_LEVEL, GPIO_INTR_MAX<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">ESP32 Interrupt GPIOs<\/h3>\n\n\n\n<p>All GPIOs can be configured as interrupts.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" width=\"750\" height=\"538\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2018\/08\/ESP32-DOIT-DEVKIT-V1-Board-Pinout-36-GPIOs-updated.jpg?resize=750%2C538&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP32 DevKit V1 DOIT 36 GPIOS Pinout Diagram\" class=\"wp-image-72102\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2018\/08\/ESP32-DOIT-DEVKIT-V1-Board-Pinout-36-GPIOs-updated.jpg?w=750&amp;quality=100&amp;strip=all&amp;ssl=1 750w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2018\/08\/ESP32-DOIT-DEVKIT-V1-Board-Pinout-36-GPIOs-updated.jpg?resize=300%2C215&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/figure><\/div>\n\n\n<p class=\"rntbox rntclblue\">Learn more about the ESP32 GPIOs: <a href=\"https:\/\/randomnerdtutorials.com\/esp32-pinout-reference-gpios\/\">ESP32 Pinout Reference<\/a>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"818\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2024\/09\/ESP32-S3-pinout.jpg?resize=1200%2C818&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP32-S3 GPIOs Pinout guide\" class=\"wp-image-162320\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2024\/09\/ESP32-S3-pinout.jpg?w=1584&amp;quality=100&amp;strip=all&amp;ssl=1 1584w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2024\/09\/ESP32-S3-pinout.jpg?resize=300%2C205&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2024\/09\/ESP32-S3-pinout.jpg?resize=1024%2C698&amp;quality=100&amp;strip=all&amp;ssl=1 1024w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2024\/09\/ESP32-S3-pinout.jpg?resize=768%2C524&amp;quality=100&amp;strip=all&amp;ssl=1 768w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2024\/09\/ESP32-S3-pinout.jpg?resize=1536%2C1047&amp;quality=100&amp;strip=all&amp;ssl=1 1536w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" \/><\/figure><\/div>\n\n\n<p class=\"rntbox rntclblue\">Learn more about the ESP32-S3 GPIOs: <a href=\"https:\/\/randomnerdtutorials.com\/esp32-s3-devkitc-pinout-guide\/\" title=\"\">ESP32-S3 GPIO Reference Guide<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">ESP32 GPIO Interrupt Modes<\/h2>\n\n\n\n<p>There are six different GPIO interrupt modes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span class=\"rnthl rntliteral\">GPIO_INTR_DISABLE<\/span>: Disable interrupts on the GPIO<\/li>\n\n\n\n<li><span class=\"rnthl rntliteral\">GPIO_INTR_POSEDGE<\/span>: Trigger on rising edge (LOW \u00bb HIGH)<\/li>\n\n\n\n<li><span class=\"rnthl rntliteral\">GPIO_INTR_NEGEDGE<\/span>: Trigger on falling edge (HIGH \u00bb LOW)<\/li>\n\n\n\n<li><span class=\"rnthl rntliteral\">GPIO_INTR_ANYEDGE<\/span>: Trigger on both rising and falling edges<\/li>\n\n\n\n<li><span class=\"rnthl rntliteral\">GPIO_INTR_LOW_LEVEL<\/span>: Trigger while input is low<\/li>\n\n\n\n<li><span class=\"rnthl rntliteral\">GPIO_INTR_HIGH_LEVEL<\/span>: Trigger while input is high<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"438\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/interrupt-modes.png?resize=750%2C438&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"Interrupt modes\" class=\"wp-image-169637\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/interrupt-modes.png?w=750&amp;quality=100&amp;strip=all&amp;ssl=1 750w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/interrupt-modes.png?resize=300%2C175&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\">Creating an ESP-IDF Template App Project for the ESP32<\/h2>\n\n\n\n<p>The ESP-IDF extension provides an easy way to create a project from scratch with all the required files and configurations generated automatically.<\/p>\n\n\n\n<p>To create a new ESP-IDF project on VS Code, follow these steps:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open the ESP-IDF Espressif extension<\/li>\n\n\n\n<li>Expand the &#8220;<strong>Advanced<\/strong>&#8221; menu<\/li>\n\n\n\n<li>Click the &#8220;<strong>New Project Wizard<\/strong>&#8221; option<\/li>\n\n\n\n<li>Choose the &#8220;<strong>Use ESP-IDF v5.4.1<\/strong>&#8221; to select the framework version<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"937\" height=\"742\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Create-Open-New-Project-Wizard-Menu.png?resize=937%2C742&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP-IDF ESP32 Create Open New Project Wizard Menu\" class=\"wp-image-170511\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Create-Open-New-Project-Wizard-Menu.png?w=937&amp;quality=100&amp;strip=all&amp;ssl=1 937w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Create-Open-New-Project-Wizard-Menu.png?resize=300%2C238&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Create-Open-New-Project-Wizard-Menu.png?resize=768%2C608&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 937px) 100vw, 937px\" \/><\/figure><\/div>\n\n\n<p>A new window opens, you need to fill in these fields:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Project Name:<\/strong> type the desired project name;<\/li>\n\n\n\n<li><strong>Enter Project Directory:<\/strong> click the folder icon and select the target folder to save all your project files. You can use any directory. <strong>Note:<\/strong> <u>do NOT use a Google Drive \/ One Drive \/ Dropbox folder<\/u>, because it will write\/create many files during the building process\u2014if it&#8217;s on a cloud folder, this process might be extremely slow;<\/li>\n\n\n\n<li><strong>ESP-IDF Target:<\/strong> select the target device chip, I&#8217;m using an ESP32 with the <strong>esp32s3<\/strong> chip;<\/li>\n\n\n\n<li><strong>ESP-IDF Board:<\/strong> for the esp32s3 chip, I also need to select the configuration: ESP32-S chip (via builtin USB-JTAG);<\/li>\n\n\n\n<li><strong>Serial Port:<\/strong> while having your ESP32 board connected to your computer, select the correct COM port number that refers to your ESP32;<\/li>\n\n\n\n<li><strong>Choose Template:<\/strong> click the blue button to create a new project using a template.<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"983\" height=\"856\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Create-Open-New-Project-Wizard-Menu-Select-Directory-Board-Template.png?resize=983%2C856&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP-IDF ESP32 Create Open New Project Wizard Menu Select Directory Board Template\" class=\"wp-image-170512\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Create-Open-New-Project-Wizard-Menu-Select-Directory-Board-Template.png?w=983&amp;quality=100&amp;strip=all&amp;ssl=1 983w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Create-Open-New-Project-Wizard-Menu-Select-Directory-Board-Template.png?resize=300%2C261&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Create-Open-New-Project-Wizard-Menu-Select-Directory-Board-Template.png?resize=768%2C669&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 983px) 100vw, 983px\" \/><\/figure><\/div>\n\n\n<p>In the menu, select the &#8220;<strong>ESP-IDF Templates<\/strong>&#8221; sample project and press the &#8220;<strong>Create project using template sample project<\/strong>&#8221; button.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1178\" height=\"744\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP-IDF-ESP32-Create-New-Sample-Project-using-IDF-Template.png?resize=1178%2C744&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP-IDF ESP32 Create New Sample Project using IDF Template\" class=\"wp-image-187415\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP-IDF-ESP32-Create-New-Sample-Project-using-IDF-Template.png?w=1178&amp;quality=100&amp;strip=all&amp;ssl=1 1178w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP-IDF-ESP32-Create-New-Sample-Project-using-IDF-Template.png?resize=300%2C189&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP-IDF-ESP32-Create-New-Sample-Project-using-IDF-Template.png?resize=1024%2C647&amp;quality=100&amp;strip=all&amp;ssl=1 1024w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP-IDF-ESP32-Create-New-Sample-Project-using-IDF-Template.png?resize=768%2C485&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 1178px) 100vw, 1178px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Opening the ESP-IDF Project on VS Code<\/h3>\n\n\n\n<p>After a few seconds, a notification will appear on a new window on VS Code. You can click &#8220;<strong>Open Project<\/strong>&#8221; to open the newly created ESP-IDF sample project template.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"503\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP-IDF-ESP32-Open-New-Project-Sample.png?resize=1024%2C503&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP-IDF ESP32 Open New Project Sample\" class=\"wp-image-187416\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP-IDF-ESP32-Open-New-Project-Sample.png?resize=1024%2C503&amp;quality=100&amp;strip=all&amp;ssl=1 1024w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP-IDF-ESP32-Open-New-Project-Sample.png?resize=300%2C147&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP-IDF-ESP32-Open-New-Project-Sample.png?resize=768%2C377&amp;quality=100&amp;strip=all&amp;ssl=1 768w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP-IDF-ESP32-Open-New-Project-Sample.png?w=1231&amp;quality=100&amp;strip=all&amp;ssl=1 1231w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<p><strong>IMPORTANT:<\/strong> if you didn&#8217;t see the notification that allows you to automatically open the ESP-IDF project on VS Code, you can easily do it by following these instructions:<\/p>\n\n\n\n<p>Go to <strong>File <\/strong>&gt; <strong>Open Folder&#8230;<\/strong><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"396\" height=\"315\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Open-Project-Folder-VS-Code-File-Menu.png?resize=396%2C315&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP-IDF ESP32 Open Project Folder VS Code File Menu\" class=\"wp-image-170518\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Open-Project-Folder-VS-Code-File-Menu.png?w=396&amp;quality=100&amp;strip=all&amp;ssl=1 396w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Open-Project-Folder-VS-Code-File-Menu.png?resize=300%2C239&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 396px) 100vw, 396px\" \/><\/figure><\/div>\n\n\n<p>Browse on your computer for the <em>esp-idf-project folder<\/em> (your project folder name that you&#8217;ve previously defined) and &#8220;<strong>Select Folder<\/strong>&#8220;.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"667\" height=\"366\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Open-Project-VS-Code-Select-Folder.png?resize=667%2C366&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP-IDF ESP32 Open Project VS Code Select Folder\" class=\"wp-image-170517\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Open-Project-VS-Code-Select-Folder.png?w=667&amp;quality=100&amp;strip=all&amp;ssl=1 667w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Open-Project-VS-Code-Select-Folder.png?resize=300%2C165&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 667px) 100vw, 667px\" \/><\/figure><\/div>\n\n\n<p>That&#8217;s it! Your new ESP-IDF project template has been successfully created and opened.<\/p>\n\n\n\n<p>ESP-IDF generates many files, folders, and subfolders for your project. For this guide, I recommend keeping all the default files unchanged; we will only modify the <em>main.c<\/em> file.<\/p>\n\n\n\n<p>The example codes will be written in the <em>main.c<\/em> file. To open it, follow these instructions:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open the project explorer by clicking the first icon on the left sidebar.<\/li>\n\n\n\n<li>Select your project folder name, in my case it&#8217;s &#8220;<strong>ESP-IDF-PROJECT<\/strong>&#8220;.<\/li>\n\n\n\n<li>Expand the &#8220;<strong>main<\/strong>&#8221; folder.<\/li>\n\n\n\n<li>Click the &#8220;<strong><em>main.c<\/em><\/strong>&#8221; file.<\/li>\n\n\n\n<li>The default <em>main.c<\/em> template file loads in the code window.<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"907\" height=\"571\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Open-Project-in-a-VS-Code-Browse-to-Main-C-File.png?resize=907%2C571&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP-IDF ESP32 Open Project in a VS Code Browse to Main C File\" class=\"wp-image-170514\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Open-Project-in-a-VS-Code-Browse-to-Main-C-File.png?w=907&amp;quality=100&amp;strip=all&amp;ssl=1 907w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Open-Project-in-a-VS-Code-Browse-to-Main-C-File.png?resize=300%2C189&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/ESP-IDF-ESP32-Open-Project-in-a-VS-Code-Browse-to-Main-C-File.png?resize=768%2C483&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 907px) 100vw, 907px\" \/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\">Code: ESP32 GPIO Button Interrupt with Debouncing using ESP-IDF<\/h2>\n\n\n\n<p>Copy the following code to the <em>main.c<\/em> file. This code waits for a rising edge interrupt from a button connected to ESP32 <span class=\"rnthl rntclblue\">GPIO 4<\/span> using a debounce timer.<\/p>\n\n\n<pre style=\"max-height: 40em; margin-bottom: 20px;\"><code class=\"language-c\">\/*  \n  Rui Santos &amp; Sara Santos - Random Nerd Tutorials\n  https:\/\/RandomNerdTutorials.com\/esp-idf-esp32-gpio-interrupts\/\n*\/\n#include &lt;stdio.h&gt;\n#include &lt;freertos\/FreeRTOS.h&gt;\n#include &lt;freertos\/task.h&gt;\n#include &lt;freertos\/queue.h&gt;\n#include &lt;driver\/gpio.h&gt;\n#include &lt;esp_timer.h&gt;\n#include &quot;sdkconfig.h&quot;\n\n#define BUTTON_GPIO GPIO_NUM_4       \/\/ Pushbutton GPIO\n#define DEBOUNCE_DELAY_US 200000ULL  \/\/ Debounce delay in microseconds (200 ms)\n\nstatic volatile uint64_t last_isr_time = 0;\nstatic volatile uint32_t counter = 0;\nstatic QueueHandle_t button_queue;\n\n\/\/ Interrupt Service Routine (ISR) for button press, placed in IRAM for low latency\nstatic void IRAM_ATTR button_isr(void *arg) {\n    uint64_t now = esp_timer_get_time(); \/\/ Get current time in microseconds\n    \/\/ Check if debounce period has passed, then process the button press\n    if (now - last_isr_time &gt; DEBOUNCE_DELAY_US) {\n        counter++;\n        uint32_t cnt = counter;\n        BaseType_t higher_priority_task_woken = pdFALSE;\n        xQueueSendFromISR(button_queue, &amp;cnt, &amp;higher_priority_task_woken); \/\/ Send counter to queue from ISR\n        last_isr_time = now;\n        if (higher_priority_task_woken) {\n            portYIELD_FROM_ISR();\n        }\n    }\n}\n\nvoid app_main(void) {\n    printf(&quot;Press the button on GPIO %d.\\n&quot;, BUTTON_GPIO);\n\n    \/\/ Create a queue to hold up to 10 uint32_t items\n    button_queue = xQueueCreate(10, sizeof(uint32_t));\n\n    \/\/ Configure Button GPIO\n    gpio_config_t io_conf = {\n        .intr_type = GPIO_INTR_POSEDGE, \/\/ Rising edge interrupt trigger\n        .mode = GPIO_MODE_INPUT,\n        .pin_bit_mask = (1ULL &lt;&lt; BUTTON_GPIO),\n        .pull_down_en = GPIO_PULLDOWN_DISABLE,\n        .pull_up_en = GPIO_PULLUP_ENABLE\n    };\n    gpio_config(&amp;io_conf);\n\n    \/\/ Install GPIO ISR service\n    gpio_install_isr_service(0);\n\n    \/\/ Add ISR handler for button\n    gpio_isr_handler_add(BUTTON_GPIO, button_isr, NULL);\n\n    \/\/ Variable to receive counter from queue\n    uint32_t button_counter;\n\n    \/\/ Keep program running\n    while (1) {\n        \/\/ Wait indefinitely for an item in the queue\n        if (xQueueReceive(button_queue, &amp;button_counter, portMAX_DELAY)) {\n            printf(&quot;Button pressed %lu times.\\n&quot;, button_counter);\n        }\n    }\n}\n<\/code><\/pre>\n\t<p style=\"text-align:center\"><a class=\"rntwhite\" href=\"https:\/\/github.com\/RuiSantosdotme\/Random-Nerd-Tutorials\/raw\/master\/Projects\/ESP-IDF\/gpio_interrupts\/gpio_interrupts.c\" target=\"_blank\">View raw code<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How the Code Works<\/h3>\n\n\n\n<p>In this section, we&#8217;ll take a look at the code to see how it works.<\/p>\n\n\n\n<p><strong>Libraries<\/strong><\/p>\n\n\n\n<p>We start by including the required libraries:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span class=\"rnthl rntliteral\">stdio.h<\/span> &#8211; the standard C library will be used for the <span class=\"rnthl rntliteral\">printf<\/span> function that prints the debugging information in the serial monitor;<\/li>\n\n\n\n<li><span class=\"rnthl rntliteral\">FreeRTOS.h<\/span> &#8211; provides the core FreeRTOS types and functions;<\/li>\n\n\n\n<li><span class=\"rnthl rntliteral\">task.h<\/span> &#8211; allows to use of the non-blocking delay function <span class=\"rnthl rntliteral\">vTaskDelay<\/span>;<\/li>\n\n\n\n<li><span class=\"rnthl rntliteral\">queue.h<\/span> &#8211; queue for ISR function for task communication;<\/li>\n\n\n\n<li><span class=\"rnthl rntliteral\">gpio.h<\/span> &#8211; includes the functions required to configure and control GPIOs;<\/li>\n\n\n\n<li><span class=\"rnthl rntliteral\">esp_timer.h<\/span> &#8211; timer functions for button debounce;<\/li>\n\n\n\n<li><span class=\"rnthl rntliteral\">sdkconfig.h<\/span> &#8211; includes the project&#8217;s configuration file.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>#include &lt;stdio.h&gt;\n#include &lt;freertos\/FreeRTOS.h&gt;\n#include &lt;freertos\/task.h&gt;\n#include &lt;freertos\/queue.h&gt;\n#include &lt;driver\/gpio.h&gt;\n#include &lt;esp_timer.h&gt;\n#include \"sdkconfig.h\"<\/code><\/pre>\n\n\n\n<p><strong>Definitions<\/strong><\/p>\n\n\n\n<p>These lines define the <span class=\"rnthl rntliteral\">BUTTON_GPIO<\/span> and <span class=\"rnthl rntliteral\">DEBOUNCE_DELAY_US<\/span>.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>#define BUTTON_GPIO GPIO_NUM_4       \/\/ Pushbutton GPIO\n#define DEBOUNCE_DELAY_US 200000ULL  \/\/ Debounce delay in microseconds (200 ms)<\/code><\/pre>\n\n\n\n<p>It also defines auxiliary variables to store the last time the button was pressed, counter and queues.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>static volatile uint64_t last_isr_time = 0;\nstatic volatile uint32_t counter = 0;\nstatic QueueHandle_t button_queue;<\/code><\/pre>\n\n\n\n<p><strong>app_main(void)<\/strong><\/p>\n\n\n\n<p>When creating an ESP-IDF project, this function will always be called to run. This function is where you need to write your code for any ESP-IDF applications; it is the equivalent of the <span class=\"rnthl rntliteral\">setup()<\/span> in Arduino programming. When the ESP32 boots, the ESP-IDF framework calls <span class=\"rnthl rntliteral\">app_main<\/span>.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>void app_main(void)\n{\n    \/\/ your code goes here\n}<\/code><\/pre>\n\n\n\n<p>In the <span class=\"rnthl rntliteral\">app_main(void)<\/span> function, you start by printing a messag in the Serial monitor to let the user know the board is ready to receive button presses.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>printf(\"Press the button on GPIO %d.\\n\", BUTTON_GPIO);<\/code><\/pre>\n\n\n\n<p>Then, create a queue that can hold up to 10 uint32_t items. This queue will send data from ISR to the main task.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>button_queue = xQueueCreate(10, sizeof(uint32_t));<\/code><\/pre>\n\n\n\n<p>Create the GPIO config variable with the pushbutton GPIO, set to the interrupt mode rising edge, set it as an INPUT, and disable pull-down resistor. If you notice, the internal pull-up resistor is enabled, so you don\u2019t need an external resistor connected to the pushbutton:<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>\/\/ Configure Button GPIO\ngpio_config_t io_conf = {\n    .intr_type = GPIO_INTR_POSEDGE, \/\/ Rising edge interrupt trigger\n    .mode = GPIO_MODE_INPUT,\n    .pin_bit_mask = (1ULL &lt;&lt; BUTTON_GPIO),\n    .pull_down_en = GPIO_PULLDOWN_DISABLE,\n    .pull_up_en = GPIO_PULLUP_ENABLE\n};\ngpio_config(&amp;io_conf);<\/code><\/pre>\n\n\n\n<p>Call <span class=\"rnthl rntliteral\">gpio_install_isr_service(0)<\/span> to set up the GPIO pin to trigger with interrupts. The <span class=\"rnthl rntliteral\">0<\/span> argument means that it&#8217;s using the default configs.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>gpio_install_isr_service(0);<\/code><\/pre>\n\n\n\n<p>Finally, call <span class=\"rnthl rntliteral\">gpio_isr_handler_add()<\/span> to attach your ISR function to the button pin. The <span class=\"rnthl rntliteral\">button_isr()<\/span> function runs immediatly when the button detects a rising edge.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>gpio_isr_handler_add(BUTTON_GPIO, button_isr, NULL);<\/code><\/pre>\n\n\n\n<p><strong>IRAM_ATTR<\/strong><\/p>\n\n\n\n<p>The <span class=\"rnthl rntliteral\">button_isr()<\/span> function has the <span class=\"rnthl rntliteral\">IRAM_ATTR<\/span> attribute, so it forces the function to be executed immediately (in RAM) when an interrupt is triggered.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>static void IRAM_ATTR button_isr(void *arg) {<\/code><\/pre>\n\n\n\n<p>Inside that function, it starts by checking the current time in microseconds.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>uint64_t now = esp_timer_get_time();<\/code><\/pre>\n\n\n\n<p>Then, it has a software debouncing to check if the debounce period has passed. If the button press is valid, it increments the global <span class=\"rnthl rntliteral\">counter<\/span> variable and sends the <span class=\"rnthl rntliteral\">counter<\/span> value via queue to be processed by a task in the <span class=\"rnthl rntliteral\">while (1)<\/span>.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>if (now - last_isr_time &gt; DEBOUNCE_DELAY_US) {\n    counter++;\n    uint32_t cnt = counter;\n    BaseType_t higher_priority_task_woken = pdFALSE;\n    xQueueSendFromISR(button_queue, &amp;cnt, &amp;higher_priority_task_woken);\n    last_isr_time = now;\n    if (higher_priority_task_woken) {\n        portYIELD_FROM_ISR();\n    }\n}<\/code><\/pre>\n\n\n\n<p><strong>while (1)<\/strong><\/p>\n\n\n\n<p>The <span class=\"rnthl rntliteral\">while (1)<\/span> runs an infinite loop with <span class=\"rnthl rntliteral\">xQueueReceive()<\/span> to wait for queue items and process them. It will print in the Serial monitor how many times the button was pressed.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>while (1) {\n    if (xQueueReceive(button_queue, &amp;button_counter, portMAX_DELAY)) {\n        printf(\"Button pressed %lu times.\\n\", button_counter);\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Build and Flash Code to the ESP32 Board<\/h2>\n\n\n\n<p>To build and flash ESP-IDF code to the ESP32, you always need to follow this procedure. You need to select the flash method (UART), the COM port number, the target device (ESP32), build the code, and finally, flash it to the board. All these commands are available in the bottom menu bar of VS Code.<\/p>\n\n\n\n<p>Make sure all your options are correct (they may already be properly configured if you used the project wizard).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"498\" height=\"28\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Check-All-the-Configured-Settings-UART-COM-Port-Target-Board.png?resize=498%2C28&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"VS Code ESP-IDF Check All the Configured Settings UART COM Port Target Board\" class=\"wp-image-170147\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Check-All-the-Configured-Settings-UART-COM-Port-Target-Board.png?w=498&amp;quality=100&amp;strip=all&amp;ssl=1 498w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Check-All-the-Configured-Settings-UART-COM-Port-Target-Board.png?resize=300%2C17&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 498px) 100vw, 498px\" \/><\/figure><\/div>\n\n\n<p>However, if your setup is not correct, follow the next instructions to ensure everything is set up correctly. First, click the &#8220;<strong>Star<\/strong>&#8221; icon and select the flash method as <strong>UART<\/strong>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"584\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Select-Flash-UART-Option-to-Program-Flash-ESP32-1024x584.png?resize=1024%2C584&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"VS Code ESP-IDF Select Flash UART Option to Program Flash ESP32\" class=\"wp-image-170161\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Select-Flash-UART-Option-to-Program-Flash-ESP32.png?resize=1024%2C584&amp;quality=100&amp;strip=all&amp;ssl=1 1024w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Select-Flash-UART-Option-to-Program-Flash-ESP32.png?resize=300%2C171&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Select-Flash-UART-Option-to-Program-Flash-ESP32.png?resize=768%2C438&amp;quality=100&amp;strip=all&amp;ssl=1 768w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Select-Flash-UART-Option-to-Program-Flash-ESP32.png?w=1030&amp;quality=100&amp;strip=all&amp;ssl=1 1030w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<p>While the ESP32 board is connected to your computer, click the COM Port (plug icon) and select the correct port number that refers to your ESP32.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"582\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Programming-ESP32-Board-Select-Correct-COM-Port-Number.png?resize=1024%2C582&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"VS Code ESP-IDF Programming ESP32 Board Select Correct COM Port Number\" class=\"wp-image-170160\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Programming-ESP32-Board-Select-Correct-COM-Port-Number.png?resize=1024%2C582&amp;quality=100&amp;strip=all&amp;ssl=1 1024w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Programming-ESP32-Board-Select-Correct-COM-Port-Number.png?resize=300%2C171&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Programming-ESP32-Board-Select-Correct-COM-Port-Number.png?resize=768%2C437&amp;quality=100&amp;strip=all&amp;ssl=1 768w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Programming-ESP32-Board-Select-Correct-COM-Port-Number.png?w=1032&amp;quality=100&amp;strip=all&amp;ssl=1 1032w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<p>You also need to select the target device. Click on the chip icon at the bottom bar. In my case, I have an ESP32 with the <strong>esp32s3<\/strong> chip.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"579\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Select-the-ESP32-S3-or-Correct-Target-Device.png?resize=1024%2C579&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"VS Code Select the ESP32 S3 or Correct Target Device ESP-IDF\" class=\"wp-image-170163\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Select-the-ESP32-S3-or-Correct-Target-Device.png?resize=1024%2C579&amp;quality=100&amp;strip=all&amp;ssl=1 1024w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Select-the-ESP32-S3-or-Correct-Target-Device.png?resize=300%2C170&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Select-the-ESP32-S3-or-Correct-Target-Device.png?resize=768%2C434&amp;quality=100&amp;strip=all&amp;ssl=1 768w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Select-the-ESP32-S3-or-Correct-Target-Device.png?w=1031&amp;quality=100&amp;strip=all&amp;ssl=1 1031w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<p>For this board, I also need to select the configuration: <strong>ESP32-S chip (via builtin USB-JTAG)<\/strong>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"757\" height=\"579\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Select-the-ESP32-S3-chip-via-built-in-USB-JTAG-Target-Device.png?resize=757%2C579&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"VS Code ESP-IDF Select the ESP32 S3 chip via built in USB JTAG Target Device\" class=\"wp-image-170162\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Select-the-ESP32-S3-chip-via-built-in-USB-JTAG-Target-Device.png?w=757&amp;quality=100&amp;strip=all&amp;ssl=1 757w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Select-the-ESP32-S3-chip-via-built-in-USB-JTAG-Target-Device.png?resize=300%2C229&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 757px) 100vw, 757px\" \/><\/figure><\/div>\n\n\n<p>Finally, your command bar at the bottom of VS Code should have similar options selected.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"498\" height=\"28\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Check-All-the-Configured-Settings-UART-COM-Port-Target-Board.png?resize=498%2C28&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"VS Code ESP-IDF Check All the Configured Settings UART COM Port Target Board\" class=\"wp-image-170147\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Check-All-the-Configured-Settings-UART-COM-Port-Target-Board.png?w=498&amp;quality=100&amp;strip=all&amp;ssl=1 498w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Check-All-the-Configured-Settings-UART-COM-Port-Target-Board.png?resize=300%2C17&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 498px) 100vw, 498px\" \/><\/figure><\/div>\n\n\n<p>Now, you can build the project by clicking the wrench icon (<strong>Build Project<\/strong>) as shown in the image below.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"581\" height=\"359\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/06\/VS-Code-Build-Project-Example-Code-ESP32-ESP-IDF.png?resize=581%2C359&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"VS Code Build Project Example Code ESP32 ESP-IDF\" class=\"wp-image-170743\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/06\/VS-Code-Build-Project-Example-Code-ESP32-ESP-IDF.png?w=581&amp;quality=100&amp;strip=all&amp;ssl=1 581w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/06\/VS-Code-Build-Project-Example-Code-ESP32-ESP-IDF.png?resize=300%2C185&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 581px) 100vw, 581px\" \/><\/figure><\/div>\n\n\n<p>The first time you build a project, it usually takes a bit more time. Once completed, it should print a similar message in the <strong>Terminal<\/strong> menu and show a &#8220;<strong>Build Successfully<\/strong>&#8221; message.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"648\" height=\"468\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/06\/VS-Code-Build-Example-Project-ESP32-ESP-IDF-Success-Message.jpg?resize=648%2C468&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"VS Code Build Example Project ESP32 ESP-IDF Success Message\" class=\"wp-image-170742\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/06\/VS-Code-Build-Example-Project-ESP32-ESP-IDF-Success-Message.jpg?w=648&amp;quality=100&amp;strip=all&amp;ssl=1 648w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/06\/VS-Code-Build-Example-Project-ESP32-ESP-IDF-Success-Message.jpg?resize=300%2C217&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 648px) 100vw, 648px\" \/><\/figure><\/div>\n\n\n<p>This is the final step. You can now flash the ESP-IDF project to the ESP32 by clicking the &#8220;<strong>Flash Device<\/strong>&#8221; button (thunder icon).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"848\" height=\"170\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Flash-Hello-World-Code-Project-to-ESP32-ESP-IDF.png?resize=848%2C170&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"VS Code Flash Hello World Code Project to ESP32 ESP-IDF\" class=\"wp-image-170294\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Flash-Hello-World-Code-Project-to-ESP32-ESP-IDF.png?w=848&amp;quality=100&amp;strip=all&amp;ssl=1 848w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Flash-Hello-World-Code-Project-to-ESP32-ESP-IDF.png?resize=300%2C60&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Flash-Hello-World-Code-Project-to-ESP32-ESP-IDF.png?resize=768%2C154&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 848px) 100vw, 848px\" \/><\/figure><\/div>\n\n\n<p>Depending on your board, you might need to hold down the on-board BOOT button on your ESP32 to put it into flashing mode. Once the process is completed, it will pop-up a info message saying &#8220;<strong>Flash Done<\/strong>&#8220;.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"575\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Flash-Hello-Wolrd-Project-to-ESP32-ESP-IDF-Done-Success-Message.png?resize=1024%2C575&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"VS Code Flash Hello World Project to ESP32 ESP-IDF Done Success Message\" class=\"wp-image-170155\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Flash-Hello-Wolrd-Project-to-ESP32-ESP-IDF-Done-Success-Message.png?resize=1024%2C575&amp;quality=100&amp;strip=all&amp;ssl=1 1024w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Flash-Hello-Wolrd-Project-to-ESP32-ESP-IDF-Done-Success-Message.png?resize=300%2C168&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Flash-Hello-Wolrd-Project-to-ESP32-ESP-IDF-Done-Success-Message.png?resize=768%2C431&amp;quality=100&amp;strip=all&amp;ssl=1 768w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Flash-Hello-Wolrd-Project-to-ESP32-ESP-IDF-Done-Success-Message.png?w=1039&amp;quality=100&amp;strip=all&amp;ssl=1 1039w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Schematic Diagram<\/h3>\n\n\n\n<p>Here\u2019s a list of the parts you need to build the circuit:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/makeradvisor.com\/tools\/esp32-dev-board-wi-fi-bluetooth\/\" target=\"_blank\" rel=\"noreferrer noopener\">ESP32<\/a>&nbsp;(read&nbsp;<a href=\"https:\/\/makeradvisor.com\/esp32-development-boards-review-comparison\/\" target=\"_blank\" rel=\"noreferrer noopener\">Best ESP32 Dev Boards<\/a>)<\/li>\n\n\n\n<li><a href=\"https:\/\/makeradvisor.com\/tools\/pushbuttons-kit\/\" target=\"_blank\" rel=\"noreferrer noopener\">Pushbutton<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/makeradvisor.com\/tools\/mb-102-solderless-breadboard-830-points\/\" target=\"_blank\" rel=\"noreferrer noopener\">Breadboard<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/makeradvisor.com\/tools\/jumper-wires-kit-120-pieces\/\" target=\"_blank\" rel=\"noreferrer noopener\">Jumper wires<\/a><\/li>\n<\/ul>\n\n\n\n<p>Connect a pushbutton to <span class=\"rnthl rntclblue\">GPIO 4<\/span> as shown in the schematic diagram below for a board with <a href=\"https:\/\/randomnerdtutorials.com\/esp32-s3-devkitc-pinout-guide\/\">ESP32-S3 chip<\/a>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"759\" height=\"827\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/09\/ESP-IDF-ESP32-Read-Digital-Input-Circuit-Wiring-Diagram-Pushbutton.jpg?resize=759%2C827&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP-IDF ESP32 Read Digital Input Circuit Wiring Diagram Pushbutton\" class=\"wp-image-177118\" style=\"width:636px;height:auto\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/09\/ESP-IDF-ESP32-Read-Digital-Input-Circuit-Wiring-Diagram-Pushbutton.jpg?w=759&amp;quality=100&amp;strip=all&amp;ssl=1 759w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/09\/ESP-IDF-ESP32-Read-Digital-Input-Circuit-Wiring-Diagram-Pushbutton.jpg?resize=275%2C300&amp;quality=100&amp;strip=all&amp;ssl=1 275w\" sizes=\"(max-width: 759px) 100vw, 759px\" \/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\">Demonstration<\/h2>\n\n\n\n<p>If you followed all the steps, the example should be running successfully on your board. Open your Terminal window \u2014 click the &#8220;<strong>Monitor Device<\/strong>&#8221; tool that is illustrated with a screen icon.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"780\" height=\"77\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Open-Terminal-Window-Monitor-Device-ESP32-ESP-IDF.png?resize=780%2C77&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"VS Code Open Terminal Window Monitor Device ESP32 ESP-IDF\" class=\"wp-image-170157\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Open-Terminal-Window-Monitor-Device-ESP32-ESP-IDF.png?w=780&amp;quality=100&amp;strip=all&amp;ssl=1 780w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Open-Terminal-Window-Monitor-Device-ESP32-ESP-IDF.png?resize=300%2C30&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/05\/VS-Code-Open-Terminal-Window-Monitor-Device-ESP32-ESP-IDF.png?resize=768%2C76&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/><\/figure><\/div>\n\n\n<p>Press the pushbutton multiple times:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"422\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/09\/ESP32-ESP-IDF-Press-Pushbutton-Read-Digital-Input.jpg?resize=750%2C422&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP32 ESP-IDF Press Pushbutton Read Digital Input\" class=\"wp-image-177123\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/09\/ESP32-ESP-IDF-Press-Pushbutton-Read-Digital-Input.jpg?w=750&amp;quality=100&amp;strip=all&amp;ssl=1 750w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2025\/09\/ESP32-ESP-IDF-Press-Pushbutton-Read-Digital-Input.jpg?resize=300%2C169&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/figure><\/div>\n\n\n<p>The terminal should be printing a message saying &#8220;Button pressed X times.&#8221;:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"744\" height=\"304\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP32-Pushbutton-ESP-IDF-GPIO-Interrupt-Demonstration.png?resize=744%2C304&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP32 Pushbutton ESP-IDF GPIO Interrupt Demonstration\" class=\"wp-image-187413\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP32-Pushbutton-ESP-IDF-GPIO-Interrupt-Demonstration.png?w=744&amp;quality=100&amp;strip=all&amp;ssl=1 744w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP32-Pushbutton-ESP-IDF-GPIO-Interrupt-Demonstration.png?resize=300%2C123&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 744px) 100vw, 744px\" \/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\">Wrapping Up<\/h2>\n\n\n\n<p>In this tutorial, you learned how to program the ESP32 with the ESP-IDF framework using VS Code to set up interrupt GPIOs.<\/p>\n\n\n\n<p>You might find helpful reading other ESP-IDF guides:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/randomnerdtutorials.com\/programming-esp32-esp-idf-vs-code\/\">Programming ESP32 with ESP-IDF using VS Code \u2013 Getting Started Guide<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/randomnerdtutorials.com\/esp-idf-esp32-blink-led\/\">ESP-IDF: ESP32 Blink LED Example (VS Code)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/randomnerdtutorials.com\/esp-idf-esp32-gpio-pwm-ledc\/\">ESP-IDF: ESP32 GPIO PWM with LEDC (Control LED Brightness)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/randomnerdtutorials.com\/esp-idf-esp32-gpio-analog-adc\/\">ESP-IDF: ESP32 GPIO \u2013 Read Analog Input (ADC \u2013 Analog to Digital Converter)<\/a><\/li>\n<\/ul>\n\n\n\n<p>Meanwhile, you can check our ESP32 resources (with Arduino IDE) to learn more about the ESP32 board:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/randomnerdtutorials.com\/esp32-cam-projects-ebook\/\">Learn ESP32 with Arduino IDE (eBook)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/randomnerdtutorials.com\/projects-esp32\/\">More ESP32 Projects and Tutorials\u2026<\/a><\/li>\n<\/ul>\n\n\n\n<p>Thanks for reading.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this guide, you&#8217;ll learn how to set ESP32 GPIO interrupts with ESP-IDF (Espressif IoT Development Framework). The ESP32 is a microcontroller that offers several General Purpose Input\/Output (GPIO) pins &#8230; <\/p>\n<p class=\"read-more-container\"><a title=\"ESP-IDF: ESP32 GPIO Interrupts (Button with Debouncing)\" class=\"read-more button\" href=\"https:\/\/randomnerdtutorials.com\/esp-idf-esp32-gpio-interrupts\/#more-176281\" aria-label=\"Read more about ESP-IDF: ESP32 GPIO Interrupts (Button with Debouncing)\">CONTINUE READING \u00bb<\/a><\/p>\n","protected":false},"author":1,"featured_media":187411,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[327,328,264],"tags":[],"class_list":["post-176281","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-esp-idf","category-esp32-esp-idf","category-project"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2026\/01\/ESP32-ESP-IDF-GPIO-Interrupts-Button-Debouncing.jpg?fit=1920%2C1080&quality=100&strip=all&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/posts\/176281","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/comments?post=176281"}],"version-history":[{"count":11,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/posts\/176281\/revisions"}],"predecessor-version":[{"id":219616,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/posts\/176281\/revisions\/219616"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/media\/187411"}],"wp:attachment":[{"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/media?parent=176281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/categories?post=176281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/tags?post=176281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}