🔘 Digital I/O

Memasukkan dan mengeluarkan sinyal digital: pinMode, digitalWrite, digitalRead, dan tombol.

📌 1. Logika Digital: HIGH & LOW

Dunia digital hanya mengenal dua keadaan:

KeadaanTegangan (Arduino 5V)Nilai
HIGH± 5 V1
LOW0 V0

Komponen digital seperti LED, relay, dan tombol semuanya bekerja dengan logika ini. LED menyala saat pinnya HIGH (dengan resistor pembatas!), mati saat LOW.

📌 2. pinMode(): Menentukan Arah Pin

Sebelum dipakai, setiap pin harus diatur arahnya:

pinMode(pin, OUTPUT); // pin mengirim sinyal (ke LED, relay, dsb) pinMode(pin, INPUT); // pin membaca sinyal (dari sensor, tombol) pinMode(pin, INPUT_PULLUP); // input + resistor pull-up internal
OUTPUT

MCU mengirim tegangan 5V/0V ke dunia luar. Dipakai untuk LED, buzzer, relay.

INPUT

MCU membaca tegangan dari dunia luar. Pin "melayang" (tidak terhubung apa-apa) → nilai acak/LOW. Butuh resistor eksternal.

INPUT_PULLUP

Seperti INPUT, tapi ada resistor pull-up internal ke 5V. Pin default HIGH, jadi LOW hanya saat tombol menekan ke GND. Paling praktis untuk tombol.

📌 3. digitalWrite(): Mengeluarkan Sinyal

Rangkaian LED pada pin 13
LED + resistor 220 Ω pada pin 13
digitalWrite(pin, HIGH); // pin keluar 5V digitalWrite(pin, LOW); // pin keluar 0V
Output:

(millis() / 500) % 2 menghasilkan angka 0/1 yang berubah setiap 500 ms — trik praktis untuk membuat pola nyala-mati tanpa delay().

📌 4. digitalRead(): Membaca Tombol

Rangkaian tombol dengan pull-up internal
Tombol dengan pull-up internal — pin LOW saat ditekan

Rangkaian tombol paling praktis: satu kaki tombol ke pin, kaki lainnya ke GND, dan pin diatur INPUT_PULLUP. Saat tombol tidak ditekan → HIGH; saat ditekan → LOW (terhubung GND).

5V --[pull-up internal]-- pin 2 | [tombol] | GND
Output:
💡 Kenapa cek "tepi" (edge) dan bukan langsung if (tombol == LOW)?
Tombol ditekan bertahan beberapa detik. Kalau langsung cek nilai, LED akan "toggle" ratusan kali selama tombol ditahan. Dengan deteksi tepi, LED hanya berubah satu kali per penekanan.

📌 5. Pull-up & Pull-down

Pin input yang "melayang" (floating) tidak terhubung apa-apa akan membaca nilai acak — ini sumber bug klasik. Solusinya: resistor penarik.

Pull-up (default HIGH)
5V --[R]-- pin | [tombol] | GND

Tidak ditekan → HIGH. Ditekan → LOW.
Arduino punya pull-up internal: INPUT_PULLUP.

Pull-down (default LOW)
5V | [tombol] | pin --[R]-- GND

Tidak ditekan → LOW. Ditekan → HIGH.
Butuh resistor eksternal (Arduino tidak punya pull-down internal).

🧠 Latihan

  1. Buat "lampu darurat": pin 13 merah dan pin 12 kuning menyala bergantian 1 detik.
  2. Dua tombol (pin 2 dan 3): tombol 1 menambah hitungan, tombol 2 mengurangi. Cetak hitungan ke Serial. (Petunjuk: gunakan deteksi tepi untuk kedua tombol.)
  3. Jelaskan dengan kata-kamu sendiri: apa yang terjadi jika tombol dihubungkan ke pin INPUT (tanpa pull-up) dan kaki lainnya ke GND?
  4. Buat pola LED "march": 4 LED (pin 13, 12, 11, 10) menyala bergeser seperti lampu berjalan, 200 ms per langkah.