Lampu pertama
Lampu L di papan sudah berkedip. Sekarang kamu pindah ke breadboard: memasang LED sendiri, membuat lampu lalu lintas, lalu membuat Arduino bereaksi saat tombol ditekan. Di akhir bab, kamu sudah merangkai dan memprogram dari nol tanpa contoh bawaan.
DI BAB INI KAMU BAKAL BISA
- membaca program Blink baris per baris
- merangkai LED dan resistor di breadboard
- menyalakan beberapa LED bergantian
- membaca tombol dengan INPUT_PULLUP
- membuat tombol yang menyalakan dan mematikan lampu
YANG DIBUTUHKAN
- Arduino Uno + kabel USB
- breadboard
- 3 LED (merah, kuning, hijau)
- 3 resistor 220 Ω
- 1 tombol
- kabel jumper male-male
3.1Blink dibedah
Program Blink dari Bab 2 cuma sepuluh baris, tapi isinya sudah memuat pola yang dipakai semua program Arduino. Kita baca pelan-pelan.
void setup() {1 pinMode(LED_BUILTIN, OUTPUT);2 } void loop() {3 digitalWrite(LED_BUILTIN, HIGH);4 delay(1000);5 digitalWrite(LED_BUILTIN, LOW); delay(1000); }
- 1
setup()adalah bagian yang dijalankan sekali, tepat saat papan menyala atau di-reset. Isinya persiapan: memberi tahu pin mana dipakai untuk apa. Semua perintahnya ada di antara kurung kurawal{dan}. - 2
pinMode(pin, OUTPUT)menjadikan pin itu keluaran: Arduino yang mengatur listriknya, untuk menyalakan sesuatu.LED_BUILTINadalah nama lain untuk pin 13, pin tempat lampu L tersambung. - 3
loop()dijalankan terus-menerus. Begitu sampai di baris terakhir, Arduino kembali ke baris pertamaloop(), selamanya, sampai listriknya dicabut. - 4
digitalWrite(pin, HIGH)menyalakan pin: keluar 5 volt, LED menyala.LOWmematikannya: 0 volt, LED padam. - 5
delay(1000)menyuruh Arduino diam selama 1000 milidetik (1 detik) sebelum lanjut ke baris berikutnya.
Jadi yang dikerjakan Arduino setiap putaran loop() adalah:
1000 MS
1000 MS
1000 MS
1000 MS
Perhatikan juga titik koma di akhir setiap perintah. Bagi Arduino, titik koma itu seperti titik di akhir kalimat. Lupa satu titik koma saja sudah cukup bikin Verify gagal. Ini salah ketik yang paling sering terjadi, jadi biasakan mengeceknya.
Kenapa harus ada setup() dan loop() padahal isinya bisa saja dijadikan satu? Karena papan seperti Arduino
memang dirancang untuk bekerja terus, tanpa "selesai". Termometer, lampu otomatis, atau alarm tidak pernah berhenti mengecek.
setup() adalah persiapan sekali di awal, loop() adalah pekerjaan rutinnya.
3.2LED pertama di breadboard
Sekarang pakai LED-mu sendiri. Programnya sama dengan Blink, yang berubah cuma rangkaiannya: dari pin 13 lewat resistor, ke LED, lalu pulang ke GND.
1RANGKAI (KABEL USB DICABUT)
- Tancapkan resistor 220 Ω (merah-merah-cokelat) di baris i, dari kolom 10 ke kolom 14.
- Tancapkan LED di baris g: kaki panjang di kolom 14 (satu kolom dengan ujung resistor), kaki pendek di kolom 15.
- Kabel kuning dari pin 13 Arduino ke lubang j10.
- Kabel hitam dari j15 ke rel biru (−) di atasnya.
- Kabel hitam dari GND Arduino (yang di sebelah pin 13) ke rel biru (−) yang sama.
2UPLOAD
Pakai program Blink yang sama. Kali ini kita tulis nomor pinnya langsung, supaya terbiasa:
void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(500); }
LED di breadboard berkedip setiap setengah detik, bersamaan dengan lampu L di papan (keduanya memang tersambung ke pin 13).
Pindahkan kabel kuning dari pin 13 ke pin 8, lalu ubah semua angka 13 di program menjadi 8. Sekarang
hanya LED di breadboard yang berkedip, lampu L di papan diam. Kamu baru saja memilih pin sendiri.
- LED terbalik. Kaki panjang harus di kolom yang sama dengan resistor. Putar LED-nya.
- Dua kaki LED di kolom yang sama. Listrik lewat tanpa melewati LED. Pastikan kakinya di kolom 14 dan 15.
- Kabel GND belum dipasang, atau tertancap di rel merah (+). Listrik tidak punya jalan pulang.
- Komponen tidak tertancap dalam. Kaki resistor dan LED yang tipis kadang cuma nempel di permukaan. Tekan sampai mentok.
3.3Lampu lalu lintas
Tiga LED, tiga pin, satu urutan: hijau, kuning, merah, ulang lagi. Rangkaiannya adalah proyek 3.2 dikali tiga.
Setiap LED dirangkai seperti di 3.2: resistor di baris i, kaki panjang LED satu kolom dengan ujung resistor, kaki pendek disambung ke rel biru. Pastikan tiap LED punya resistornya sendiri.
const int MERAH = 12;1 const int KUNING = 11; const int HIJAU = 10; void setup() { pinMode(MERAH, OUTPUT); pinMode(KUNING, OUTPUT); pinMode(HIJAU, OUTPUT); } void loop() { digitalWrite(HIJAU, HIGH);2 delay(5000); digitalWrite(HIJAU, LOW); digitalWrite(KUNING, HIGH); delay(2000); digitalWrite(KUNING, LOW); digitalWrite(MERAH, HIGH); delay(5000); digitalWrite(MERAH, LOW); }
- 1
const int MERAH = 12;memberi nama untuk angka 12. Setelah itu kamu cukup menulisMERAHdan Arduino tahu maksudnya pin 12. Program jadi lebih gampang dibaca, dan kalau suatu saat kabelnya pindah pin, cukup ubah satu baris ini. Bab 4.2 membahas ini lebih dalam. - 2Polanya selalu: nyalakan, tunggu, matikan, lalu pindah ke lampu berikutnya. Karena hanya satu lampu yang menyala pada satu waktu, yang lain tidak perlu diapa-apakan.
Lampu lalu lintas di Indonesia tidak menyalakan kuning sebelum hijau, tapi beberapa negara menyalakan merah dan kuning bersamaan sesaat sebelum hijau, tanda "siap-siap jalan". Tambahkan tahap itu setelah lampu merah: merah dan kuning menyala bersama selama 1 detik.
3.4Membaca tombol
Sejauh ini Arduino cuma mengeluarkan perintah. Sekarang dia mendengarkan: lampu menyala selama tombol ditekan. Untuk itu
sebuah pin dijadikan masukan (INPUT), lalu dibaca dengan digitalRead().
- Tancapkan tombol menyeberangi parit, kakinya di kolom 8 dan 10.
- Kabel biru dari pin 2 ke j8, sisi atas tombol.
- Kabel hitam dari a10, sisi bawah tombol yang bersilangan, ke rel biru (−) bawah, lalu dari rel itu ke salah satu GND di kiri bawah Arduino.
- Rangkai LED dan resistor seperti 3.2, kali ini di kolom 16 sampai 21, dengan kabel dari pin 13.
const int TOMBOL = 2; const int LED = 13; void setup() { pinMode(TOMBOL, INPUT_PULLUP);1 pinMode(LED, OUTPUT); } void loop() { if (digitalRead(TOMBOL) == LOW) {2 digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } }
- 1
INPUT_PULLUPmenjadikan pin 2 masukan, sekaligus menyalakan resistor kecil di dalam chip yang "menarik" pin itu ke 5 volt. Akibatnya: saat tombol dilepas, pin membaca HIGH. Saat ditekan, pin tersambung ke GND lewat tombol, jadi membaca LOW. - 2
ifartinya "kalau". Kalau hasil bacaan pin 2 sama dengan LOW (tombol ditekan), nyalakan LED. Kalau tidak (else), matikan. Tanda==artinya "apakah sama dengan", beda dengan=.
Upload, lalu tekan tombolnya. LED menyala selama tombol ditekan dan padam saat dilepas.
Pin masukan yang tidak tersambung ke mana pun bersifat "mengambang". Dia bisa membaca HIGH
atau LOW secara acak, bahkan berubah hanya karena tanganmu mendekat. INPUT_PULLUP memberi pin itu posisi istirahat yang pasti,
yaitu HIGH. Tombol cukup menyambungkannya ke GND saat ditekan. Cara ini dipakai di mana-mana karena tidak butuh resistor tambahan.
Konsekuensinya cuma satu: logikanya terbalik, ditekan = LOW.
- LED selalu menyala, atau tidak pernah menyala: kaki tombol yang disambung kemungkinan bukan pasangan diagonal. Pastikan kabel ke pin 2 dan kabel ke GND ada di sisi parit yang berbeda dan di kolom yang berbeda.
- LED berkedip-kedip sendiri tanpa ditekan: kamu menulis
INPUT, bukanINPUT_PULLUP.
3.5Tekan nyala, tekan mati
Proyek 3.4 seperti bel: lampu cuma menyala selama tombol ditahan. Saklar lampu kamar bekerja beda: tekan sekali menyala, tekan lagi mati. Rangkaiannya tetap sama persis dengan 3.4. Yang berubah hanya cara berpikir programnya.
Arduino perlu mengingat dua hal: lampunya sedang menyala atau tidak, dan apakah tombol tadi sudah ditekan. Pergantian hanya terjadi tepat pada saat tombol baru saja ditekan, bukan selama ditahan.
const int TOMBOL = 2; const int LED = 13; bool lampuNyala = false;1 bool tadiDitekan = false; void setup() { pinMode(TOMBOL, INPUT_PULLUP); pinMode(LED, OUTPUT); } void loop() { bool ditekan = (digitalRead(TOMBOL) == LOW); if (ditekan && !tadiDitekan) {2 lampuNyala = !lampuNyala;3 digitalWrite(LED, lampuNyala); delay(50);4 } tadiDitekan = ditekan; }
- 1
booladalah jenis catatan yang isinya cuma dua kemungkinan:true(benar) ataufalse(salah). Dua catatan ini ditulis di luarloop(), supaya isinya tidak hilang setiap putaran. - 2Dibaca: "kalau tombol sekarang ditekan dan tadi tidak ditekan".
&&berarti "dan",!berarti "tidak". Kondisi ini cuma benar sekali, tepat di saat jari baru menekan. - 3
lampuNyala = !lampuNyalamembalik isinya: true jadi false, false jadi true. Nilai true dikirim kedigitalWritesama artinya dengan HIGH. - 4Jeda 50 milidetik untuk meredam pantulan tombol (lihat catatan di bawah).
Saat ditekan, logam di dalam tombol sebenarnya bersentuhan dan lepas beberapa kali dalam waktu sangat singkat, beberapa milidetik saja, sebelum benar-benar menempel. Arduino cukup cepat untuk melihat semua pantulan itu sebagai beberapa kali tekan, sehingga lampu bisa nyala-mati-nyala sendiri. Jeda pendek setelah tekanan pertama membuat pantulan berikutnya diabaikan. Teknik ini namanya debounce.
Hapus baris delay(50);, upload, lalu tekan tombol berkali-kali. Kadang lampu seperti tidak mau berubah? Itu pantulan
tombol. Kembalikan baris tadi, lalu coba ubah 50 menjadi 5 dan 300. Rasakan bedanya saat menekan cepat.