#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// Lampu Lalu Lintas Simpang 3
byte led1 = 13; //merah atas
byte led2 = 12; //kuning atas
byte led3 = 11; //Hijau atas
byte led4 = 10; //Merah kiri
byte led5 = 9; //Kuning Kiri
byte led6 = 8; //Hijau Kiri
byte led7 = 7; //Merah kanan
byte led8 = 6; //Kuning kanan
byte led9 = 5; //Hijau Kanan
// Garasi Mobil Otomatis
#define apin 4
#define bpin 2
Servo myservo;
int rotasi = 90;
int interval = 0;
// Lampu Jalan Otomatis
int trigPin = 11;
int echoPin = 12;
int LEDPin = 13;
long duration, cm, inches;
// Palang Kereta Api Otomatis
#define ECHO_PIN 3
#define TRIG_PIN 2
#define pinBuzzer 13
// Pendeteksi Banjir
#define ECHO_PIN_BANJIR 2
#define TRIG_PIN_BANJIR 3
#define buzzer 4
#define ledmerah 13
#define ledkuning 12
#define ledhijau 11
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Sensor Parkir
int trigPinParkir = 11;
int echoPinParkir = 12;
int LEDPinParkir = 13;
void setup() {
// Lampu Lalu Lintas Simpang 3
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(led8, OUTPUT);
pinMode(led9, OUTPUT);
// Garasi Mobil Otomatis
pinMode(bpin, OUTPUT);
pinMode(apin, INPUT);
myservo.attach(9);
myservo.write(90);
// Lampu Jalan Otomatis
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LEDPin, OUTPUT);
// Palang Kereta Api Otomatis
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(pinBuzzer, OUTPUT);
myservo.attach(9);
myservo.write(90);
// Pendeteksi Banjir
pinMode(ledmerah, OUTPUT);
pinMode(ledkuning, OUTPUT);
pinMode(ledhijau, OUTPUT);
pinMode(TRIG_PIN_BANJIR, OUTPUT);
pinMode(ECHO_PIN_BANJIR, INPUT);
pinMode(buzzer, OUTPUT);
lcd.init();
lcd.backlight();
lcd.clear();
// Sensor Parkir
pinMode(trigPinParkir, OUTPUT);
pinMode(echoPinParkir, INPUT);
pinMode(LEDPinParkir, OUTPUT);
}
void loop() {
// Lampu Lalu Lintas Simpang 3
digitalWrite(led3, HIGH); //Hijau atas
digitalWrite(led4, HIGH); //Merah Kiri
digitalWrite(led7, HIGH); //Merah Kanan
delay(5000);
digitalWrite(led3, LOW); //Hijau Atas
digitalWrite(led7, LOW); //Merah Kanan
digitalWrite(led2, HIGH); //Kuning atas
digitalWrite(led8, HIGH); //kuning Kanan
delay(800);
digitalWrite(led2, LOW); //Kuning atas
digitalWrite(led8, LOW); //kuning Kanan
//KONDISI 2
digitalWrite(led9, HIGH); //Hijau Kanan
digitalWrite(led4, HIGH); //Merah Kiri
digitalWrite(led1, HIGH); //Merah Atas
delay(5000);
digitalWrite(led9, LOW); //Hijau Kanan
digitalWrite(led4, LOW); //Merah Kiri
digitalWrite(led8, HIGH); //kuning Kanan
digitalWrite(led5, HIGH); //Kuning Kiri
delay(800);
digitalWrite(led8, LOW); //kuning Kanan
digitalWrite(led5,LOW); //Kuning Kiri
//KONDISI 3
digitalWrite(led6, HIGH); // Hijau Kiri
digitalWrite(led7, HIGH); //Merah Kanan
digitalWrite(led1, HIGH); //Merah atas
delay(5000);
digitalWrite(led6, LOW); //Hijau Kiri
digitalWrite(led1, LOW); //Merah Atas
digitalWrite(led2, HIGH); //Kuning atas
digitalWrite(led5, HIGH); //Kuning Kiri
digitalWrite(led8, HIGH); //kuning Kanan
delay(800);
digitalWrite(led2, LOW); //Kuning atas
digitalWrite(led5,LOW); //Kuning Kiri
// Garasi Mobil Otomatis
tutupPintugarasi();
interval += 100;
if (interval > 1000) interval = 0;
// Lampu Jalan Otomatis
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
long duration = pulseIn(echoPin, HIGH);
cm = (duration / 2) / 29.1;
inches = (duration / 2) / 74;
if (cm <= 351) {
digitalWrite(LEDPin, HIGH);
} else {
digitalWrite(LEDPin, LOW);
}
// Palang Kereta Api Otomatis
tutupPalang();
interval += 100;
if (interval > 1000) interval = 0;
// Pendeteksi Banjir
float kdlm = kedalaman();
if (kdlm > 370) {
digitalWrite(ledmerah, HIGH);
digitalWrite(ledkuning, LOW);
digitalWrite(ledhijau, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Kdlmn :");
lcd.setCursor(7, 0);
lcd.print(kdlm);
lcd.setCursor(14, 0);
lcd.print("cm");
lcd.setCursor(0, 1);
lcd.print("Satus :");
lcd.setCursor(9, 1);
lcd.print("Bahaya");
tone(4, 800, 1000);
delay(1000);
lcd.clear();
delay(100);
} else {
if (kdlm >= 320 && kdlm < 370) {
digitalWrite(ledmerah, LOW);
digitalWrite(ledkuning, HIGH);
digitalWrite(ledhijau, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Kdlmn :");
lcd.setCursor(7, 0);
lcd.print(kdlm);
lcd.setCursor(14, 0);
lcd.print("cm");
lcd.setCursor(0, 1);
lcd.print("Satus :");
lcd.setCursor(9, 1);
lcd.print("Siaga");
delay(1000);
lcd.clear();
delay(100);
} else {
digitalWrite(ledmerah, LOW);
digitalWrite(ledkuning, LOW);
digitalWrite(ledhijau, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Kdlmn :");
lcd.setCursor(7, 0);
lcd.print(kdlm);
lcd.setCursor(14, 0);
lcd.print("cm");
lcd.setCursor(0, 1);
lcd.print("Satus :");
lcd.setCursor(9, 1);
lcd.print("Aman");
delay(1000);
lcd.clear();
delay(100);
}
}
// Sensor Parkir
digitalWrite(trigPinParkir, LOW);
delayMicroseconds(5);
digitalWrite(trigPinParkir, HIGH);
delayMicroseconds(10);
digitalWrite(trigPinParkir, LOW);
pinMode(echoPinParkir, INPUT);
duration = pulseIn(echoPinParkir, HIGH);
cm = (duration / 2) / 29.1;
inches = (duration / 2) / 74;
if (cm < 100) {
digitalWrite(LEDPinParkir, LOW);
} else {
digitalWrite(LEDPinParkir, HIGH);
}
}
// Fungsi-fungsi tambahan
float readDistanceCM() {
digitalWrite(bpin, LOW);
delayMicroseconds(1);
digitalWrite(bpin, HIGH);
delayMicroseconds(10);
digitalWrite(bpin, LOW);
int duration = pulseIn(apin, HIGH);
return duration * 0.034 / 2;
}
float kedalaman() {
digitalWrite(TRIG_PIN_BANJIR, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN_BANJIR, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN_BANJIR, LOW);
int durasi = pulseIn(ECHO_PIN_BANJIR, HIGH);
return 0 + durasi * 0.034 / 2;
}
// Garasi Mobil Otomatis
void tutupPintugarasi() {
float jarak = readDistanceCM();
if (jarak > 0 && jarak < 50) {
tutup();
} else {
buka();
}
}
void tutup() {
if (rotasi <= 90) {
myservo.write(rotasi);
delay(10);
rotasi--;
}
if (rotasi <= 0) rotasi = 0;
}
void buka() {
if (rotasi <= 90) {
myservo.write(rotasi);
delay(10);
rotasi += 4;
}
if (rotasi >= 90) rotasi = 90;
}
//
void tutupPalang() {
float jarak = readDistanceCM();
if (jarak > 0 && jarak < 100) {
soundBuzzer();
tutup();
} else {
buka();
noTone(pinBuzzer);
}
}
void soundBuzzer() {
if (interval < 500) {
tone(pinBuzzer, 250);
} else if (interval > 500) {
tone(pinBuzzer, 100, 800);
}
}