Mahir Arduino Sketch dan Elektro secara praktek

08 - Proyek Lampu Lalu Lintas Advanced

Kali ini, proyek kita akan ditambah fungsinya dari proyek sebelumnya yaitu proyek Lampu Lintas. Fungsi yang ditambahkan adalah lampu penyebrang jalan. Saat penyebrang menekan saklar untuk menyebrang jalan, lampu lalu lintas 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.


Jadi dalam proyek ini kita juga belajar menangkap input dari luar sistem, juga mengenal tipe data baru yaitu unsigned long.

Komponen
2 LED merah
1 LED kuning
2 LED hijau
1 resistor 10 kiloohm 
5 resistor
1 pushbutton

Skema


Sketch

// Project 4 - Interactive Traffic Lights
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
}



Penjelasan Program
Kebanyakan dari program diatas sudah dapat Anda pahami, karena mirip dengan proyek sebelumnya. Disini ada hal baru yaitu tipe data baru unsigned long

unsigned long changeTime = 0;

tipe data integer mampu menyimpan angka dari  −32,768 and 32,767, sementara long −2,147,483,648 to 2,147,483,647. kata keyword unsigned membuat variable changeTime mampu menampung angka 0 to 4,294,967,295. Pemilihan tipe data diatas agar variable tidak overflow dan program menjadi error secara logik.

Sempat terpikir oleh saya, mengapa gak semua pake tipe data long aja.. biar gak pusing. Nah, dikarenakan chip ATMega328  ini dibuat dengan resource yang minimum, kita harus pintar memilah tipe data agar tidak memboroskan resource.

Untuk menunggu input dari luar sistem, kita harus menentukan pin mana yang akan menjadi input.

pinMode(button, INPUT); // set pin sebagai input


Kemudian pada fungsi loop() kita menunggu input dari user, dan melakukan pengecekan, apakah ada input dari luar sistem.

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();
  }
}


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.

Pada Proyek ini, kita juga belajar mengenai pull-down resistor. Untuk lebih detail mengenai pull-down resistor click disini.

Artikel Sebelumnya : Proyek Lampu Lalu Lintas
Artikel Selanjutnya : Proyek LED Chase Effect

7 comments:

  1. Wah,,.. akhirnya berhasil juga buat proyek lampu lalu lintas advanced ini, butuh waktu agak lama buat masang2 kawatnya
    Nice post gan, membantu sekali :D Sip.. Sipp... (y)

    ReplyDelete
  2. @ramadhan, maaf kami jarang melihat posting comment.. :) terima kasih sudah meninggalkan komentar positif.. semoga proyeknya berhasil dan makin pakar arduino.. :)

    ReplyDelete
  3. Makasih kepada kak Admin. Ilmu yang tidak dipakai sendiri. Luar biasa :)

    ReplyDelete
  4. keren artikelnya...boleh saya coba ya mass

    ReplyDelete
  5. boleh tanya jika ingin membuat lampu lalu lintas di perempatan tetapi yang nyala hanya yang kuning saja selama 5 detik kayak lampu lalu lintas di atas jam 10 malam itu seperti apa ya programnya? terimakasih

    ReplyDelete
  6. terimakasih sudah berbagi ilmu, semoga barokah

    ReplyDelete