/*
Buatlah rangakain sistem parkir otomatis dengan menggunakan komponen:
1. Ultrasonik (HC-SR04) untuk mendeteksi kendaraan yang masuk.
2. Servo untuk membuka/menutup pintu parkir.
3. Pushbutton (5 pcs) sebagai pendeteksi ketersediaan tempat parkir
(1 pB = 1 pendeteksi kendaraan).
4. LCD sebagai tampilan ketersediaan parkir.
Dengan kondisi:
1. Jika ultrasonik mendeteksi adanya kendaraan maka servo akan membuka
lalu menutup kembali.
2. Jika pB aktif maka terdeteksi adanya kendaraan yang terparkir,
jika tidak aktif maka tidak ada kendaraan yang terparkir.
3. Jika semua pB dalam keadaan aktif, maka ketersediaan tempat parkir akan penuh dan
lampu merah akan menyala serta diberitahukan di LCD (Servo tidak dapat membuka pintu).
4. Jika terdapat pushbutton dalam keadaan tidak aktif, maka ketersediaan tempat parkir
ada yang kosong dan lampu hijau akan menyala serta ditampilkan di LCD.
*/
// 1. Inisialisasi pin sensor ultrasonik (HC-SR04) dan variabelnya
#define TRIG_PIN 2
#define ECHO_PIN 3
int tds = 0; // telah dilewati sensor
long durasi, jarak;
int lewat = 0;
// 2. Perpustakaan motor servo dan variabelnya
#include <Servo.h>
Servo pintuParkir;
int pos = 90;
// 3. Inisialisasi car (pin pushbutton)
#define pB1 4
#define pB2 5
#define pB3 6
#define pB4 7
#define car5 8
int npb1 = 0;
int npb2 = 0;
int npb3 = 0;
int npb4 = 0;
int totalNPB;
// 4. Perpustakaan LCD dengan I2C
#include<Wire.h>
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
// 5. Inisialisasi pin LED merah dan LED hijau
#define lampuMerah 9
#define lampuBiru 10
// Inisialisasi variabel
void setup() {
// Setup serial monitor
Serial.begin(9600);
// Setup sensor HC-SR04
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Setup LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Loading...");
// Inisialisasi pintu parkir (pin motor servo)
pintuParkir.attach(11);
}
void ultrasonik() {
// Program untuk pembacaan sensor HC-SR04
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
durasi = pulseIn(ECHO_PIN, HIGH);
jarak = durasi * 0.0343 / 2;
Serial.print("Jarak sensor : ");
Serial.print(jarak);
Serial.println(" cm");
// Tunggu sebentar sebelum pengukuran berikutnya
delay(2);
}
void loop() {
npb1 = digitalRead(pB1);
npb2 = digitalRead(pB2);
npb3 = digitalRead(pB3);
npb4 = digitalRead(pB4);
totalNPB = npb1 + npb2 + npb3 + npb4;
Serial.print("Total lahan parkir: ");
Serial.print(totalNPB);
Serial.println(" dari 4");
delay(500);
ultrasonik();
/*
Jika jarak lebih besar dari 0
(ada bug pembacaan sensor HC-SR04, makanya lebih besar dari 0)
dan jarak lebih kecil dari 10 cm maka, pintu parkir terbuka.
*/
if (totalNPB < 4) {
digitalWrite(lampuMerah, LOW);
digitalWrite(lampuBiru, HIGH);
if (jarak > 0 && jarak < 10) {
for (pos = 90; pos >= 0; pos -= 1) {
pintuParkir.write(pos);
delay(20);
}
delay(2000);
for (pos = 0; pos <= 90; pos += 1) {
pintuParkir.write(pos);
delay(20);
}
}
}
if (totalNPB >= 4) {
digitalWrite(lampuMerah, HIGH);
digitalWrite(lampuBiru, LOW);
pintuParkir.write(90);
Serial.println("PARKIR PENUH!");
}
Serial.println(" ");
}