Urutan traffic lights standar Inggris mengandung arti sebagai berikut :
- Lampu merah,
Setiap kendaraan wajib berhenti tidak lebih dari garis batas - Lampu merah dan lampu kuning,
Setiap kendaraan wajib berhenti namun bersiap untuk melanjutkan perjalanan - Lampu hijau,
Boleh melintasi traffic lights - 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); }