#include <LiquidCrystal_I2C.h> //memangil library dari LCD
#include <Servo.h> //memanggil library dari servo dengan nama Servo.h
Servo servoku; //memberikan nama variabel untuk perintah Servo menjadi servoku, variabelnya bisa diubah-ubah sesuai keinginan tidak harus servoku
int echoPin = 2; //deklarasi pin echo
int trigPin = 3; //deklarasi pin trig
int buzzer = 4; //deklarasi pin buzzer
LiquidCrystal_I2C lcd(0x27,20,4);
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); 
  pinMode(echoPin, INPUT); //setup pin echo sebagai input untuk membaca input dari sensor ultrasonik
  pinMode(trigPin, OUTPUT); //setup pin trig sebagai output untuk trigger ke ultrasonik untuk emmancarkan gelombang ultrasonik
  pinMode(buzzer, OUTPUT); //setup buzzer sebagai output
  pinMode(13, OUTPUT);//setup lampu sebagai output
  lcd.begin(16,2); // menginisialisasi layar LCD dengan 16 kolom dan 2 baris
  lcd.init();
  lcd.backlight(); //memberi lampu latar di layar LCD
  servoku.attach(5); //alamat pin dari motor servo (harus terhubung ke pin pwm)
}
float bacaUltrasonik(){ //fungsi untuk membaca jarak pada sensor ultrasonik
  digitalWrite(trigPin, LOW); //set trigPin ke low agar gelombang ultrasonik tidak dipancarkan terlebih dahulu
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); //set trigPin ke high untuk memicu sensor ultrasonik meancarkan gelombangnya
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW); //set trigPin ke low untuk membuat gelombang ultrasonik berhenti dipancarkan
  int durasi = pulseIn(echoPin, HIGH); //mengecek interval waktu echoPin menerima sinyal high setelah gelombang dipancarkan
  return durasi * 0.034 / 2; //rumus konversi durasi ultrasonik ke jarak dari rumus dasar t * 340 / 2
}
void loop() {
  // put your main code here, to run repeatedly:
  float jarak = bacaUltrasonik(); //memasukkan hasil fungsi bacaUltrasonik ke dalam variabel jarak
  if(jarak<=150){ //mengecek apakah ada kereta yang lewat di depan sensor ultrasonik atau tidak, jika iya yang di dalam if akan dieksekusi
    
    lcd.setCursor(0,0); // meletakkan teks pada baris 1
    lcd.print("AWAS KERETA API!  "); //Menampilkan teks pada lcd 
    tone(buzzer, 1000); // menghidupkan suara
    digitalWrite(13, HIGH); //menyalakan lampu
    delay(500);// memberi jeda 
    tone(buzzer, 10); // menghidupkan suara
    digitalWrite(13, LOW); //mematikan  lampu
    delay(500);// memberi jeda
    servoku.write(0); //perintah menutup portal, memposisikan servo di sudut 0 derajat
  }
  else{
    lcd.setCursor(0,0); // meletakkan teks pada baris 1
    lcd.print("REINA FINA LAILA"); //Menampilkan teks pada lcd 
    lcd.setCursor(0,1);  // meletakkan teks pada baris 2
    lcd.print(" 0067 0065 0167"); //Menampilkan teks pada lcd 
    delay(10);// memberi jeda
    noTone(buzzer); //menghentikan suara
    servoku.write(90); //perintah membuka palang memposisikan servo di sudut 90 derajat
  }
}
//sebenarnya untuk fungsi ideal bisa menggunakan dua sensor ultrasonik dipasangkan sebelum palang dan sesudah palang kereta api
// Nama Kelompok :
// Rheina Sukma Anggini ( 20.240.0067 )
// Fina Himmatul Khusna ( 20.240.0065 )
// Lailatus Syarifah    ( 20.240.0167 )