Dalam pengembangan sistem embedded dan Internet of Things (IoT), kemampuan mikrokontroler untuk merespons suatu kejadian secara cepat merupakan hal yang sangat penting. Salah satu fitur yang mendukung hal tersebut pada ESP32 adalah GPIO Interrupt. Melalui GPIO Interrupt, ESP32 dapat langsung menjalankan suatu fungsi ketika terjadi perubahan kondisi pada pin GPIO tanpa harus terus-menerus memeriksa status pin menggunakan teknik polling. Pendekatan ini membuat program menjadi lebih efisien, lebih cepat merespons kejadian, serta mengurangi beban kerja prosesor. Pada tutorial ini, Anda akan mempelajari konsep GPIO Interrupt pada ESP32, mulai dari cara kerjanya, jenis-jenis interrupt yang tersedia, cara mengonfigurasinya, hingga praktik terbaik (best practice) dalam membuat Interrupt Service Routine (ISR). Setelah mengikuti tutorial ini, Anda akan mampu menerapkan interrupt untuk berbagai kebutuhan, seperti membaca tombol, sensor, rotary encoder, maupun perangkat eksternal lainnya.
Perangkat Keras yang Dibutuhkan
- Modul ESP32 ESP-WROOM-32 Dev Board (38 Pin)
- Kabel USB
- Push button (Tact Switch)
- Kabel jumper
Baca juga: DIYables ESP32 Web Server - Cara Mengontrol LED melalui Web Browser Menggunakan ESP32
Apa Itu GPIO Interrupt?
GPIO Interrupt merupakan mekanisme yang memungkinkan ESP32 mendeteksi perubahan kondisi pada pin GPIO dan segera menjalankan suatu fungsi tertentu secara otomatis. Tanpa interrupt, program biasanya menggunakan metode polling, yaitu memeriksa status pin secara terus-menerus di dalam fungsi loop(). Pendekatan ini bekerja dengan baik untuk aplikasi sederhana, tetapi menjadi kurang efisien ketika program harus menangani banyak tugas sekaligus. Sebaliknya, dengan menggunakan interrupt, ESP32 tidak perlu terus memantau kondisi pin. Ketika terjadi perubahan sinyal sesuai kondisi yang telah ditentukan, sistem akan menghentikan sementara proses yang sedang berjalan untuk menjalankan sebuah fungsi khusus yang disebut Interrupt Service Routine (ISR). Setelah fungsi ISR selesai dieksekusi, program utama akan melanjutkan prosesnya dari titik terakhir sebelum interrupt terjadi. Mekanisme ini membuat ESP32 mampu memberikan respons yang sangat cepat terhadap berbagai peristiwa eksternal, seperti:
- Penekanan tombol (push button)
- Perubahan status sensor
- Pulsa dari rotary encoder
- Sinyal dari modul eksternal
- Perubahan level logika pada pin GPIO
Karena itulah, GPIO Interrupt menjadi salah satu fitur yang sangat penting dalam berbagai aplikasi real-time.
Bagaimana Cara Kerja GPIO Interrupt?
Secara sederhana, proses kerja interrupt pada ESP32 berlangsung sebagai berikut:
1. Program utama berjalan seperti biasa.
2. ESP32 terus memantau kondisi pin interrupt secara otomatis melalui perangkat keras.
3. Ketika kondisi pemicu (trigger) terpenuhi, prosesor menghentikan sementara program utama.
4. ESP32 menjalankan fungsi Interrupt Service Routine (ISR).
5. Setelah ISR selesai, program utama kembali berjalan dari posisi sebelumnya.
Dengan mekanisme tersebut, respons terhadap suatu kejadian dapat dilakukan dalam waktu yang sangat singkat tanpa mengganggu keseluruhan alur program.
Jenis-jenis GPIO Interrupt pada ESP32
ESP32 menyediakan beberapa mode interrupt yang dapat dipilih sesuai kebutuhan aplikasi.
1. Rising Edge (RISING)
Interrupt dipicu ketika sinyal berubah dari LOW menjadi HIGH. Mode ini sering digunakan ketika ingin mendeteksi munculnya pulsa atau sinyal positif.2. Falling Edge (FALLING). Interrupt dipicu ketika sinyal berubah dari HIGH menjadi LOW. Mode ini merupakan pilihan yang paling sering digunakan pada tombol (push button) yang menggunakan konfigurasi INPUT_PULLUP.
3. Change (CHANGE)
Interrupt akan dipicu setiap kali terjadi perubahan logika pada pin, baik dari:
- LOW → HIGH
- HIGH → LOW
Mode ini cocok digunakan apabila kedua perubahan kondisi sama-sama penting untuk dideteksi.
4. Low Level (LOW)
Interrupt akan tetap aktif selama pin berada pada kondisi LOW. Mode ini biasanya digunakan pada aplikasi tertentu yang memerlukan pemantauan level logika rendah secara terus-menerus.
5. High Level (HIGH)
Interrupt akan tetap aktif selama pin berada pada kondisi HIGH. Mode ini digunakan ketika sistem perlu merespons selama sinyal berada pada level tinggi.
Cara Mengonfigurasi GPIO Interrupt pada ESP32
Agar interrupt dapat digunakan, terdapat beberapa langkah konfigurasi yang harus dilakukan.
1. Mengatur Mode Pin GPIO
Langkah pertama adalah menentukan fungsi pin menggunakan pinMode().
pinMode(GPIO_Pin, INPUT_PULLUP);
Pada contoh di atas, pin dikonfigurasi sebagai input dengan internal pull-up resistor sehingga kondisi logika pin tetap stabil ketika tombol belum ditekan.
2. Menghubungkan Interrupt ke ISR
Selanjutnya gunakan fungsi attachInterrupt().
attachInterrupt(GPIO_Pin, ISR_function, mode);
Fungsi ini digunakan untuk menghubungkan pin GPIO dengan fungsi Interrupt Service Routine (ISR). Fungsi attachInterrupt() memiliki tiga parameter utama, yaitu:
- GPIO_Pin
Menentukan nomor pin GPIO yang akan digunakan sebagai sumber interrupt.
- ISR_function
Nama fungsi Interrupt Service Routine (ISR) yang akan dijalankan secara otomatis ketika interrupt terjadi.
- mode
Menentukan kondisi yang akan memicu interrupt.
Pilihan mode yang tersedia meliputi:
- RISING → Interrupt dipicu saat sinyal berubah dari LOW menjadi HIGH.
- FALLING → Interrupt dipicu saat sinyal berubah dari HIGH menjadi LOW.
- CHANGE → Interrupt dipicu pada setiap perubahan logika.
- HIGH → Interrupt aktif selama pin berada pada level HIGH.
- LOW → Interrupt aktif selama pin berada pada level LOW.
Membuat Fungsi ISR (Interrupt Service Routine)
Interrupt Service Routine (ISR) adalah fungsi khusus yang dijalankan secara otomatis ketika interrupt terjadi. Fungsi ini digunakan untuk menangani proses yang membutuhkan respons sangat cepat, misalnya mendeteksi tombol ditekan, membaca pulsa encoder, atau menerima sinyal dari perangkat eksternal.
Struktur dasar ISR pada ESP32 adalah sebagai berikut:
void IRAM_ATTR ISR_function() {
Statements;
}
Atribut IRAM_ATTR digunakan agar kode ISR disimpan di Instruction RAM (IRAM) sehingga dapat dieksekusi lebih cepat dan tetap berjalan ketika memori flash sedang tidak dapat diakses.
Wiring Diagram ESP32 dengan Tact Switch
Contoh Program GPIO Interrupt pada ESP32
#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!");
}
Pada contoh program tersebut terdapat beberapa bagian penting yang perlu dipahami.
- BUTTON_PIN digunakan untuk menentukan pin GPIO yang terhubung ke push button, misalnya GPIO21.
- Fungsi pinMode() mengonfigurasi pin sebagai INPUT_PULLUP, sehingga pin memiliki kondisi logika yang stabil tanpa memerlukan resistor pull-up eksternal.
- Fungsi attachInterrupt() menghubungkan BUTTON_PIN dengan fungsi handleButtonPress() sebagai ISR.
- Mode interrupt yang digunakan adalah FALLING, sehingga interrupt akan dipicu ketika sinyal berubah dari HIGH menjadi LOW, yaitu saat tombol ditekan.
- Fungsi handleButtonPress() merupakan ISR yang akan dijalankan secara otomatis ketika interrupt terjadi.
Perlu diketahui bahwa contoh program tersebut hanya bertujuan untuk memperkenalkan konsep dasar GPIO Interrupt. Pada implementasi sebenarnya, penggunaan Serial.println() di dalam ISR tidak disarankan, karena komunikasi serial memerlukan waktu yang relatif lama. Akibatnya, proses interrupt dapat menjadi lebih lambat dan berpotensi mengganggu stabilitas program. Sebagai gantinya, ISR sebaiknya hanya mengubah nilai suatu variabel atau memberikan flag, kemudian proses yang lebih berat dijalankan di dalam fungsi loop().
Contoh Implementasi yang Direkomendasikan
#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;
}
Cara Menjalankan Program
Ikuti langkah-langkah berikut untuk mencoba program interrupt pada ESP32:
1. Hubungkan papan ESP32 ke komputer menggunakan kabel USB.
2. Jalankan aplikasi Arduino IDE.
3. Pilih jenis board yang sesuai, misalnya ESP32 Dev Module, melalui menu Tools > Board.
4. Pilih COM Port yang sesuai dengan papan ESP32 yang terhubung.
5. Salin Kode Program Arduino di atas, kemudian tempelkan ke Arduino IDE.
6. Klik tombol Upload dan tunggu hingga proses selesai.
7. Setelah program berhasil diunggah, tekan tombol (push button) beberapa kali.
8. Buka Serial Monitor untuk melihat hasilnya.
Hasil Pengujian
Ketika menjalankan contoh program di atas, Anda mungkin melihat bahwa satu kali penekanan tombol menghasilkan beberapa pesan pada Serial Monitor. Perilaku tersebut bukan disebabkan oleh kesalahan pada GPIO Interrupt, melainkan akibat fenomena button bouncing yang umum terjadi pada sakelar mekanis. Saat tombol ditekan atau dilepas, kontak logam di dalam sakelar dapat bergetar sesaat sehingga menghasilkan beberapa perubahan logika dalam waktu yang sangat singkat. Untuk mengatasi masalah tersebut, Anda dapat menerapkan teknik debouncing, baik menggunakan software maupun hardware. Jika ingin mempelajari penerapan interrupt yang lebih kompleks, Anda juga dapat mencoba tutorial ESP32 dengan Rotary Encoder, karena perangkat tersebut memanfaatkan GPIO Interrupt untuk mendeteksi perubahan posisi encoder secara real-time.
Best Practice Saat Menggunakan Interrupt pada ESP32
Agar GPIO Interrupt bekerja secara optimal dan program tetap stabil, terdapat beberapa praktik terbaik yang sebaiknya diterapkan.
1. ISR Tidak Menerima Parameter dan Tidak Mengembalikan Nilai
Fungsi ISR harus menggunakan tipe data void, tidak memiliki parameter, dan tidak mengembalikan nilai. Hal ini karena ISR dipanggil langsung oleh sistem operasi ketika interrupt terjadi.
2. Buat ISR Sesingkat Mungkin
ISR sebaiknya hanya mengerjakan proses yang benar-benar penting.
Hindari menjalankan proses yang memerlukan waktu lama, seperti:
- Serial.println()
- Mengakses jaringan (Wi-Fi)
- HTTP Request
- MQTT
- Menulis file ke SD Card
- Operasi database
- Proses komputasi yang berat
Semakin singkat ISR dijalankan, semakin kecil kemungkinan terjadinya gangguan terhadap proses interrupt lainnya.
3. Gunakan Variabel volatile
Apabila suatu variabel digunakan baik di dalam ISR maupun pada program utama, deklarasikan variabel tersebut menggunakan kata kunci volatile.
Contohnya:
volatile bool buttonPressed = false;
Kata kunci volatile memberi tahu compiler bahwa nilai variabel dapat berubah sewaktu-waktu di luar alur normal program, sehingga compiler akan selalu membaca nilai terbaru dari memori.
4. Gunakan IRAM_ATTR
Tambahkan atribut IRAM_ATTR pada setiap fungsi ISR.
void IRAM_ATTR handleInterrupt() {
...
}
Dengan atribut ini, kode ISR akan ditempatkan di Instruction RAM (IRAM) sehingga dapat dieksekusi lebih cepat dan tetap berjalan meskipun memori flash sedang tidak tersedia.
Baca juga: ESP32 - Notifikasi Email Sensor Gerak Menggunakan Sensor PIR
Dalam praktik, hasil dan kendala yang ditemui bisa berbeda tergantung perangkat, konfigurasi, versi library, dan sistem yang digunakan.
- Diskusi umum dan tanya jawab praktik: https://t.me/edukasielektronika
- Kendala spesifik dan kasus tertentu: http://bit.ly/Chatarduino


0 on: "ESP32 GPIO Interrupt - Cara Menggunakan Interrupt pada GPIO ESP32 untuk Respon yang Cepat dan Efisien"