Arduino mulai ngomong
Sampai bab 4, Arduino cuma bisa ngasih kabar lewat LED kedip. Di bab ini dia belajar bicara: mengirim tulisan ke laptop lewat kabel USB, lalu menampilkan kalimat di layar LCD-nya sendiri. Fitur ini juga jadi alat paling ampuh untuk mencari kesalahan program.
DI BAB INI KAMU BAKAL BISA
- mengirim pesan dan isi variabel ke Serial Monitor
- menerima perintah dari laptop
- menampilkan tulisan di LCD 16×2 I2C
- mencari alamat I2C
- membuat angka dan teks bergerak di LCD
- menggambar grafik dengan Serial Plotter
YANG DIBUTUHKAN
- Arduino Uno + kabel USB
- LCD 16×2 dengan modul I2C (4 pin)
- 4 kabel jumper male-female
- library LiquidCrystal I2C (dipasang di 5.2)
- rangkaian latihan Bab 4 boleh tetap terpasang
5.1Serial Monitor: ngobrol sama laptop
Kabel USB yang dipakai untuk upload juga bisa dipakai Arduino untuk mengirim tulisan ke laptop, kapan saja selama program berjalan. Tulisan itu muncul di Serial Monitor, tombol kaca pembesar di kanan atas Arduino IDE.
int hitung = 0; void setup() { Serial.begin(9600);1 Serial.println("Halo dari Arduino!");2 } void loop() { Serial.print("Detik ke-");3 Serial.println(hitung); hitung++; delay(1000); }
- 1Membuka jalur komunikasi dengan kecepatan 9600 baud (kira-kira 960 huruf per detik). Cukup sekali di
setup(). - 2
printlnmengirim tulisan lalu pindah baris. Teks selalu diapit petik dua. - 3
printtanpa "ln" tidak pindah baris, jadi angka di baris berikutnya menyambung di sebelahnya.
Upload, lalu klik tombol Serial Monitor. Panel di bawah editor berubah:
Halo dari Arduino! Detik ke-0 Detik ke-1 Detik ke-2 Detik ke-3
Kotak di pojok kanan Serial Monitor harus menunjukkan angka yang sama dengan Serial.begin(),
di sini 9600. Kalau beda, yang muncul huruf acak seperti ÿ¤x@ÿ. Tidak ada yang rusak, cukup samakan angkanya.
Mengintip isi program
Kegunaan terbesar Serial Monitor adalah mencari kesalahan. Kalau programmu tidak berperilaku seperti dugaanmu, cetak isi variabelnya. Contoh dengan rangkaian Bab 4, membaca tombol di pin 2:
void setup() { Serial.begin(9600); pinMode(2, INPUT_PULLUP); } void loop() { int bacaan = digitalRead(2); Serial.print("Pin 2 membaca: "); Serial.println(bacaan); // 1 = dilepas, 0 = ditekan delay(200); }
Tekan dan lepas tombolnya. Kamu bisa melihat sendiri bahwa INPUT_PULLUP membaca 1 saat dilepas dan 0 saat ditekan, persis
seperti penjelasan di 3.4. Dengan cara ini, tebakan berubah jadi bukti.
Laptop memberi perintah
Jalurnya dua arah. Ketik sesuatu di kotak Message, tekan Enter, dan Arduino bisa membacanya.
void setup() { Serial.begin(9600); pinMode(3, OUTPUT); Serial.println("Ketik 1 untuk menyalakan, 0 untuk mematikan."); } void loop() { if (Serial.available() > 0) {1 char huruf = Serial.read();2 if (huruf == '1') { digitalWrite(3, HIGH); Serial.println("LED nyala"); } else if (huruf == '0') { digitalWrite(3, LOW); Serial.println("LED mati"); } } }
- 1
Serial.available()memberi tahu berapa huruf yang sudah datang dan belum dibaca. Kalau 0, tidak ada pesan baru. - 2
Serial.read()mengambil satu huruf. Huruf ditulis dengan petik satu:'1', bukan angka1.
Saat Serial Monitor dibuka, Uno otomatis di-reset, jadi programnya mulai lagi dari setup(). Itu sebabnya pesan
"Halo dari Arduino!" selalu muncul di awal setiap kali Serial Monitor dibuka.
5.2Hello, World! di LCD 16×2
Serial Monitor butuh laptop. Supaya Arduino bisa menampilkan sesuatu sendiri, pakai layar LCD 16×2: 16 huruf per baris, 2 baris. LCD yang punggungnya sudah ada modul I2C (papan kecil berisi chip PCF8574 dan sekrup biru) cukup memakai 4 kabel.
1PASANG LIBRARY
Buka Library Manager (cara di 2.6), cari LiquidCrystal I2C, lalu pasang yang dibuat oleh Frank de Brabander.
2SAMBUNGKAN 4 KABEL
3UPLOAD KODENYA
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2);1 void setup() { lcd.init(); lcd.backlight(); lcd.setCursor(0, 0);2 lcd.print("Hello, World!"); lcd.setCursor(0, 1); lcd.print("dari Arduino :)"); } void loop() {3 }
- 1
0x27adalah alamat modul I2C, ibarat nomor rumah: Arduino harus tahu mau kirim ke mana. Lalu 16 kolom dan 2 baris. - 2
setCursor(kolom, baris)dihitung mulai dari 0. Baris kedua itu1, bukan2. - 3
loop()kosong: tulisan cukup dikirim sekali, LCD menampilkannya terus.
LCD tanpa modul butuh sekitar 12 kabel. Modul di punggungnya cukup 2 jalur data (SDA dan SCL) lewat cara komunikasi bernama I2C. Jalur yang sama bisa dipakai bareng sensor I2C lain sekaligus, asal alamatnya beda.
- Lampu layar nyala, tulisan tidak ada: putar pelan sekrup biru di punggung modul dengan obeng kecil. Itu pengatur kontras, dan dari pabrik sering terlalu redup atau terlalu pekat.
- Baris atas cuma kotak-kotak: LCD belum menerima perintah. Cek kabel SDA/SCL (jangan tertukar), lalu coba alamat
0x3F. Untuk tahu alamat pastinya, pakai 5.3. - Error
LiquidCrystal_I2C.h: No such file or directory: library belum terpasang.
Ganti baris kedua dengan namamu. Kalau lebih dari 16 huruf, apa yang terjadi? Lalu coba lcd.setCursor(5, 0)
dan perhatikan di mana tulisannya mulai.
5.3I2C scanner: cari alamatnya
Alamat modul I2C ditentukan pabrik, dan yang paling umum 0x27 atau 0x3F. Daripada menebak, program pendek ini
mengetuk semua alamat satu per satu dan melaporkan mana yang menjawab.
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); Serial.println("Mencari perangkat I2C..."); for (byte alamat = 1; alamat < 127; alamat++) { Wire.beginTransmission(alamat);1 if (Wire.endTransmission() == 0) {2 Serial.print("Ketemu di 0x"); if (alamat < 16) Serial.print("0"); Serial.println(alamat, HEX);3 } } Serial.println("Selesai."); } void loop() { }
- 1Arduino "mengetuk pintu" alamat itu.
- 2Kalau ada yang menjawab,
endTransmission()menghasilkan 0. - 3
HEXmencetak angkanya dalam bentuk heksadesimal, bentuk yang biasa dipakai untuk menulis alamat I2C.
Mencari perangkat I2C... Ketemu di 0x27 Selesai.
Tulis alamat yang ketemu di baris LiquidCrystal_I2C lcd(0x27, 16, 2); pada program 5.2. Kalau scanner tidak menemukan
apa pun, masalahnya ada di kabel, bukan di alamat.
Awalan 0x menandakan bilangan heksadesimal, yaitu bilangan berbasis 16 yang memakai angka 0 sampai 9 lalu huruf
A sampai F. 0x27 sama dengan 39 dalam bilangan biasa. Kamu tidak perlu menghitungnya, cukup salin persis seperti yang tertulis.
5.4Angka & teks yang bergerak
Layar menjadi menarik saat isinya berubah. Program ini menampilkan lama papan menyala, dalam detik, dan menghitung tekanan tombol dari rangkaian Bab 4.
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); int tekan = 0; void setup() { lcd.init(); lcd.backlight(); pinMode(2, INPUT_PULLUP); lcd.print("Nyala:"); lcd.setCursor(0, 1); lcd.print("Tekan:"); } void loop() { if (digitalRead(2) == LOW) { tekan++; delay(250); } lcd.setCursor(7, 0); lcd.print(millis() / 1000); lcd.print(" detik ");1 lcd.setCursor(7, 1); lcd.print(tekan); }
- 1Spasi tambahan di akhir tulisan itu sengaja. LCD tidak menghapus isi lama; dia hanya menimpa kotak yang ditulisi. Spasi memastikan sisa huruf dari tulisan sebelumnya tertimpa kosong.
lcd.clear() menghapus seluruh layar, tapi butuh waktu cukup lama
dan kalau dipanggil setiap putaran loop(), layar terlihat berkedip-kedip. Menimpa hanya bagian yang berubah membuat tampilan tenang.
Pakai clear() hanya saat tampilan benar-benar berganti halaman.
Teks berjalan
Kalimat yang lebih panjang dari 16 huruf bisa digeser seperti papan pengumuman.
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { lcd.init(); lcd.backlight(); lcd.print("Belajar Arduino itu seru, beneran!"); } void loop() { lcd.scrollDisplayLeft(); // geser isi layar ke kiri delay(300); }
LCD sebenarnya punya memori 40 huruf per baris, walaupun yang terlihat cuma 16. Itu sebabnya kalimat 34 huruf di atas tetap utuh saat digeser.
5.5Bonus: Serial Plotter
Kalau yang dikirim lewat Serial berupa angka, Arduino IDE bisa menggambarkannya sebagai grafik. Buka lewat ikon grafik di sebelah Serial Monitor. Ini sangat berguna untuk sensor di Bab 6: kamu bisa melihat naik-turunnya bacaan, bukan cuma deretan angka.
int hitung = 0; void setup() { Serial.begin(9600); } void loop() { float gelombang = 100 * sin(millis() / 500.0); Serial.print("gelombang:");1 Serial.print(gelombang); Serial.print(",hitung:"); Serial.println(hitung);2 hitung = (hitung + 2) % 100; delay(50); }
- 1Format
nama:nilaimemberi label pada garis. Beberapa nilai dipisah koma. - 2Satu baris (diakhiri
println) = satu titik waktu di grafik.
% 100.