#include <Wire.h> // Library untuk komunikasi I2C
#include <LiquidCrystal_I2C.h> // Library untuk LCD dengan I2C
// Inisialisasi objek untuk LCD dengan jumlah kolom dan baris
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat modul I2C dapat bervariasi (0x27 umumnya digunakan)
// Definisikan pin untuk sensor gerak PIR
const int pirPin1 = 10; // Sensor PIR di persimpangan 1
const int pirPin2 = 11; // Sensor PIR di persimpangan 2
const int pirPin3 = 12; // Sensor PIR di persimpangan 3
const int pirPin4 = 13; // Sensor PIR di persimpangan 4
// Variabel untuk melacak persimpangan dan fase saat ini
int persimpanganSaatIni = 1; // Persimpangan awal
int faseSaatIni = 1; // Fase awal, 1: merah, 2: kuning, 3: hijau
void setup() {
// Inisialisasi LCD
lcd.init();
lcd.backlight(); // Hidupkan lampu latar
// Tampilkan pesan selamat datang
lcd.setCursor(0, 0);
lcd.print("Proyek Lalu Lintas");
lcd.setCursor(0, 1);
lcd.print("Dena Mahendra");
lcd.setCursor(0, 2);
lcd.print("41220013");
delay(2000); // Tunda selama 2 detik
lcd.clear(); // Bersihkan LCD setelah menampilkan pesan selamat datang
// Konfigurasi mode pin untuk lampu sebagai output
for (int i = 1; i <= 12; i++) {
pinMode(i, OUTPUT);
}
// Konfigurasi mode pin untuk sensor PIR sebagai input
pinMode(pirPin1, INPUT);
pinMode(pirPin2, INPUT);
pinMode(pirPin3, INPUT);
pinMode(pirPin4, INPUT);
// Mulai komunikasi serial pada baud rate 9600
Serial.begin(9600);
}
void loop() {
// Baca nilai sensor gerak di setiap persimpangan
int gerakan1 = digitalRead(pirPin1);
int gerakan2 = digitalRead(pirPin2);
int gerakan3 = digitalRead(pirPin3);
int gerakan4 = digitalRead(pirPin4);
// Debugging
Serial.print("Gerakan terdeteksi di Persimpangan 1: ");
Serial.println(gerakan1);
Serial.print("Gerakan terdeteksi di Persimpangan 2: ");
Serial.println(gerakan2);
Serial.print("Gerakan terdeteksi di Persimpangan 3: ");
Serial.println(gerakan3);
Serial.print("Gerakan terdeteksi di Persimpangan 4: ");
Serial.println(gerakan4);
// Tampilkan status gerakan pada LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Gerakan:");
lcd.setCursor(8, 0);
lcd.print(gerakan1);
lcd.setCursor(10, 0);
lcd.print(gerakan2);
lcd.setCursor(12, 0);
lcd.print(gerakan3);
lcd.setCursor(14, 0);
lcd.print(gerakan4);
// Tunda sebentar agar pesan dapat dibaca
delay(2000);
// Tampilkan pesan di LCD jika terdeteksi gerakan
if (gerakan1 == HIGH || gerakan2 == HIGH || gerakan3 == HIGH || gerakan4 == HIGH) {
lcd.clear(); // Bersihkan LCD sebelum menampilkan pesan baru
lcd.setCursor(0, 0);
lcd.print("Gerakan terdeteksi!");
delay(2000); // Tunda selama 5 detik agar pesan dapat dibaca
} else {
// Jika tidak ada gerakan, tampilkan pesan di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tidak ada gerakan");
delay(2000); // Tunda selama 5 detik agar pesan dapat dibaca
}
// Matikan lampu di semua persimpangan
matikanSemuaLampu();
// Atur lampu pada persimpangan yang sesuai berdasarkan fase
switch (persimpanganSaatIni) {
case 1:
// Persimpangan 1
switch (faseSaatIni) {
case 1:
// Merah
digitalWrite(1, HIGH);
break;
case 2:
// Kuning
digitalWrite(2, HIGH);
break;
case 3:
// Hijau
digitalWrite(3, HIGH);
break;
}
break;
case 2:
// Persimpangan 2
switch (faseSaatIni) {
case 1:
// Merah
digitalWrite(4, HIGH);
break;
case 2:
// Kuning
digitalWrite(5, HIGH);
break;
case 3:
// Hijau
digitalWrite(6, HIGH);
break;
}
break;
case 3:
// Persimpangan 3
switch (faseSaatIni) {
case 1:
// Merah
digitalWrite(7, HIGH);
break;
case 2:
// Kuning
digitalWrite(8, HIGH);
break;
case 3:
// Hijau
digitalWrite(9, HIGH);
break;
}
break;
case 4:
// Persimpangan 4
switch (faseSaatIni) {
case 1:
// Merah
digitalWrite(10, HIGH);
break;
case 2:
// Kuning
digitalWrite(11, HIGH);
break;
case 3:
// Hijau
digitalWrite(12, HIGH);
break;
}
break;
}
// Tambahkan penundaan antara perpindahan lampu pada persimpangan
delay(3000); // Tunda selama 3 detik
// Pindahkan ke persimpangan berikutnya
persimpanganSaatIni = (persimpanganSaatIni % 4) + 1;
// Pindahkan ke fase berikutnya
faseSaatIni = (faseSaatIni % 3) + 1;
}
// Fungsi untuk mematikan lampu di semua persimpangan
void matikanSemuaLampu() {
// Matikan semua lampu
for (int i = 1; i <= 12; i++) {
digitalWrite(i, LOW);
}
}