> For the complete documentation index, see [llms.txt](https://weenslab.gitbook.io/pages/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://weenslab.gitbook.io/pages/proyek-arduino/kumpulan-proyek/button-interrupt.md).

# Button Interrupt

## Penjelasan Proyek

Pada proyek ini, kita akan membuat tombol dengan interrupt.

## Daftar Komponen

Komponen yang diperlukan yaitu sebagai berikut:

* Board ESP32
* Breadboard
* Push button
* LED 5 mm berwarna merah dan hijau
* Resistor 100 Ω

## Rangkaian

Rangkaian yang dibuat yaitu sebagai berikut. Button dirangkai dengan konfigurasi rangkaian active-low dengan internal pull-up resistor pada pin GPIO 23. LED merah dirangkai secara active-high ke pin 32 dan LED hijau dirangkai secara active-high ke pin 26.

<figure><img src="/files/eWk7hvZ19t7NlDXyH5wW" alt="" width="509"><figcaption></figcaption></figure>

## Kode Program

Kode program yang dibuat yaitu sebagai berikut. Fungsi `attachInterrupt()` berfungsi untuk menghubungkan pin GPIO input dengan interrupt. Fungsi ini memiliki tiga argumen input yaitu pin GPIO, nama fungsi ISR, dan mode interrupt:

* **pin** merupakan nomor pin GPIO yang akan dihubungkan dengan interrupt. Disarankan menggunakan fungsi `digitalPinToInterrupt()` untuk memasukkan argumen ini.
* **intRoutine** merupakan nama fungsi ISR yang kita definisikan.
* **mode** merupakan mode trigger interrupt yang akan digunakan. Terdapat lima mode trigger interrupt pada ESP32:
  * **LOW**: trigger interrupt ketika pin bernilai LOW
  * **HIGH**: trigger interrupt ketika pin bernilai HIGH
  * **CHANGE**: trigger interrupt ketika pin berubah nilai dari HIGH menjadi LOW atau LOW menjadi HIGH.
  * **FALLING**: trigger interrupt ketika pin berubah nilai dari HIGH menjadi LOW.
  * **RISING**: trigger interrupt ketika pin berubah dari LOW menjadi HIGH.

Fungsi `button_isr()` akan dipanggil ketika ada interrupt dari button. Fungsi ini akan menyalakan atau mematikan LED merah.

{% code title="button\_interrupt.ino" lineNumbers="true" %}

```arduino
#define RED_LED_PIN     32
#define GREEN_LED_PIN   26
#define BTNPIN          23

void IRAM_ATTR button_isr()
{
  if (digitalRead(BTNPIN) == LOW)
    digitalWrite(RED_LED_PIN, HIGH);
  else
    digitalWrite(RED_LED_PIN, LOW);
}

void setup()
{
  pinMode(GREEN_LED_PIN, OUTPUT);
  pinMode(RED_LED_PIN, OUTPUT);
  pinMode(BTNPIN, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(BTNPIN), button_isr, CHANGE);
}

void loop()
{
  digitalWrite(GREEN_LED_PIN, LOW);
  delay(2000);
  digitalWrite(GREEN_LED_PIN, HIGH);
  delay(2000);emb
```

{% endcode %}

{% embed url="<https://github.com/weenslab/proyek_arduino/blob/main/button/button_interrupt/button_interrupt.ino>" %}

## Hasil

Hasil dari proyek ini yaitu pada gambar berikut ini. Interrupt menyebabkan LED merah menyala pada saat bersamaan LED hijau berkedip.

<figure><img src="/files/BaJNEnSO05g2tWHN9axI" alt=""><figcaption></figcaption></figure>
