/*
Kelompok 5
  (Sistem Parkir Otomatis)
  * Alfan Almarogy
  * Dede Ridwan
  * Fadhil Muhammad
*/

/* Library */
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

/* Deklarasi Variable & Object */ 
// Alamat I2C untuk LCD
LiquidCrystal_I2C lcd(0x27,16,2);

// Object dari Class Servo
Servo motorServoMasuk;
Servo motorServoKeluar;

// Variable Lampu
const int pinMerah = 4;
const int pinHijau = 5;

// Variable Sensor Ultrasonik
const int echoPin = 13; 
const int trigPin = 12;

// Variable Sensor Servo
const int servoPin = 3;
const int pinServoKeluar = 6;

// Variable Sensor Buzzer
const int buzzer = 8;

// Variable Sensor IR
const int IRSensor1 = 7; 

// Variable iterasi dari Nilai mobil
int iterasi = 0;
int parkirTersedia = 10;

void setup() {

  /* bagian LCD */
  lcd.init();
  lcd.begin(16, 2); 
  lcd.clear();
  lcd.backlight();  
  lcd.setCursor(0,0);
  lcd.print("PARKIR YANG");
  lcd.setCursor(0,1);
  lcd.print("TERSEDIA : ");
  lcd.setCursor(11, 1);
  lcd.print(parkirTersedia);

  /* bagian Ultrasonik */
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);

  /* lampu LED */
  pinMode(pinMerah, OUTPUT);
  pinMode(pinHijau, OUTPUT);

  /* bagian Servo */
  motorServoMasuk.attach(servoPin);
  motorServoMasuk.write(0);
  motorServoKeluar.attach(pinServoKeluar);
  motorServoKeluar.write(0);

  /* bagian suara */
  pinMode(buzzer, OUTPUT);

  /* bagian Sensor IR */
  pinMode(IRSensor1, INPUT);

  /* bagian Serial begin */
  Serial.begin(9600);
  Serial.println("Serial Terhubung");
}

void loop() {

  /* pemubatan variable */
  double durasi, jarak;
  int palangKeluar = digitalRead(IRSensor1);

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  durasi = pulseIn(echoPin, HIGH);
  jarak = (durasi / 2) / 29.1;

  // mengaktifkan LED hijau
  digitalWrite(pinHijau, HIGH);

  /* pengkondisian */
  if(jarak > 20 && jarak < 200) {
  if (iterasi < 10)  {
    tone(buzzer, 500, 500);
    iterasi++;
    parkirTersedia--; 
    updateLCD();
    openGate();
    delay(3000); 
    }
  }

  if (palangKeluar == HIGH) {
    Serial.println("ada yang keluar, buka palangnya");
    tone(buzzer, 500, 500);
    bukaPintuKeluar();
    iterasi--;
    parkirTersedia++; 
    updateLCD();
  }

  if (iterasi >= 10) {
    digitalWrite(pinHijau, LOW); 
    digitalWrite(pinMerah, HIGH); 
  } else {
    digitalWrite(pinMerah, LOW);
  }
}

/* fungsi updateLCD */
void updateLCD() {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("PARKIR YANG");
  lcd.setCursor(0,1);
  lcd.print("TERSEDIA : ");
  lcd.setCursor(11, 1);
  lcd.print(parkirTersedia);
}

/* fungsi openGate() */
void openGate() {
    motorServoMasuk.write(90);
    delay(3000); // 3 detik
    motorServoMasuk.write(0);
}

void bukaPintuKeluar() {
  motorServoKeluar.write(90);
  delay(3000); // 3 detik
  motorServoKeluar.write(0);
}
$abcdeabcde151015202530354045505560fghijfghij
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
servo1:GND
servo1:V+
servo1:PWM
servo2:GND
servo2:V+
servo2:PWM
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
led1:A
led1:C
led2:A
led2:C
ultrasonic1:VCC
ultrasonic1:TRIG
ultrasonic1:ECHO
ultrasonic1:GND
bz1:1
bz1:2
pir1:VCC
pir1:OUT
pir1:GND