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.
Tantangan
SedangLED 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
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pengaturan Waktu Tanpa Delay
1millis()
Jam millis()Waktu dalam unsigned longLED Berkedip Tanpa JedaDua LED, Dua KecepatanLED Berkedip Saat Tombol Mengubah StatusLampu dengan Pengatur Waktu4Pengaturan Waktu yang Presisi
Mengukur dengan micros()Saat millis() Berputar KembaliStopwatch Tombol2Mesin Keadaan
Mengingat ModeMemilih dengan switchKeadaan Bernama dengan enumMesin Keadaan Lampu Lalu LintasBergilir Antar-Mode dengan TombolLatihan sendiri: Playground Arduino