Menu
CoddyTech

Mesin Keadaan Lampu Lalu Lintas

Termasuk bagian Pengaturan Waktu Tanpa Delay dalam perjalanan Arduino di Coddy. Pelajaran 10 dari 18.

Lampu lalu lintas adalah mesin status: lampu selalu berada dalam satu status (hijau, kuning, atau merah), setiap status berlangsung selama waktu tertentu, dan setiap status mengetahui status berikutnya:

  • GREEN: lampu hijau menyala; setelah 2 s, beralih ke YELLOW
  • YELLOW: lampu kuning menyala; setelah 1 s, beralih ke RED
  • RED: lampu merah menyala; setelah 2 s, beralih ke GREEN

Setiap baris menjadi satu case:

case GREEN:
  setLights(HIGH, LOW, LOW);
  if (now - lightStart >= 2000) {
    light = YELLOW;
    lightStart = now;
  }
  break;

Dengan delay(2000), lampu juga akan berfungsi, tetapi tidak ada hal lain yang bisa dijalankan. Dengan millis(), setiap kali melewati loop() hanya membutuhkan waktu beberapa mikrodetik, sehingga papan punya waktu untuk tugas lain: di sini, LED status berkedip sepanjang waktu untuk menunjukkan bahwa pengontrol masih aktif.

challenge icon

Tantangan

Sedang

LED status pada pin 13 sudah berkedip, dan enum serta lightStart sudah siap. Tulis lampu lalu lintas menggunakan switch (light) dengan satu case untuk setiap lampu:

  • hijau 2 s, kuning 1 s, merah 2 s, lalu hijau lagi
  • satu LED setiap kali, dengan setLights()
  • tanpa delay(), agar LED status terus berkedip

Tekan Jalankan, lalu Periksa.

Coba sendiri

const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;
const int statusLed = 13;   // LED bawaan papan

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;   // saat lampu yang sedang aktif menyala

unsigned long statusPrevious = 0;
int statusState = LOW;

void setup() {
  pinMode(greenLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(redLed, OUTPUT);
  pinMode(statusLed, OUTPUT);
}

void setLights(int green, int yellow, int red) {
  digitalWrite(greenLed, green);
  digitalWrite(yellowLed, yellow);
  digitalWrite(redLed, red);
}

void loop() {
  unsigned long now = millis();

  // LED status berganti nyala dan mati setiap 250 ms untuk menunjukkan bahwa pengontrol masih aktif
  if (now - statusPrevious >= 250) {
    statusPrevious = now;
    if (statusState == LOW) {
      statusState = HIGH;
    } else {
      statusState = LOW;
    }
    digitalWrite(statusLed, statusState);
  }

  // lampu lalu lintas: switch (light) dengan satu case untuk setiap lampu
  // hijau 2 s, kuning 1 s, merah 2 s, lalu hijau lagi
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pengaturan Waktu Tanpa Delay

Latihan sendiri: Playground Arduino