// =====================================================
// PROYEK: Lampu Lalu Lintas Otomatis
// SENSOR: PIR + Ultrasonik HC-SR04 (di atas jalan)
// LOGIKA: Semakin dekat kendaraan ke sensor, semakin panjang waktu hijau
// =====================================================
#define TRIG 8
#define ECHO 9
#define PIR 7
#define lampuMerah 2
#define lampuKuning 3
#define lampuHijau 4
const unsigned long waktuMerahDasar = 20000; // 20 detik
const unsigned long waktuKuning = 500; // 0.5 detik
unsigned long waktuHijau;
// =====================================================
// Fungsi baca jarak (cm)
// =====================================================
long bacaJarak() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long durasi = pulseIn(ECHO, HIGH);
long jarak = durasi * 0.034 / 2;
return jarak;
}
// =====================================================
// Tentukan waktu hijau berdasarkan JARAK kendaraan
// =====================================================
unsigned long hitungWaktuHijau(long jarakKendaraan) {
if (jarakKendaraan > 30) {
Serial.println("š¢ Jalan lancar ā antrean sangat pendek");
return 10000; // 10 detik
} else if (jarakKendaraan > 22) {
Serial.println("š” Antrean sedikit ā lalu lintas cukup ramai");
return 15000; // 15 detik
} else if (jarakKendaraan > 14) {
Serial.println("š Antrean panjang ā lalu lintas padat");
return 20000; // 20 detik
} else {
Serial.println("š“ Antrean sangat panjang ā kendaraan menumpuk");
return 25000; // 25 detik
}
}
// =====================================================
// Setup
// =====================================================
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(PIR, INPUT);
pinMode(lampuMerah, OUTPUT);
pinMode(lampuKuning, OUTPUT);
pinMode(lampuHijau, OUTPUT);
Serial.begin(9600);
Serial.println("=== SISTEM LAMPU LALU LINTAS OTOMATIS (30ā8 cm) ===");
Serial.println("Sensor ultrasonik di atas jalan mendeteksi panjang antrean kendaraan");
Serial.println("----------------------------------------------------------");
delay(2000);
}
// =====================================================
// Loop utama
// =====================================================
void loop() {
// ---------------- Lampu Merah ----------------
digitalWrite(lampuMerah, HIGH);
digitalWrite(lampuKuning, LOW);
digitalWrite(lampuHijau, LOW);
Serial.println("\nš¦ Lampu MERAH - menunggu kendaraan...");
bool kendaraanDatang = false;
unsigned long waktuMulaiMerah = millis();
while (millis() - waktuMulaiMerah < waktuMerahDasar) {
int gerakan = digitalRead(PIR);
if (gerakan == HIGH) {
kendaraanDatang = true;
Serial.println("š” PIR: Deteksi kendaraan baru datang!");
long jarak = bacaJarak();
Serial.print("š Jarak kendaraan paling belakang: ");
Serial.print(jarak);
Serial.println(" cm");
waktuHijau = hitungWaktuHijau(jarak);
Serial.print("ā±ļø Waktu hijau ditetapkan: ");
Serial.print(waktuHijau / 1000);
Serial.println(" detik");
delay(2000);
}
}
if (!kendaraanDatang) {
waktuHijau = 10000; // default jika tidak ada kendaraan
Serial.println("Tidak ada kendaraan baru, waktu hijau default: 10 detik");
}
// ---------------- Lampu Kuning ----------------
digitalWrite(lampuMerah, LOW);
digitalWrite(lampuKuning, HIGH);
Serial.println("ā ļø Lampu KUNING - bersiap...");
delay(waktuKuning);
// ---------------- Lampu Hijau ----------------
digitalWrite(lampuKuning, LOW);
digitalWrite(lampuHijau, HIGH);
Serial.println("ā
Lampu HIJAU - kendaraan bergerak...");
delay(waktuHijau);
// ---------------- Kembali ke Merah ----------------
digitalWrite(lampuHijau, LOW);
Serial.println("š Siklus selesai, kembali ke MERAH.\n");
}