Tutorial Belanja komponen

Tutorial › Memulai dengan Arduino

Bab 5: Arduino mulai ngomong

BAB 5
05

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.

HALO_SERIAL.INO
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);
}
  1. 1Membuka jalur komunikasi dengan kecepatan 9600 baud (kira-kira 960 huruf per detik). Cukup sekali di setup().
  2. 2println mengirim tulisan lalu pindah baris. Teks selalu diapit petik dua.
  3. 3print tanpa "ln" tidak pindah baris, jadi angka di baris berikutnya menyambung di sebelahnya.

Upload, lalu klik tombol Serial Monitor. Panel di bawah editor berubah:

Serial Monitor×
Message (Enter to send message to 'Arduino Uno' on 'COM5')New Line 9600 baud !
Halo dari Arduino!
Detik ke-0
Detik ke-1
Detik ke-2
Detik ke-3
ANGKA BAUD HARUS SAMA

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:

INTIP_TOMBOL.INO
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.

PERINTAH_SERIAL.INO
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. 1Serial.available() memberi tahu berapa huruf yang sudah datang dan belum dibaca. Kalau 0, tidak ada pesan baru.
  2. 2Serial.read() mengambil satu huruf. Huruf ditulis dengan petik satu: '1', bukan angka 1.
CATATAN

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

PROYEK 5.215 MENIT · MUDAH

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

ATMEGA328P L TX RX ON UNO SCL SDA AREF GND 13 12 ~11 ~10 ~9 8 7 ~6 ~5 4 ~3 2 TX1 RX0 POWER ANALOG IN DIGITAL (PWM~) 5V GND A4 A5 GND VCC SDA SCL 1 16 H e l l o , W o r l d ! d a r i A r d u i n o : ) GND KE GNDVCC KE 5VSDA KE A4SCL KE A5
Modul I2C di punggung LCD: GND ke GND, VCC ke 5V, SDA ke A4, SCL ke A5. Pakai kabel male-female.

3UPLOAD KODENYA

HELLO_LCD.INO
#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. 10x27 adalah alamat modul I2C, ibarat nomor rumah: Arduino harus tahu mau kirim ke mana. Lalu 16 kolom dan 2 baris.
  2. 2setCursor(kolom, baris) dihitung mulai dari 0. Baris kedua itu 1, bukan 2.
  3. 3loop() kosong: tulisan cukup dikirim sekali, LCD menampilkannya terus.
CATATAN

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.

LAYAR BELUM MUNCUL?
  • 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.
COBA UBAH

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.

I2C_SCANNER.INO
#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() {
}
  1. 1Arduino "mengetuk pintu" alamat itu.
  2. 2Kalau ada yang menjawab, endTransmission() menghasilkan 0.
  3. 3HEX mencetak angkanya dalam bentuk heksadesimal, bentuk yang biasa dipakai untuk menulis alamat I2C.
SERIAL MONITOR
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.

0X ITU APA?

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

PROYEK 5.415 MENIT · MUDAH

Layar menjadi menarik saat isinya berubah. Program ini menampilkan lama papan menyala, dalam detik, dan menghitung tekanan tombol dari rangkaian Bab 4.

LCD_HITUNG.INO
#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);
}
  1. 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.
KENAPA TIDAK PAKAI LCD.CLEAR() SAJA?

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.

LCD_BERJALAN.INO
#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.

PLOTTER.INO
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);
}
  1. 1Format nama:nilai memberi label pada garis. Beberapa nilai dipisah koma.
  2. 2Satu baris (diakhiri println) = satu titik waktu di grafik.
Serial Plottergelombanghitung100500-50-100
Dua garis dengan warna berbeda. Garis "hitung" naik pelan lalu kembali ke 0 karena sisa bagi % 100.