# 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="https://4146991827-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FIsb2SAYKLkGlVOGOY0EE%2Fuploads%2FHl7XBXPvz9cltLrDJLur%2FButton_Interrupt.jpg?alt=media&#x26;token=9d19419d-8ee0-4312-8b7c-a3088eea86fd" 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="https://4146991827-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FIsb2SAYKLkGlVOGOY0EE%2Fuploads%2FbIvyWpbZyrBkedOBIjYP%2FResult_Button_Interrupt.gif?alt=media&#x26;token=350bdcde-ee55-4f15-897a-047c1b47af98" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://weenslab.gitbook.io/pages/proyek-arduino/kumpulan-proyek/button-interrupt.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
