//=== Deklarasi variabel ===
#include <Wire.h> //I2C
#include <Servo.h> //Servo
#include <Adafruit_GFX.h> //OLED
#include <Adafruit_SSD1306.h> //OLED
#define SCREEN_WIDTH 128 //Lebar display OLED
#define SCREEN_HEIGHT 64 //Tinggi display OLED
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); //Inisialisasi obejek layar OLED
int
mobilMasuk = 0,
mobilKeluar = 0,
slotTerisi = 0,
slotParkir = 80; //Kapasitas parkiran
//Entry Gates
int
buttonPinMasuk = 14, //Tombol dipasang pada pin 4
servoPinMasuk = 3, //Output servo dipasang pada pin 3
echoPinMasuk = 4, //Pin echo ultrasonik dipasang pada pin 5
trigPinMasuk = 5, //Pin trigger ultrasonik dipasang pada pin 6
ledGMasuk = 6, //LED hijau dipasang pada pin 7
ledRMasuk = 7, //LED merah dipasang pada pin 8
durationMasuk;
float jarakMasuk;
Servo myServoMasuk; //Kontrol servo motor
//Exit Gates
int
buttonPinKeluar = 8, //Tombol dipasang pada pin 8
servoPinKeluar = 9, //Output servo dipasang pada pin 9
echoPinKeluar = 10, //Pin echo ultrasonik dipasang pada pin 10
trigPinKeluar = 11, //Pin trigger ultrasonik dipasang pada pin 11
ledGKeluar = 12, //LED hijau dipasang pada pin 12
ledRKeluar = 13, //LED merah dipasang pada pin 13
durationKeluar;
float jarakKeluar;
Servo myServoKeluar; //Kontrol servo motor
//=== Pengesetan awal ===
void setup() {
Serial.begin(9600); //Inisialisasi komunikasi serial
//Entry Gates
pinMode(buttonPinMasuk, INPUT_PULLUP);//tombol sebagai masukan
pinMode(echoPinMasuk, INPUT); //Pin echo sebagai masukan
pinMode(trigPinMasuk, OUTPUT); //Pin trigger sebagai luaran
pinMode(ledGMasuk, OUTPUT); //LED sebagai luaran
pinMode(ledRMasuk, OUTPUT); //LED merah sebagai luaran
myServoMasuk.attach(servoPinMasuk); //Menghubungkan servo ke pin
//Exit Gates
pinMode(buttonPinKeluar, INPUT_PULLUP);//tombol sebagai masukan
pinMode(echoPinKeluar, INPUT); //Pin echo sebagai masukan
pinMode(trigPinKeluar, OUTPUT); //Pin trigger sebagai luaran
pinMode(ledGKeluar, OUTPUT); //LED sebagai luaran
pinMode(ledRKeluar, OUTPUT); //LED merah sebagai luaran
myServoKeluar.attach(servoPinKeluar); //Menghubungkan servo ke pin
//Inisialisasi layar OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { //Alamat I2C OLED 128x32
Serial.println(F("SSD1306 allocation failed")); //Tampilkan pada serial
while (true); //Hentikan program
}//if
//Atur kondisi awal
myServoMasuk.write(90); //Servo posisi 90 derajat(palang tertutup)
myServoKeluar.write(90); //Servo posisi 90 derajat(palang tertutup)
digitalWrite(ledRMasuk, HIGH); //Nyalakan LED
digitalWrite(ledGMasuk, LOW); //Matikan LED
digitalWrite(ledRKeluar, HIGH); //Nyalakan LED
digitalWrite(ledGKeluar, LOW); //Matikan LED
updateDisplay(); //Tampilkan teks pada OLED
}//setup
//=== Program utama (pengulangan) ===
void loop() {
if (digitalRead(buttonPinMasuk) == LOW) { //Jika tombol aktif
entryGates(); //Jalankan fungsi palang masuk
}//if
if (digitalRead(buttonPinKeluar) == LOW) { //Jika tombol aktif
exitGates(); //Jalankan fungsi palang keluar
}//if
}//loop
//=== Program palang masuk ===
void entryGates() {
display.clearDisplay(); //Bersihkan layar
display.setCursor(23, 30); //Atur posisi
display.println("Silahkan Masuk"); //Tampilkan pada OLED
display.display(); //Tampilkan setiap perubahan pada OLED
myServoMasuk.write(0); //Servo posisi 0 derajat (palang terbuka)
digitalWrite(ledGMasuk, HIGH); //Nyalakan LED hijau
digitalWrite(ledRMasuk, LOW); //Matikan LED merah
delay(500); //Jeda
while (entryDistance() > 10) { //Ukur jarak saat mobil mendekati palang
delay(500); //Jeda
}//while
while (entryDistance() <= 10) { //Ukur jarak saat mobil melewati sensor ultrasonik
delay(500); //jeda
}//while
myServoMasuk.write(90); //Servo posisi 90 derajat (palang tertutup)
digitalWrite(ledRMasuk, HIGH); //Nyalakan LED merah
digitalWrite(ledGMasuk, LOW); //Matikan LED hijau
mobilMasuk++; //Catat jumlah mobil yang masuk
slotTerisi++; //Hitung jumlah mobil di parkiran
updateDisplay(); //Tampilkan teks pada OLED
delay(500); //Jeda
}//entryGates
//=== Program palang keluar ===
void exitGates() {
myServoKeluar.write(0); //Servo posisi 0 derajat (palang terbuka)
digitalWrite(ledGKeluar, HIGH); //Nyalakan LED hijau
digitalWrite(ledRKeluar, LOW); //Matikan LED merah
delay(500); //Jeda
while (exitDistance() > 10) { //Ukur jarak saat mobil mendekati palang
delay(500); //Jeda
}//while
while (exitDistance() <= 10) { //Ukur jarak saat mobil melewati sensor ultrasonik
delay(500); //jeda
}//while
myServoKeluar.write(90); //Servo posisi 90 derajat (palang tertutup)
digitalWrite(ledRKeluar, HIGH); //Nyalakan LED merah
digitalWrite(ledGKeluar, LOW); //Matikan LED hijau
mobilKeluar++; //Catat jumlah mobil yang keluar
slotTerisi--; //Hitung jumlah mobil di parkiran
updateDisplay(); //Tampilkan teks pada OLED
delay(500); //Jeda
}//exitGates
//=== Program pengukuran jarak ===
float entryDistance() {
digitalWrite(trigPinMasuk, LOW); //Mengirimkan sinyal LOW ke pin trigger untuk memastikan keadaan awal yang stabil
delayMicroseconds(2); //Jeda
digitalWrite(trigPinMasuk, HIGH); //Mengirim sinyal HIGH ke pin trigger untuk memulai pengiriman sinyal ultrasonik
delayMicroseconds(10); //Jeda
digitalWrite(trigPinMasuk, LOW); //Menghentikan pengiriman sinyal ultrasonik dengan mengubah pin trigger menjadi LOW
durationMasuk = pulseIn(echoPinMasuk, HIGH); //Membaca durasi pulsa yang diterima dari pin echo setelah pantulan sinyal ultrasonik
jarakMasuk = durationMasuk * 0.034 / 2; //Menghitung jarak berdasarkan durasi pulsa yang diterima, dengan asumsi kecepatan suara sekitar 0.034 cm per mikrodetik
return jarakMasuk; //Mengembalikan nilai jarak yang telah dihitung
}//entryDistance
float exitDistance() {
digitalWrite(trigPinKeluar, LOW); //Mengirimkan sinyal LOW ke pin trigger untuk memastikan keadaan awal yang stabil
delayMicroseconds(2); //Jeda
digitalWrite(trigPinKeluar, HIGH); //Mengirim sinyal HIGH ke pin trigger untuk memulai pengiriman sinyal ultrasonik
delayMicroseconds(10); //Jeda
digitalWrite(trigPinKeluar, LOW); //Menghentikan pengiriman sinyal ultrasonik dengan mengubah pin trigger menjadi LOW
durationKeluar = pulseIn(echoPinKeluar, HIGH); //Membaca durasi pulsa yang diterima dari pin echo setelah pantulan sinyal ultrasonik
jarakKeluar = durationKeluar * 0.034 / 2; //Menghitung jarak berdasarkan durasi pulsa yang diterima, dengan asumsi kecepatan suara sekitar 0.034 cm per mikrodetik
return jarakKeluar; //Mengembalikan nilai jarak yang telah dihitung
}//entryDistance
//=== Program Tampilan OLED ===
void updateDisplay() {
display.clearDisplay(); //Bersihkan layar
display.setTextSize(1); //Ukuran Font pada OLED
display.setTextColor(SSD1306_WHITE); //Warna Font
display.setCursor(22, 0); //Atur posisi
display.print("Selamat Datang"); //Tampilkan pada OLED
display.setCursor(2, 9); //Atur posisi
display.print("Silahkan Tekan Tombol"); //Tampilkan pada OLED
display.setCursor(22, 35); //Atur posisi
display.print("Mobil Masuk: "); //Tampilkan pada OLED
display.println(mobilMasuk); //Tampilkan jumlah mobil yang masuk pada OLED
display.setCursor(20, 45); //Atur posisi
display.print("Mobil Keluar: "); //Tampilkan pada OLED
display.println(mobilKeluar); //Tampilkan jumlah mobil yang keluar pada OLED
display.setCursor(3, 55); //Atur posisi
display.print("Sisa Slot Parkir: "); //Tampilkan pada OLED
display.println(slotParkir - slotTerisi); // Menghitung sisa slot parkir
display.display(); //Mengirim data ke display OLED
}//updateDisplay