#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Pin
const int SWITCH_MASUK = 13;
// Slot kiri (HIGH = kosong)
const int SLOT_L1 = 6;
const int SLOT_L2 = 7;
const int SLOT_L3 = 8;
// Slot kanan (LOW = kosong)
const int SLOT_R1 = A1;
const int SLOT_R2 = A2;
const int SLOT_R3 = A3;
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Status sebelumnya
int prevL1 = -1, prevL2 = -1, prevL3 = -1;
int prevR1 = -1, prevR2 = -1, prevR3 = -1;
// Timer
unsigned long startTime;
const unsigned long pantauDurasi = 10000; // 10 detik
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(SWITCH_MASUK, INPUT);
pinMode(SLOT_L1, INPUT);
pinMode(SLOT_L2, INPUT);
pinMode(SLOT_L3, INPUT);
pinMode(SLOT_R1, INPUT);
pinMode(SLOT_R2, INPUT);
pinMode(SLOT_R3, INPUT);
tampilkanSiap();
}
void loop() {
if (digitalRead(SWITCH_MASUK) == HIGH) {
tampilkanSlotKosong();
startTime = millis();
// Pantau selama 10 detik
while (millis() - startTime < pantauDurasi) {
pantauSlot();
delay(100); // periksa setiap 100ms
}
tampilkanSiap(); // kembali ke awal
}
}
// --- LCD ---
void tampilkanSiap() {
lcd.clear();
lcd.setCursor(1, 0); lcd.print("SMART PARKING");
lcd.setCursor(1, 1); lcd.print("TAB ACCES CARD");
}
void tampilkanSlotKosong() {
lcd.clear();
lcd.setCursor(1, 0); lcd.print("Slot Tersedia:");
bool L1 = digitalRead(SLOT_L1) == HIGH;
bool L2 = digitalRead(SLOT_L2) == HIGH;
bool L3 = digitalRead(SLOT_L3) == HIGH;
bool R1 = digitalRead(SLOT_R1) == LOW;
bool R2 = digitalRead(SLOT_R2) == LOW;
bool R3 = digitalRead(SLOT_R3) == LOW;
lcd.setCursor(2, 1);
lcd.print("L:");
lcd.print(L1 ? "1" : "-");
lcd.print(L2 ? "2" : "-");
lcd.print(L3 ? "3" : "-");
lcd.print(" R:");
lcd.print(R1 ? "1" : "-");
lcd.print(R2 ? "2" : "-");
lcd.print(R3 ? "3" : "-");
kirimStatusSlot(); // kirim awal
}
// --- Pantau perubahan slot ---
void pantauSlot() {
int L1 = digitalRead(SLOT_L1) == LOW ? 1 : 0;
int L2 = digitalRead(SLOT_L2) == LOW ? 1 : 0;
int L3 = digitalRead(SLOT_L3) == LOW ? 1 : 0;
int R1 = digitalRead(SLOT_R1) != LOW;
int R2 = digitalRead(SLOT_R2) != LOW;
int R3 = digitalRead(SLOT_R3) != LOW;
if (L1 != prevL1 || L2 != prevL2 || L3 != prevL3 ||
R1 != prevR1 || R2 != prevR2 || R3 != prevR3) {
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Slot Terisi:");
lcd.setCursor(0, 1);
lcd.print("L:");
lcd.print(L1 ? "1" : "-");
lcd.print(L2 ? "2" : "-");
lcd.print(L3 ? "3" : "-");
lcd.print(" R:");
lcd.print(R1 ? "1" : "-");
lcd.print(R2 ? "2" : "-");
lcd.print(R3 ? "3" : "-");
kirimStatusSlot();
prevL1 = L1; prevL2 = L2; prevL3 = L3;
prevR1 = R1; prevR2 = R2; prevR3 = R3;
}
}
// --- Kirim ke Serial (JSON) ---
void kirimStatusSlot() {
int L1 = digitalRead(SLOT_L1) == LOW ? 1 : 0;
int L2 = digitalRead(SLOT_L2) == LOW ? 1 : 0;
int L3 = digitalRead(SLOT_L3) == LOW ? 1 : 0;
int R1 = digitalRead(SLOT_R1) != LOW;
int R2 = digitalRead(SLOT_R2) != LOW;
int R3 = digitalRead(SLOT_R3) != LOW;
Serial.print("{\"L1\":"); Serial.print(L1);
Serial.print(",\"L2\":"); Serial.print(L2);
Serial.print(",\"L3\":"); Serial.print(L3);
Serial.print(",\"R1\":"); Serial.print(R1);
Serial.print(",\"R2\":"); Serial.print(R2);
Serial.print(",\"R3\":"); Serial.print(R3);
Serial.println("}");
}