Dari proyek sebelumnya, lampu lampu lintas advance ditambah fungsinya dengan lampu penyebrang jalan. Jika saklar untuk menyebrang jalan ditekan, lampu lalin akan berganti menjadi orange, lalu merah, kemudian lampu penyebrang jalan akan menyala hijau.
Setelah sekian detik waktu, lampu penyebrang jalan akan berganti merah, lampu lalulintas akan kembali berjalan normal.
Dalam proyek ini kita belajar menangkap input dari luar sistem.
Komponen
- 2 LED merah
- 1 LED kuning
- 2 LED hijau
- 1 resistor 10 kiloohm
- 5 resistor
- 1 pushbutton
Skema

Sketch
int carRed = 12; // assign the car lights
int carYellow = 11;
int carGreen = 10;int pedRed = 9; // assign the pedestrian lights
int pedGreen = 8;
int button = 2; // button pin
int crossTime = 5000; // time allowed to cross
unsigned long changeTime = 0; // time last pedestrian cycle completed
void setup() {
pinMode(carRed, OUTPUT);
pinMode(carYellow, OUTPUT);
pinMode(carGreen, OUTPUT);
pinMode(pedRed, OUTPUT);
pinMode(pedGreen, OUTPUT);
pinMode(button, INPUT); // button on pin 2
// turn on the green light
digitalWrite(carGreen, HIGH);
digitalWrite(pedRed, HIGH);
}
void loop() {
int state = digitalRead(button);
/* check if button is pressed and it is over 5 seconds since last button press */
if (state == HIGH && (millis() - changeTime) > 5000) {
// Call the function to change the lights
changeLights();
}
}
void changeLights() {
digitalWrite(carGreen, LOW); // green off
digitalWrite(carYellow, HIGH); // yellow on
delay(2000); // wait 2 seconds
digitalWrite(carYellow, LOW); // yellow off
digitalWrite(carRed, HIGH); // red on
delay(1000); // wait 1 second till its safe
digitalWrite(pedRed, LOW); // ped red off
digitalWrite(pedGreen, HIGH); // ped green on
delay(crossTime); // wait for preset time period
// flash the ped green
for (int x=0; x<10; x++) {
digitalWrite(pedGreen, HIGH);
delay(250);
digitalWrite(pedGreen, LOW);
delay(250);
}
// turn ped red on
digitalWrite(pedRed, HIGH);
delay(500);
digitalWrite(carYellow, HIGH); // yellow on
digitalWrite(carRed, LOW); // red off
delay(1000);
digitalWrite(carGreen, HIGH);
digitalWrite(carYellow, LOW); // yellow off
// record the time since last change of lights
changeTime = millis();
// then return to the main program loop
}
Pembahasan Sketch
Penggunaan tipe data long untuk mencegah overflow, namun perlu diperhatikan penggunaannya. Dikarenakan chip ATMega328 ini dibuat dengan resource yang minimum, kita harus teliti memilah tipe data agar tidak memboroskan resource.
Untuk menunggu input dari luar sistem, kita tentukan dengan perintah pinMode.
pinMode(button, INPUT); // set pin sebagai input
Kemudian pada fungsi loop() program akan menunggu input dan melakukan pengencekan.
void loop() {<br>
int state = digitalRead(button);<br>
/* check if button is pressed and it is over 5 seconds since last button press */<br>
if (state == HIGH && (millis() - changeTime) > 5000) {<br>
// Call the function to change the lights<br>
changeLights();<br>
}<br>
}
Perintah if diatas akan melakukan cek, jika button ditekan dan waktu sekarang (semenjak Arduino menyala) – kurangi variable changeTime lebih besar dari 5000. Jika kedua syarat dipenuhi maka perintah fungsi changeLights() didalam blok if akan dijalankan.