#include <LiquidCrystal_I2C.h>
// #include "pitches.h"
//HC-SR04 Ulstrasonic Distance sensor
#define PIN_TRIG 3
#define PIN_ECHO 2
//RGB LED
#define PIN_R 12
#define PIN_G 11
#define PIN_B 13
//push Button
#define BUTTON_PIN 4
//LCD 20x4 (I2C)
LiquidCrystal_I2C lcd(0x27, 20, 4);
//Buzzer
#define BUZZER_PIN 6
//kalo misal dia antara 100-200,
//ada mobil/kendaraan tp gadiitung parkir, LED jadi oranye
//kalo udh 3 menit (30 detik) statenya sama, bakal ada buzzer ,
//artinya kendaraan parkir ilegal, LED jadi merah trus kedap kedip
//jarak harus dibawah 100 biar keitung tergantung waktunya brp lama,
//LED jadi biru nandain kalo kepake
//1 jam (10 detik) tarif 3000 gitu, di simulasi per 10 detik aja
//teken tombol buat berhentiin itung (pembayaran),
//kalo misal dalam 3 menit (30 detik) mobil ga pindah
//buzzernya nyala lagi LED jadi merah trus kedap kedip
//kalo gaada yang parkir LED jadi ijo (jarak 200 keatas ga detect benda)
void setup() {
// Serial.begin(115200);
Serial.begin(9600);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(PIN_R, OUTPUT);
pinMode(PIN_G, OUTPUT);
pinMode(PIN_B, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
lcd.init();
lcd.backlight();
pinMode(BUZZER_PIN, OUTPUT);
}
int second = 0; //hitung waktu per detik (delay 1000ms)
// int minute = 0, hour = 0;//simpan waktu menit & jam
int buzzerDelay = 300;
int carState = 0; //1 = parkir (0-100), 2 = ga parkir ga kosong (100-200), 3 = kosong, 4 = sudah melakukan pembayaran
int paymentStatus = HIGH; // int buttonLastState = HIGH;
//button nandain simulasi pembayaran, kalo di klik artinya bayar
void loop() {
int delayLeft = 1000; //set di awal, tiap loop total delay 1 detik
// Set sensor jarak:
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
delayLeft -= 10;
digitalWrite(PIN_TRIG, LOW);
// Baca hasil dari sensor ultrasonic jarak
int distance = pulseIn(PIN_ECHO, HIGH)/58;
//debugging distance
// concatString("Distance: ", distance, " CM");
//Validasi Jarak
if(distance < 100){
//jarak parkir valid, parkir terisi
if(carState != 4){
setLEDColor(8); //biru
carState = 1;
//set tampilan LCD
clearLCD();
String timeStatus = concatString(" ", second, " Seconds");
writeLCD("Current Time:", 4, 1);
writeLCD(timeStatus, 4, 2);
}
//validasi pembayaran, cuma bisa pas di jarak 0-100
//kalo button ditekan artinya sedang membayar
int value = digitalRead((BUTTON_PIN));
if (paymentStatus != value) {
if (value == LOW) {
if(carState != 4){
//set tampilan LCD
clearLCD();
String time = concatString("Time: ", second, " Seconds");
writeLCD(time, 1, 0);
String price = concatString("Total: Rp", second*3000/10, "");
writeLCD(price, 1, 1);
writeLCD("Payment Success", 1, 3);
}
Serial.println("Payment Finished");
setLEDColor(5); //kuning
carState = 4; //status pembayaran selesai
second = 0; //reset
}
}
//setelah pembayaran (led kuning), mobil wajib keluar parkiran
bool checkResult = checkParkingOverTimeLimit();
if(checkResult) delayLeft -= buzzerDelay; //update delay
second++;
}else if(distance < 200){
//jarak antara 100-200, ga parkir ga kosong
if(carState == 1 || carState == 3){ //dari state parkir atau baru masuk
setLEDColor(2); //oranye
second = 0; //reset waktu buat ngitung lamanya di state ini
carState = 2;
//set tampilan LCD
clearLCD();
writeLCD("POSITION INVALID", 1, 1);
writeLCD("PLEASE MOVE CLOSER", 1, 2);
}
//kalo udh di state sama lebih dari 30 detik
if(carState == 4){ //setelah pembayaran, mobil wajib keluar parkiran
bool checkResult = checkParkingOverTimeLimit();
if(checkResult) delayLeft -= buzzerDelay;
}else if(second >= 30){ //lebih dari 30 detik di state ini
setLEDColor(6); //ganti warna LED merah
setBuzzerOn(554); //set buzzer
delayLeft -= buzzerDelay; //update delay
setLEDColor(2); //biar LED kedip
}
second++;
}else{
//jarak > 200, kosong
setLEDColor(7); //hijau
carState = 3;
//set tampilan LCD
clearLCD();
writeLCD("PARKING OPEN", 4, 1);
//reset waktu
second = 0;
}
//debugging time
// concatString("Time: ", second, " Seconds");
delay(delayLeft); //detect per detik
}
bool checkParkingOverTimeLimit(){
if(carState == 4 && second >= 30){
//set Buzzer
setBuzzerOn(225);
//set tampilan LCD
clearLCD();
writeLCD("PARKING TIME OVER", 1, 1);
writeLCD("PLEASE MOVE OUT", 2, 2);
return true;
}
return false;
}
String concatString(String start, int value, String unitMeasurement){
start = start + value + unitMeasurement;
Serial.println(start);
return start;
}
void setBuzzerOn(int hz){
tone(BUZZER_PIN, hz); //set buzzer
delay(buzzerDelay);
noTone(BUZZER_PIN);
}
void writeLCD(String sentence, int x, int y){ //function buat nulis di LCD
lcd.setCursor(x, y); //x: kolom: 0-19, y: baris: 0-3
lcd.println(sentence);
}
void clearLCD(){ //function buat hapus tulisan LCD
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print(" ");
}
/*
1 - putih
2 - oranye
3 - cyan
4 - magenta
5 - kuning
6 - Merah
7 - Hijau
8 - Biru
*/
void setLEDColor(int color){ //function buat set warna lampu LED
if(color == 1){
//warna putih
analogWrite(PIN_R, 255);
analogWrite(PIN_G, 255);
analogWrite(PIN_B, 255);
}else if(color == 2){
//warna oranye
analogWrite(PIN_R, 255);
analogWrite(PIN_G, 120);
analogWrite(PIN_B, 0);
}else if(color == 3){
//warna cyan
analogWrite(PIN_R, 0);
analogWrite(PIN_G, 255);
analogWrite(PIN_B, 255);
}else if(color == 4){
//warna magenta
analogWrite(PIN_R, 255);
analogWrite(PIN_G, 0);
analogWrite(PIN_B, 255);
}else if(color == 5){
//warna kuning
analogWrite(PIN_R, 255);
analogWrite(PIN_G, 255);
analogWrite(PIN_B, 0);
}else if(color == 6){
//warna Merah
analogWrite(PIN_R, 255);
analogWrite(PIN_G, 0);
analogWrite(PIN_B, 0);
}else if(color == 7){
//warna Hijau
analogWrite(PIN_R, 0);
analogWrite(PIN_G, 255);
analogWrite(PIN_B, 0);
}else if(color == 8){
//warna Biru
analogWrite(PIN_R, 0);
analogWrite(PIN_G, 0);
analogWrite(PIN_B, 255);
}else{
//test warna
analogWrite(PIN_R, 111);
analogWrite(PIN_G, 151);
analogWrite(PIN_B, 255);
}
}
// void buttoFunction(){
// int value = digitalRead((BUTTON_PIN));
// if (buttonLastState != value) {
// buttonLastState = value;
// if (value == HIGH) {
// Serial.println(" released");
// }
// if (value == LOW) {
// Serial.println(" pressed");
// }
// }
// }