#include <LiquidCrystal_I2C.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Ultrasonik
const int echoPin = 2;
const int trigPin = 3;
// LCD
String teks1 = "Informasi";
String teks2 = "Ada kereta!"; // Ganti dengan > kereta sudah melintas dekat palang pintu
String teks3 = "Tidak ada kereta yang melintas";
String teks4 = "Sistem Kontrol";
String teks5 = "Palang Pintu";
// Variabel untuk menyimpan status deteksi sebelumnya
bool objectDetected = false;
// Servo
Servo myServo;
int pos = 0;
int button1Pin = 10;
int button2Pin = 11;
// Push Button
// Variabel untuk membaca status tombol
int button1State = 0;
int button2State = 0;
void setup() {
Serial.begin(9600);
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
lcd.init();
lcd.backlight();
// Menampilkan Info di LCD
lcd.setCursor(0,0);
lcd.print(teks4);
lcd.setCursor(0,1);
lcd.print(teks5);
// Memasang servo pada pin 9
myServo.attach(9);
// Posisi awal servo di 0 derajat
myServo.write(0);
pinMode(button1Pin, INPUT_PULLUP);
pinMode(button2Pin, INPUT_PULLUP);
}
void loop() {
// Push Button
// Membaca status tombol
// karena menggunakan input pull up (INPUT_PULLUP)
// button1State dan button2State nilai awalnya sudah 1
button1State = digitalRead(button1Pin);
button2State = digitalRead(button2Pin);
// Jika tombol 1 ditekan, servo bergerak ke 90 derajat
if (button1State == LOW) {
// LOW berarti tombol ditekan
if (pos == 91) {
Serial.println("tidak perlu putar ke 90 lagi");
} else {
// Servo berputar dari posisi 0 derajat sampai 90 derajat
Serial.println("Servo ke 90 derajat");
for (pos = 0; pos <= 90; pos += 1) {
myServo.write(pos);
// Delay selama 15 milidetik
delay(15);
}
}
Serial.println("palang kereta api tertutup");
delay(1000);
}
//jika tombol 2 ditekan, servo kembali ke 0 derajat
if (button2State == LOW) {
//pengecekan posisi servo
if (pos == -1)
{
Serial.println("Tidak perlu putar ke 0 lagi");
} else {
//Servo berputar dari 90 derajat ke 0 derajat
Serial.println("Servo ke 0 derajat");
for(pos = 90; pos >= 0; pos -=1) {
myServo.write(pos);
//Jeda selama 15 milidetik
delay(15);
}
}
Serial.println("palang kereta api terbuka");
delay(1000);
}
// Ultrasonik
long duration;
float distance;
// Kirim sinyal trigger
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Baca durasi echo
duration = pulseIn(echoPin, HIGH);
// Hitung jarak (cm)
distance = duration * 0.034 / 2;
// Periksa Jarak
bool currentObjectDetected = (distance > 0 && distance <= 10);
// Hanya perbarui LCD jika status berubah
if (currentObjectDetected != objectDetected) {
// Perbarui Status
objectDetected = currentObjectDetected;
lcd.clear();
if (objectDetected)
{
// Menampilkan info di LCD
lcd.setCursor(0,0);
lcd.print(teks1);
lcd.setCursor(0,1);
lcd.print(teks2);
} else {
// Menampilkan info di LCD
lcd.setCursor(0,0);
lcd.print(teks1);
lcd.setCursor(0,1);
lcd.print(teks3);
}
}
delay(100);
}