Traffic lights (UK sequence) dengan arduino

Urutan traffic lights standar Inggris mengandung arti sebagai berikut :

  1. Lampu merah,
    Setiap kendaraan wajib berhenti tidak lebih dari garis batas
  2. Lampu merah dan lampu kuning,
    Setiap kendaraan wajib berhenti namun bersiap untuk melanjutkan perjalanan
  3. Lampu hijau,
    Boleh melintasi traffic lights
  4. Lampu kuning,
    Bersiap untuk berhenti di belakang garis batas, tetapi jika sudah melewati garis batas masih di perbolehkan jalan.

Jumlah keseluruhan lampu yang dibutuhkan untuk 4 simpang adalah 12 buah, untuk menghemat jalur pin arduino, maka bisa diterapkan sistem scan yang menggunakan 3 jalur lampu, (untuk merah, kuning, hijau), serta 4 jalur untuk masing-masing posisi trafic led, sehingga untuk 4 simpang diperlukan 7 jalur pengontrolan saja.

skema traffic lights berbasis arduino:

program Urutan traffic lights menggunakan arduino:

#define jumlahTrafficLight    4

byte pinDigit[] = {7, 6, 5, 4};
byte pinRYG[] = {10, 9, 8};

#define lampuMerah    (1 << 2)
#define lampuKuning   (1 << 1)
#define lampuHijau    (1 << 0)

byte hijauSekarang;
byte hijauSelanjutnya;
byte timingTraffic;

struct traffic {
  byte lampu;
  byte lampuSelanjutnya;
  uint32_t waktu;
};

traffic skemaTraffic[] = {
  {lampuHijau  , lampuMerah               , 5000},
  {lampuKuning , lampuMerah               , 1000},
  {lampuMerah  , lampuMerah | lampuKuning , 1000},
};

byte lampuTraffic[jumlahTrafficLight];
byte indexTraffic;
byte indexScan;
uint32_t millisTraffic;
byte jalurDarurat;

void setup() {

  for (byte i = 0; i < jumlahTrafficLight; i++)
  {
    pinMode(pinDigit[i], OUTPUT);
  }
  for (byte i = 0; i < 3; i++)
  {
    pinMode(pinRYG[i], OUTPUT);
  }

  Serial.begin(9600);

  for (byte i = 0 ; i < jumlahTrafficLight; i++)
  {
    lampuTraffic[i] = skemaTraffic[2].lampu;
  }
  hijauSekarang = 0;
  hijauSelanjutnya = 1;

}

void loop() {

  if (millisTraffic < millis())
  {
    lampuTraffic[hijauSekarang] = skemaTraffic[indexTraffic].lampu;
    lampuTraffic[hijauSelanjutnya] = skemaTraffic[indexTraffic].lampuSelanjutnya;
    millisTraffic += skemaTraffic[indexTraffic].waktu;

    indexTraffic++;
    if (indexTraffic == 3)
    {
      indexTraffic = 0;
      hijauSekarang = hijauSelanjutnya;
      hijauSelanjutnya = (hijauSekarang + 1) % jumlahTrafficLight;
    }
  }

  trafficScan();
}

void trafficScan()
{
  digitalWrite(pinDigit[indexScan], HIGH);
  indexScan++;
  indexScan %= jumlahTrafficLight;
  digitalWrite(pinRYG[0], lampuTraffic[indexScan] & lampuMerah);
  digitalWrite(pinRYG[1], lampuTraffic[indexScan] & lampuKuning);
  digitalWrite(pinRYG[2], lampuTraffic[indexScan] & lampuHijau);
  digitalWrite(pinDigit[indexScan], LOW);

}

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *