Pendeteksi Otomatis Ketersediaan Slot Parkir

Pendeteksi Otomatis Ketersediaan Slot Parkir

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