Cara Membuat Gerbang Parkir Otomatis dengan Arduino Uno — Simulasi Online
Gerbang parkir otomatis menggabungkan tiga perangkat sekaligus: HC-SR04 sebagai mata yang mendeteksi mobil, servo sebagai palang, dan buzzer sebagai penanda suara. Saat ada benda lebih dekat dari 30 cm, palang membuka dengan sendirinya.
Komponen yang dipakai
- Arduino Uno
- Breadboard (setengah)
- Sensor jarak (HC-SR04)
- Palang parkir (servo)
- Buzzer
Cara kerja
- HC-SR04 (TRIG D12, ECHO D11) mengukur jarak benda di depan gerbang setiap 300 ms.
- Bila jarak di bawah 30 cm dan palang masih tertutup, program memerintahkan palang membuka.
- Servo di D9 bergerak perlahan langkah 5 derajat sampai tegak 90 derajat.
- Selama palang bergerak, buzzer di D8 membunyikan nada 880 Hz; bila benda menjauh, palang menutup kembali.
Konsep yang dipelajari
Kode program
/*
Gerbang Parkir Otomatis: HC-SR04 mendeteksi mobil, palang parkir membuka
dan buzzer berbunyi saat palang bergerak.
Rangkaian: HC-SR04 (VCC -> 5V, GND -> GND, TRIG -> D12, ECHO -> D11),
palang parkir (VCC -> 5V, GND -> GND, SIG -> D9),
buzzer (+ -> D8, - -> GND).
Atur "Jarak benda" pada HC-SR04 di kanvas untuk mensimulasikan mobil
yang datang dan pergi.
Pustaka: Servo (bawaan Arduino).
*/
#include <Servo.h>
Servo palang;
const int PIN_SERVO = 9;
const int PIN_TRIG = 12;
const int PIN_ECHO = 11;
const int PIN_BUZZER = 8;
const int JARAK_BUKA = 30; // cm: mobil dianggap datang kalau lebih dekat dari ini
bool palangTerbuka = false;
int posisiPalang = 0; // 0 = tertutup (horizontal), 90 = terbuka (tegak)
long bacaJarakCm() {
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
long durasi = pulseIn(PIN_ECHO, HIGH);
return durasi / 58;
}
// Menggerakkan palang perlahan ke sudut target sambil membunyikan buzzer.
void gerakkanPalang(int target) {
int langkah = (target > posisiPalang) ? 5 : -5;
tone(PIN_BUZZER, 880);
for (int sudut = posisiPalang; sudut != target; sudut += langkah) {
palang.write(sudut);
delay(40);
}
palang.write(target);
noTone(PIN_BUZZER);
posisiPalang = target;
}
void setup() {
palang.attach(PIN_SERVO);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(PIN_BUZZER, OUTPUT);
palang.write(0);
Serial.begin(9600);
Serial.println(F("Gerbang parkir siap."));
}
void loop() {
long jarak = bacaJarakCm();
Serial.print(F("Jarak: "));
Serial.print(jarak);
Serial.println(F(" cm"));
if (jarak < JARAK_BUKA && !palangTerbuka) {
Serial.println(F("Mobil datang, palang dibuka."));
gerakkanPalang(90);
palangTerbuka = true;
} else if (jarak >= JARAK_BUKA && palangTerbuka) {
Serial.println(F("Mobil pergi, palang ditutup."));
gerakkanPalang(0);
palangTerbuka = false;
}
delay(300);
}