#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definisikan pin untuk HC-SR04 dan buzzer
#define TRIG_PIN1 32
#define ECHO_PIN1 35
#define TRIG_PIN2 5
#define ECHO_PIN2 17
#define BUZZER_PIN 26 // Pin untuk buzzer
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Inisialisasi LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variabel untuk menghitung total kendaraan
int totalVehicles = 0;
const int maxVehicles = 10;
// Variabel untuk jarak minimum deteksi kendaraan (dalam cm)
const int minDistance = 40;
void setup() {
// Inisialisasi komunikasi serial
Serial.begin(115200);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
display.clearDisplay();
// Display OLED 1
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(25, 0);
display.println("Smart Queuing");
display.setCursor(40, 12);
display.println("Rymutich");
// Inisialisasi sensor ultrasonik
pinMode(TRIG_PIN1, OUTPUT);
pinMode(ECHO_PIN1, INPUT);
pinMode(TRIG_PIN2, OUTPUT);
pinMode(ECHO_PIN2, INPUT);
// Inisialisasi buzzer
pinMode(BUZZER_PIN, OUTPUT);
noTone(BUZZER_PIN); // Pastikan buzzer mati saat awal
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
// Tampilkan pesan selamat datang di LCD
lcd.setCursor(0, 0);
lcd.print(" Smart Queuing System");
lcd.setCursor(0, 1);
lcd.print(" Rymutich");
delay(2000);
lcd.clear();
}
long readUltrasonicDistance(int trigPin, int echoPin) {
// Kirimkan sinyal trigger selama 10 mikrodetik
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Hitung waktu yang dibutuhkan sinyal untuk kembali
long duration = pulseIn(echoPin, HIGH);
// Konversi waktu ke jarak (dalam cm)
long distance = duration * 0.034 / 2;
return distance;
}
void loop() {
// Baca jarak dari sensor 1
long distance1 = readUltrasonicDistance(TRIG_PIN1, ECHO_PIN1);
// Baca jarak dari sensor 2
long distance2 = readUltrasonicDistance(TRIG_PIN2, ECHO_PIN2);
// Tampilkan hasil pada Serial Monitor
Serial.print("Jarak Sensor 1: ");
Serial.print(distance1);
Serial.println(" cm");
Serial.print("Jarak Sensor 2: ");
Serial.print(distance2);
Serial.println(" cm");
// Tampilkan hasil pada LCD I2C
lcd.setCursor(0, 0);
lcd.print("GATE IN : ");
lcd.print(distance1);
lcd.print(" cm ");
lcd.setCursor(0, 1);
lcd.print("GATE OUT: ");
lcd.print(distance2);
lcd.print(" cm ");
delay(2000); // Tunda untuk menampilkan informasi sensor
lcd.clear();
// Logika untuk menghitung kendaraan masuk/keluar
if (distance1 < minDistance && totalVehicles < maxVehicles) {
totalVehicles++;
activateBuzzer();
//securityBuzzer();
delay(1000); // Delay untuk mencegah pembacaan ganda
deactivateBuzzer();
}
if (distance2 < minDistance && totalVehicles > 0) {
totalVehicles--;
activateBuzzer();
delay(1000); // Delay untuk mencegah pembacaan ganda
deactivateBuzzer();
}
// Display OLED 2
countOLED();
// Tampilkan total kendaraan dan status parkir pada LCD
lcd.setCursor(0, 0);
lcd.print(" Total : ");
lcd.print(totalVehicles);
lcd.print(" "); // Clear remaining characters
lcd.setCursor(0, 1);
if (totalVehicles < maxVehicles) {
lcd.print(" Silahkan Masuk ");
} else {
lcd.print(" Parkir Penuh ");
}
// Tunggu sebelum pembacaan berikutnya
delay(1000);
}
void countOLED(){
// Display OLED 2
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 28);
display.print(" Total Kendaraan: ");
display.print(totalVehicles);
display.print(" ");
display.setCursor(42, 40);
display.print(" Status ");
display.setCursor(20, 50);
if (totalVehicles < maxVehicles) {
display.print(" Silahkan Masuk ");
} else {
display.print(" Parkir Penuh ");
}
display.display();
// Bersihkan display
display.clearDisplay();
}
void activateBuzzer() {
tone(BUZZER_PIN, 1000); // Aktifkan buzzer pada frekuensi 200 Hz
delay(100); // Buzzer berbunyi selama 500 ms
noTone(BUZZER_PIN); // Matikan buzzer
}
void securityBuzzer(){
tone(BUZZER_PIN, 1000); // Aktifkan buzzer pada frekuensi 200 Hz
}
void deactivateBuzzer() {
noTone(BUZZER_PIN); // Pastikan buzzer mati
}