#include <Servo.h> //memanggil library dari servo dengan nama Servo.h
#include <LiquidCrystal_I2C.h> //memanggil library dari lcd 162c
LiquidCrystal_I2C lcd (0x27, 16, 2);
Servo servoku2;
Servo servoku; //memberikan nama variabel untuk perintah Servo menjadi servoku, variabelnya bisa diubah-ubah sesuai keinginan tidak harus servoku
int echoPin = 4; //deklarasi pin echo
int trigPin = 5; //deklarasi pin trig
int buzzer = 13; //deklarasi pin buzzer
int led = 12; //deklarasi pin led
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); //menginisialisasi komunikasi serial dengan kecepatan baud tertentu
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
servoku.attach(6); //alamat pin dari motor servo (harus terhubung ke pin pwm)
servoku2.attach(7); //alamat pin dari motor servo (harus terhubung ke pin pwm)
lcd.begin(16, 2); //menginisialisasi layar LCD dengan 16 kolom dan 2 baris
lcd.backlight(); //menyalakan lampu latar di layar lcd
}
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(2);
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 / 2) / 29;; //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);
lcd.print("Palang Terbuka ");
lcd.setCursor(0,1);
lcd.print(" ");
delay(10);
noTone(buzzer);
servoku2.write(90);
servoku.write(90); //perintah membuka palang memposisikan servo di sudut 90 derajat
}
else{
lcd.setCursor(0, 0);
lcd.print("Harap Berhenti!! ");
lcd.setCursor(0,1);
lcd.print("Agar Selamat.");
delay(10);
tone(buzzer, 1000);
digitalWrite(led, HIGH);
delay(500);
tone(buzzer, 10);
digitalWrite(led, LOW);
delay(500);
servoku2.write(180);
servoku.write(0); //perintah menutup portal, memposisikan servo di sudut 0 derajat
}
}
//sebenarnya untuk fungsi ideal bisa menggunakan dua sensor ultrasonik dipasangkan sebelum palang dan sesudah palang kereta api