Pada projek kali ini, saya dan rekan saya menggunakan ESP32 dengan Sensor Ultrasonik dan Sensor Inframerah. Ketika slot tersedia maka palang masuk akan terbuka, namun jika slot parkir penuh maka palang masuk tidak akan membuka dan akan ditampilkan teks pada LCD bertuliskan “Parkir Penuh”.
Peralatan yang dibutuhkan :
- Kabel Jumper
- Bread Board
- LCD 16×2
- Arduino Uno
- 2 Servo
- 6 Sensor Inframerah
- 2 Sensor Ultrasonik
Aturan Pin :
- GND (Sensor, Servo, LCD) => Bread Board (-)
- VCC/5V (Sensor, Servo, LCD) => Bread Board (+)
- GND ESP32 => Bread Board (-)
- 5V ESP32 => Bread Board (+)
- Trig Ultrasonik Sensor (PINTU MASUK) => ESP32 (14)
- Echo Ultrasonik Sensor (PINTU MASUK) => ESP32 (12)
- Trig Ultrasonik Sensor (PINTU KELUAR) => ESP32 (33)
- Echo Ultrasonik Sensor (PINTU KELUAR) => ESP32 (25)
- Singal Servo (PINTU MASUK) => ESP32 (32)
- Singal Servo (PINTU KELUAR) => ESP32 (26)
- SDA Lcd => ESP32 (21)
- SCL Lcd => ESP32 (22)
- Out IR Sensor1 => ESP32 (4)
- Out IR Sensor2 => ESP32 (16)
- Out IR Sensor3 => ESP32 (17)
- Out IR Sensor4 => ESP32 (5)
- Out IR Sensor5 => ESP32 (18)
- Out IR Sensor6 => ESP32 (19)

Berikut adalah Code Sourcenya :
#include <ESP32Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi LCD dengan alamat I2C 0x27 dan ukuran 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Definisikan pin untuk sensor ultrasonik dan servo untuk palang masuk
const int trigPinIn = 14; // Pin Trig untuk sensor ultrasonik masuk
const int echoPinIn = 12; // Pin Echo untuk sensor ultrasonik masuk
const int servoInPin = 32; // Pin untuk servo masuk
// Definisikan pin untuk sensor ultrasonik dan servo untuk palang keluar
const int trigPinOut = 25; // Pin Trig untuk sensor ultrasonik keluar
const int echoPinOut = 33; // Pin Echo untuk sensor ultrasonik keluar
const int servoOutPin = 26; // Pin untuk servo keluar
Servo servoMasuk; // Membuat objek servo untuk palang masuk
Servo servoKeluar; // Membuat objek servo untuk palang keluar
// Pin untuk sensor inframerah (untuk memantau status parkir)
const int irSensorPins[6] = {4, 16, 17, 5, 18, 18}; // 6 slot parkir
int irValues[6]; // Untuk menyimpan nilai dari setiap sensor inframerah
const int totalSlots = 6; // Total slot parkir
int availableSlots = totalSlots; // Slot yang tersedia
// Enum untuk status palang
enum State {
IDLE,
OPEN_IN,
OPEN_OUT,
OPEN_BOTH,
CLOSE_IN,
CLOSE_OUT
};
State currentState = IDLE; // Inisialisasi state awal
unsigned long openStartTime; // Untuk menghitung waktu buka
const unsigned long openDuration = 5000; // Durasi buka dalam milidetik
void setup() {
Serial.begin(9600); // Memulai komunikasi serial
lcd.init();
lcd.backlight(); // Nyalakan backlight LCD
// Setup untuk sensor ultrasonik masuk
pinMode(trigPinIn, OUTPUT);
pinMode(echoPinIn, INPUT);
// Setup untuk sensor ultrasonik keluar
pinMode(trigPinOut, OUTPUT);
pinMode(echoPinOut, INPUT);
// Setup pin untuk sensor inframerah
for (int i = 0; i < 6; i++) { // Untuk 6 sensor inframerah
pinMode(irSensorPins[i], INPUT);
}
// Inisialisasi servo dan LCD
servoMasuk.attach(servoInPin);
servoKeluar.attach(servoOutPin);
servoMasuk.write(0); // Servo palang masuk pada posisi awal 0 derajat
servoKeluar.write(0); // Servo palang keluar pada posisi awal 0 derajat
// Menampilkan pesan awal di LCD
lcd.setCursor(0, 0);
lcd.print("Slot Parkir: ");
lcd.print(availableSlots); // Menampilkan slot parkir yang tersedia
}
void updateParkingStatus() {
int occupiedSlots = 6; // Hitung slot yang terisi
// Cek status setiap sensor parkir
for (int i = 0; i < 6; i++) { // Cek 6 slot parkir
irValues[i] = digitalRead(irSensorPins[i]);
if (irValues[i] == 1) {
// Jika sensor terhalang, parkiran terisi
occupiedSlots--; // Hitung slot terisi
}
}
// Hitung slot yang tersedia
availableSlots = totalSlots - occupiedSlots; // Menghitung slot yang tersedia
if (availableSlots < 0) {
availableSlots = 0; // Pastikan tidak kurang dari 0
}
}
long getUltrasonicDistance(int trigPin, int echoPin) {
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH); // Mendapatkan durasi pulsa Echo
distance = duration * 0.034 / 2; // Menghitung jarak dalam cm
return distance;
}
void loop() {
// Update status parkiran
updateParkingStatus();
// Tampilkan status parkiran di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Slot Parkir: ");
lcd.print(availableSlots);
// Mengukur jarak untuk palang masuk
long distanceIn = getUltrasonicDistance(trigPinIn, echoPinIn);
// Mengukur jarak untuk palang keluar
long distanceOut = getUltrasonicDistance(trigPinOut, echoPinOut);
switch (currentState) {
case IDLE:
// Logika palang masuk
if (distanceIn < 10 && availableSlots > 0) {
currentState = OPEN_IN; // Pindah ke state OPEN_IN
openStartTime = millis(); // Mulai timer
}
// Logika palang keluar
else if (distanceOut < 10) {
currentState = OPEN_OUT; // Pindah ke state OPEN_OUT
openStartTime = millis(); // Mulai timer
}
// Cek jika ada kendaraan di kedua sensor
if (distanceIn < 10 && distanceOut < 10) {
currentState = OPEN_BOTH; // Pindah ke state OPEN_BOTH
openStartTime = millis(); // Mulai timer
}
break;
case OPEN_IN:
if (availableSlots > 0) { // Pastikan slot tersedia
servoMasuk.write(90); // Palang masuk terbuka
if (millis() - openStartTime >= openDuration) { // Jika waktu buka sudah lewat
servoMasuk.write(0); // Palang masuk ditutup
currentState = IDLE; // Kembali ke state IDLE
updateParkingStatus(); // Update status parkir
}
} else {
servoMasuk.write(0); // Pastikan palang masuk tertutup
}
break;
case OPEN_OUT:
servoKeluar.write(90); // Palang keluar terbuka
if (millis() - openStartTime >= openDuration) { // Jika waktu buka sudah lewat
servoKeluar.write(0); // Palang keluar ditutup
currentState = IDLE; // Kembali ke state IDLE
}
break;
case OPEN_BOTH:
if (availableSlots > 0) { // Pastikan slot tersedia untuk masuk
servoMasuk.write(90); // Palang masuk terbuka
} else {
servoMasuk.write(0); // Pastikan palang masuk tertutup
}
servoKeluar.write(90); // Palang keluar terbuka
if (millis() - openStartTime >= openDuration) { // Jika waktu buka sudah lewat
servoMasuk.write(0); // Palang masuk ditutup
servoKeluar.write(0); // Palang keluar ditutup
currentState = IDLE; // Kembali ke state IDLE
}
break;
}
// Jika semua sensor mendeteksi objek, set slot parkir menjadi 0
bool allOccupied = true;
for (int i = 0; i < 6; i++) {
if (irValues[i] == 1) {
allOccupied = false;
break;
}
}
if (allOccupied) {
availableSlots = 0; // Set slot parkir menjadi penuh
lcd.setCursor(0, 1);
lcd.print("Parkir Penuh "); // Menampilkan pesan bahwa parkir penuh
}
delay(500); // Delay untuk mengurangi frekuensi pembacaan
}
Selamat Mencoba !!
Jika anda berminat menggunakan jasa labrobotika, silahkan hubungi admin: WHATSAPP



