#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;
  }
}
$abcdeabcde151015202530fghijfghij