Tombol Penyeberangan
Termasuk bagian Proyek dalam perjalanan Arduino di Coddy. Pelajaran 3 dari 24.
Orang yang berjalan kaki membutuhkan cara untuk meminta kesempatan menyeberang. Tombol biru pada pin 2 adalah tombol penyeberangan: menekannya saat lampu hijau menyala akan langsung mengakhiri lampu hijau, sehingga mobil mendapat lampu kuning, lalu merah.
Karena lampu berjalan menggunakan millis(), loop() melewati kondisi hijau ribuan kali per detik dan dapat membaca tombol setiap kali, begitu juga jam. Lampu hijau berakhir saat salah satunya bernilai benar, seperti yang dinyatakan oleh || (atau):
case GREEN:
if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
// ubah menjadi kuning
}
break;Tombol menghubungkan pin 2 ke ground, jadi atur pin ke INPUT_PULLUP: pin membaca HIGH sampai tombol menariknya ke LOW.
Hanya kondisi hijau yang membaca tombol. Saat lampu kuning dan merah menyala, mobil sudah berhenti, dan lampu kuning tetap menyala selama satu detik penuh agar pengemudi punya waktu untuk berhenti.
Tantangan
SedangTambahkan tombol penyeberangan pada pin 2:
- atur pin 2 ke
INPUT_PULLUP - saat lampu berwarna hijau, sekali ditekan lampu hijau langsung berakhir (lampu berubah menjadi kuning)
- lampu kuning dan merah tetap menyala selama durasi yang sama, baik tombol ditekan maupun tidak
Tekan Run, tunggu hingga lampu hijau menyala, tekan tombol biru, lalu Check.
Coba sendiri
// Lampu kendaraan
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// LED pada board: lampu status pengontrol
const int statusPin = 13;
enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0; // saat lampu yang aktif mulai menyala
bool statusOn = false;
unsigned long lastBlink = 0;
// Nyalakan satu lampu dan matikan dua lampu lainnya.
void showLight(int pin) {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(pin, HIGH);
}
void setup() {
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(statusPin, OUTPUT);
showLight(greenPin);
}
void loop() {
unsigned long now = millis();
switch (light) {
case GREEN:
if (now - lightStart >= 3000) {
light = YELLOW;
lightStart = now;
showLight(yellowPin);
}
break;
case YELLOW:
if (now - lightStart >= 1000) {
light = RED;
lightStart = now;
showLight(redPin);
}
break;
case RED:
if (now - lightStart >= 3000) {
light = GREEN;
lightStart = now;
showLight(greenPin);
}
break;
}
// Lampu status berkedip setiap 500 ms, terlepas dari keadaan lampu kendaraan.
if (now - lastBlink >= 500) {
lastBlink = now;
if (statusOn) {
statusOn = false;
digitalWrite(statusPin, LOW);
} else {
statusOn = true;
digitalWrite(statusPin, HIGH);
}
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Proyek
1Lampu Lalu Lintas
Siklus Lampu Lalu LintasLampu Lalu Lintas dengan millis()Tombol PenyeberanganSinyal Berjalan dan BelLatihan sendiri: Playground Arduino