Tujuan Pembelajaran

Selamat datang di Modul 7: Arduino! Pada pembelajaran mandiri ini, kita akan masuk ke dalam konsep pemrograman *microcontroller* tingkat menengah yang sangat penting di dunia nyata.

Setelah menyelesaikan modul ini, siswa diharapkan mampu:
  1. Memahami perbedaan dan keunggulan penggunaan fungsi millis() dibandingkan delay() pada Arduino.
  2. Menggunakan konsep Sub Program (Fungsi/Void tambahan) untuk membuat script yang lebih rapi, terstruktur, dan mudah dibaca.
  3. Merangkai dan memprogram simulasi Lampu Lalu Lintas menggunakan Tinkercad berdasarkan logika non-blocking.
  4. Berkolaborasi dalam kelompok untuk merangkai Lampu Lalu Lintas secara fisik menggunakan perangkat Arduino Uno asli.
Arduino Concept
Ilustrasi perangkat keras mikrokontroler (Gambar placeholder, klik untuk memperbesar)

Pertanyaan Pemantik

Sebelum kita mulai membuat kode dan merangkai kabel, mari sejenak kita berpikir tentang apa yang terjadi di dunia nyata.

Lampu Lalu Lintas
Lampu Lalu Lintas di jalan raya.

Pikirkan Hal Ini:

  • Bayangkan jika otak manusia menggunakan sistem perintah delay(). Ketika Anda diperintahkan "Tunggu lampu merah selama 30 detik", maka selama 30 detik itu Anda tidak bisa bernapas, tidak bisa mendengar, dan tidak bisa melihat hal lain. Tentu berbahaya, bukan?
  • Di modul sebelumnya, kita menggunakan delay(). Masalahnya, delay() menghentikan total kerja Arduino. Arduino tidak bisa membaca sensor atau tombol selama `delay` berlangsung (Blocking).
  • Pertanyaannya: Bagaimana cara kita menyuruh Arduino "menunggu" 3 detik untuk lampu hijau, namun dalam 3 detik tersebut Arduino tetap bisa melakukan pekerjaan lain secara bersamaan (Multitasking)?

Jawabannya ada di pemanfaatan fitur Stopwatch Internal yang disebut millis(), dikombinasikan dengan kerapian Sub Program!

Memahami Konsep Inti

1. Apa itu millis()?

Fungsi millis() mengembalikan jumlah milidetik (1 detik = 1000 milidetik) sejak board Arduino mulai menjalankan program. Ini seperti stopwatch yang terus berjalan. Berbeda dengan delay() yang menghentikan program, millis() hanya mengecek waktu, sehingga Arduino bisa mengeksekusi baris kode lain secara terus-menerus.

2. Konsep Sub Program (Custom Void)

Agar kode di dalam void loop() tidak terlalu panjang dan membingungkan, kita memecah tugas-tugas kecil ke dalam "blok fungsi" atau Sub Program. Misalnya, kita membuat instruksi khusus nyalaMerah() yang berisi perintah menyalakan pin merah dan mematikan pin lainnya.

3. Skema Rangkaian

Untuk praktikum Lampu Lalu Lintas, berikut adalah rancangan pin yang akan kita gunakan pada Arduino Uno:

  • LED Merah terhubung ke Pin 13
  • LED Kuning terhubung ke Pin 12
  • LED Hijau terhubung ke Pin 11
  • Semua kaki negatif LED (Katoda) disambungkan ke GND (Ground) melalui Resistor 220Ω.
Rangkaian Elektronika
Ilustrasi Breadboard dan Komponen Elektronika.

4. Script Program Lampu Lalu Lintas (millis & Sub Program)

Pelajari dengan teliti struktur kode di bawah ini. Perhatikan bagaimana void loop() menjadi sangat pendek, dan kerja berat dipindahkan ke sub-program.

// --- DEKLARASI VARIABEL ---
int pinMerah = 13;
int pinKuning = 12;
int pinHijau = 11;

// Variabel untuk millis()
unsigned long waktuSebelumnya = 0;
long jeda = 0; // Waktu tunggu dinamis
int statusLampu = 1; // 1:Merah, 2:Kuning, 3:Hijau

void setup() {
  pinMode(pinMerah, OUTPUT);
  pinMode(pinKuning, OUTPUT);
  pinMode(pinHijau, OUTPUT);
}

void loop() {
  // Membaca 'stopwatch' saat ini
  unsigned long waktuSekarang = millis();

  // Jika selisih waktu sudah melewati 'jeda' yang ditentukan
  if (waktuSekarang - waktuSebelumnya >= jeda) {
    waktuSebelumnya = waktuSekarang; // Reset stopwatch
    
    // Panggil Sub Program pengatur siklus
    aturSiklusLampu(); 
  }
}

// --- SUB PROGRAM: Mengatur Urutan ---
void aturSiklusLampu() {
  if (statusLampu == 1) {
    nyalaMerah();     // Panggil sub program nyala merah
    jeda = 3000;      // Set jeda 3 detik
    statusLampu = 2;  // Lanjut ke state kuning
  } 
  else if (statusLampu == 2) {
    nyalaKuning();
    jeda = 1000;      // Set jeda 1 detik
    statusLampu = 3;  // Lanjut ke state hijau
  } 
  else if (statusLampu == 3) {
    nyalaHijau();
    jeda = 3000;      // Set jeda 3 detik
    statusLampu = 1;  // Kembali ke state merah
  }
}

// --- SUB PROGRAM: Kontrol Hardware ---
void nyalaMerah() {
  digitalWrite(pinMerah, HIGH);
  digitalWrite(pinKuning, LOW);
  digitalWrite(pinHijau, LOW);
}

void nyalaKuning() {
  digitalWrite(pinMerah, LOW);
  digitalWrite(pinKuning, HIGH);
  digitalWrite(pinHijau, LOW);
}

void nyalaHijau() {
  digitalWrite(pinMerah, LOW);
  digitalWrite(pinKuning, LOW);
  digitalWrite(pinHijau, HIGH);
}

Mengaplikasi: Penugasan

Misi 1: Simulasi di Tinkercad (Mandiri)

Berdasarkan "Modul 4" yang pernah kalian pelajari sebelumnya tentang dasar Tinkercad:

  1. Buka platform Tinkercad Circuits.
  2. Buat rangkaian 3 buah LED (Merah, Kuning, Hijau) beserta resistor.
  3. Salin dan masukkan *script program* menggunakan konsep millis() yang ada di menu "Memahami" ke dalam editor teks Tinkercad.
  4. Jalankan simulasi (Start Simulation) dan pastikan urutan lampu menyala dengan benar.

Misi 2: Praktikum Hardware Berkelompok

Instruksi Kelompok (Maksimal 6 Orang):
Tugas utama kalian adalah mewujudkan simulasi tadi ke dalam bentuk perangkat keras (hardware) yang nyata!
  • Alat & Bahan: 1 buah Arduino Uno, 1 buah Breadboard, 3 buah LED (Merah, Kuning, Hijau), 3 buah Resistor 220 Ohm, Kabel Jumper secukupnya, Kabel USB Arduino, Laptop/PC dengan Arduino IDE.
  • Tugas:
    1. Bagilah peran: Ada yang merangkai komponen, ada yang mengetik script di Arduino IDE, dan ada yang mengecek keamanan rangkaian sebelum dihubungkan ke listrik.
    2. Rangkai komponen di breadboard persis seperti skema di simulasi.
    3. Ketikkan script millis() dan sub program. Modifikasi tantangan: Ubah durasi lampu hijau menjadi 5 detik dan lampu kuning menjadi 2 detik!
    4. Upload kode ke board Arduino Uno.
    5. Presentasikan hasil kerja kelompok kalian di depan guru.

Merefleksi

Luar biasa! Kalian telah menyelesaikan tantangan beralih dari program statis (delay) ke program dinamis dan multitasking (millis).

Silakan jawab pertanyaan-pertanyaan berikut di buku catatan jurnal praktikum kalian untuk merekam jejak belajar hari ini:

  1. Apa kendala terbesar yang kelompok kalian hadapi saat menyusun logika waktu menggunakan millis() dibandingkan saat masih memakai delay()?
  2. Menurut kalian, apa manfaat memisahkan perintah menghidupkan LED ke dalam Sub Program seperti nyalaMerah()? Apakah membuat perbaikan error (debugging) menjadi lebih mudah?
  3. Coba pikirkan 1 buah alat di kehidupan sehari-hari (selain lampu lalu lintas) yang *wajib* menggunakan sistem millis() agar tidak "hang" saat menunggu proses selesai. Sebutkan dan jelaskan alasannya!

Selamat Belajar & Teruslah Berinovasi!