Proyek 04 – Lampu Lalu Lintas Advanced

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

Proyek Arduino Lalu Lintas Advanced

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.

Sharing is caring: