#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin sensor & LED
#define TRIG_PIN 5
#define ECHO_PIN 18
#define LED_HIJAU 13
#define LED_KUNING 12
#define LED_MERAH 14
// Variabel
int pengunjung = 0;
const int KAPASITAS_MAX = 50;
bool orangTerdeteksi = false;
unsigned long waktuTerakhir = 0;
void setup() {
Serial.begin(115200);
// Setup pin
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_HIJAU, OUTPUT);
pinMode(LED_KUNING, OUTPUT);
pinMode(LED_MERAH, OUTPUT);
// Setup LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.print("PERPUSTAKAAN");
delay(2000);
// LED awal = hijau
digitalWrite(LED_HIJAU, HIGH);
updateLCD();
}
void loop() {
long jarak = bacaSensor();
// Deteksi orang (< 50cm)
if (jarak > 0 && jarak < 50) {
unsigned long now = millis();
if (!orangTerdeteksi && (now - waktuTerakhir > 2000)) {
pengunjung++;
orangTerdeteksi = true;
waktuTerakhir = now;
updateLCD();
updateLED();
Serial.print("Pengunjung: ");
Serial.println(pengunjung);
}
} else {
orangTerdeteksi = false;
}
delay(100);
}
long bacaSensor() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
long jarak = duration * 0.034 / 2;
return jarak;
}
void updateLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pengunjung:");
lcd.setCursor(0, 1);
lcd.print(pengunjung);
lcd.print("/");
lcd.print(KAPASITAS_MAX);
int persen = (pengunjung * 100) / KAPASITAS_MAX;
lcd.print(" (");
lcd.print(persen);
lcd.print("%)");
}
void updateLED() {
// Matikan semua LED
digitalWrite(LED_HIJAU, LOW);
digitalWrite(LED_KUNING, LOW);
digitalWrite(LED_MERAH, LOW);
// Nyalakan sesuai kapasitas
float persen = (float)pengunjung / KAPASITAS_MAX * 100;
if (persen < 50) {
digitalWrite(LED_HIJAU, HIGH);
} else if (persen < 80) {
digitalWrite(LED_KUNING, HIGH);
} else {
digitalWrite(LED_MERAH, HIGH);
}
}