// fixed portal masuk mobil (kayshan)
#include <Servo.h>
Servo myservo;
float cm = 0;
const int buzzer = 8; // Pin untuk buzzer
const int greenLED = 10; // Pin untuk lampu hijau
const int yellowLED = 11; // Pin untuk lampu kuning
const int redLED = 12; // Pin untuk lampu merah
const int trigPin = 6; // Pin trigger sensor ultrasonik
const int echoPin = 7; // Pin echo sensor ultrasonik
bool gateOpen = false; // Status apakah gerbang terbuka
unsigned long gateOpenTime = 0; // Waktu terakhir gerbang dibuka
const unsigned long gateCloseDelay = 5000; // Waktu tunda sebelum gerbang ditutup (ms)
// Fungsi untuk membaca jarak dari sensor ultrasonik
float readUltrasonicDistance(int triggerPin, int echoPin) {
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
long duration = pulseIn(echoPin, HIGH, 30000); // Timeout 30ms
if (duration == 0) {
return -1; // Jika tidak ada pembacaan
}
return duration * 0.01723; // Konversi ke cm
}
void resetIndicators() {
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, LOW);
digitalWrite(buzzer, LOW);
}
void openGate() {
if (!gateOpen) { // Hanya buka gerbang jika status tertutup
for (int pos = 0; pos <= 90; pos += 2) { // Gerbang membuka hingga 90 derajat
myservo.write(pos);
delay(15);
}
gateOpen = true; // Tandai gerbang sudah terbuka
gateOpenTime = millis(); // Catat waktu saat dibuka
}
}
void closeGate() {
if (gateOpen) { // Hanya tutup gerbang jika status terbuka
for (int pos = 90; pos >= 0; pos -= 2) { // Gerbang menutup kembali
myservo.write(pos);
delay(15);
}
gateOpen = false; // Tandai gerbang sudah tertutup
}
}
void setup() {
pinMode(buzzer, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
myservo.attach(9); // Servo terhubung ke pin 9
myservo.write(0); // Servo pada posisi awal (gerbang tertutup)
Serial.begin(9600); // Inisialisasi komunikasi serial
}
void loop() {
cm = readUltrasonicDistance(trigPin, echoPin);
resetIndicators();
if (cm > 0 && cm < 30) { // Jarak kurang dari 30 cm
Serial.print(cm);
Serial.println(" cm - Objek terlalu dekat!");
digitalWrite(greenLED, HIGH); // Nyalakan lampu hijau
digitalWrite(buzzer, HIGH); // Bunyikan buzzer
openGate(); // Buka gerbang jika belum terbuka
}
else if (cm >= 30 && cm < 70) { // Jarak antara 30-70 cm
Serial.print(cm);
Serial.println(" cm - Objek di jarak sedang.");
digitalWrite(yellowLED, HIGH); // Nyalakan lampu kuning
}
else if (cm >= 70 && cm < 110) { // Jarak antara 70-110 cm
Serial.print(cm);
Serial.println(" cm - Objek agak jauh.");
digitalWrite(redLED, HIGH); // Nyalakan lampu merah
}
else if (cm >= 110) { // Tidak ada objek terdeteksi
Serial.print(cm);
Serial.println(" cm - Tidak ada objek terdeteksi.");
}
else {
Serial.println("Sensor error! Jarak tidak valid.");
}
// Tutup gerbang setelah waktu tertentu jika sudah terbuka
if (gateOpen && (millis() - gateOpenTime >= gateCloseDelay)) {
closeGate();
}
}