⚡ Interrupt

Membiarkan hardware "memanggil" programmu — attachInterrupt, ISR, dan volatile.

📌 1. Polling vs Interrupt

Tombol sebagai sumber interrupt
Tombol pada pin 2 — sumber interrupt FALLING
Polling (cek terus-menerus)

Bagai kamu yang melihat jam setiap 5 detik untuk tahu apakah sudah jam 12. Boros CPU, dan bisa terlambat jika loop sedang sibuk.

while (true) { if (tombolTertekan()) { ... } }
Interrupt (dipanggil saat terjadi)

Bagai kamu yang tidur, lalu dibangunkan saat jam berdering. CPU bebas mengerjakan hal lain; hardware "memotong" program saat ada kejadian penting.

attachInterrupt(pin, fungsiISR, RISING); // CPU lanjut kerja... // saat pin berubah: fungsiISR() dipanggil

📌 2. attachInterrupt()

attachInterrupt(pin, fungsiISR, mode); // mode: // RISING -> saat pin berubah LOW -> HIGH // FALLING -> saat pin berubah HIGH -> LOW // CHANGE -> saat pin berubah (arah mana saja) detachInterrupt(pin); // cabut interrupt
⚠️ Di Arduino Uno hanya pin 2 dan 3 yang mendukung external interrupt. (ESP32: hampir semua pin GPIO.)

📌 3. Aturan Menulis ISR (Interrupt Service Routine)

  1. Pendek & cepat. ISR memotong program utama — semakin lama ISR, semakin lama program utama "membeku".
  2. Jangan pakai delay() atau Serial.println() (di Arduino asli, Serial di dalam ISR = bug klasik). Cukup tandai/hitung; proses beratnya dilakukan di loop().
  3. Gunakan volatile untuk variabel yang diubah ISR dan dibaca loop() — agar compiler tidak "mengoptimalkan" pembacanya.
Output:

Perhatikan: simSetPin(2, LOW) di sini berperan seperti "tombol fisik ditekan" — begitu pin berubah, ISR dipanggil seketika (di simulator: sinkron, sebelum simSetPin kembali).

📌 4. Pola Klasik: ISR Set Flag, Loop Memproses

Pola paling aman: ISR hanya menandai "ada kejadian", loop() yang memprosesnya. Ini menghindari bug akibat kerja berat di dalam ISR.

volatile bool adaKejadian = false; void isr() { adaKejadian = true; // hanya tandai! } void loop() { if (adaKejadian) { adaKejadian = false; // proses berat di sini (aman, tidak memotong ISR lain) Serial.println("Kejadian diproses"); } // ... kerja rutin ... }
Output:

📌 5. Kapan Interrupt Benar-Benar Dibutuhkan?

  • Kejadian cepat yang tidak boleh terlewat — pulsa encoder, sensor pintu, tombol pada sistem real-time.
  • Pengukuran durasi pulsa — sensor ultrasonik (bisa juga pulseIn), sensor kecepatan roda.
  • Waktu presisi — timer interrupt untuk sampling sensor berkala.
💡 Untuk kasus lambat (tombol yang dibaca tiap 50 ms sudah cukup), polling non-blocking lebih sederhana dan lebih aman. Interrupt adalah alat presisi, bukan solusi segala hal.

🧠 Latihan

  1. Ubah counter interrupt jadi mode CHANGE: hitung setiap perubahan pin (naik maupun turun).
  2. Buat "detektor getaran": pin 2 diberi sinyal acak (simulasikan), ISR menambah hitungan; loop mencetak rata-rata per detik.
  3. Jelaskan kenapa Serial.println() di dalam ISR berbahaya di Arduino asli.
  4. Implementasi pola flag untuk 2 sumber interrupt sekaligus (pin 2 dan 3) — loop memproses keduanya.