#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#define TRIG_PIN 4
#define ECHO_PIN 2
#define SERVO_PIN 13
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo palang;
int jarak = 0;
bool terbuka = false;
unsigned long lastScroll = 0;
int scrollPos = 0;
String pesanBuka = "Silahkan masuk anak comel ";
String pesanTutup = "Tertutup hanya untuk anak comel ";
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
palang.attach(SERVO_PIN);
palang.write(0); // posisi tertutup awal
lcd.setCursor(0, 0);
lcd.print("Status Palang:");
}
void loop() {
jarak = bacaJarak();
if (jarak <= 20 && !terbuka) {
bukaPalang();
terbuka = true;
scrollPos = 0; // reset scroll
} else if (jarak > 20 && terbuka) {
tutupPalang();
terbuka = false;
scrollPos = 0; // reset scroll
}
tampilkanPesan();
delay(100);
}
int bacaJarak() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long durasi = pulseIn(ECHO_PIN, HIGH);
int jarak = durasi * 0.034 / 2;
return jarak;
}
void bukaPalang() {
for (int pos = 0; pos <= 90; pos++) {
palang.write(pos);
delay(10);
}
}
void tutupPalang() {
for (int pos = 90; pos >= 0; pos--) {
palang.write(pos);
delay(10);
}
}
void tampilkanPesan() {
lcd.setCursor(0, 0);
lcd.print("Status Palang:");
unsigned long sekarang = millis();
if (sekarang - lastScroll > 300) {
String pesan = terbuka ? pesanBuka : pesanTutup;
String tampil = pesan.substring(scrollPos, scrollPos + 16);
lcd.setCursor(0, 1);
lcd.print(tampil);
scrollPos++;
if (scrollPos + 16 > pesan.length()) scrollPos = 0;
lastScroll = sekarang;
}
}