#include <Wire.h>
#include <ESP32Servo.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Membuat objek Servo bernama 'servo' untuk mengontrol motor servo
Servo servo;

// Menginisialisasi sudut awal untuk motor servo
int angle = 4; 

// Pin sensor ultrasonik
int trig = 27;
int echo = 26;

// Variabel untuk menyimpan pembacaan sensor ultrasonik
long duration;
int distance;

// Pin LED
int ledmerah = 17;
int ledhijau = 16;

void setup() {
  // Setel pin LED sebagai OUTPUT
  pinMode(ledmerah, OUTPUT);
  pinMode(ledhijau, OUTPUT);

  // Memulai komunikasi serial untuk debugging
  Serial.begin(9600);

  // Setel pin sensor ultrasonik
  pinMode(echo, INPUT);
  pinMode(trig, OUTPUT);

  // Menyambungkan servo ke pin 10 dan mengatur sudut awalnya
  servo.attach(4);
  servo.write(angle);
 // lcd
 Wire.begin(22, 23);
lcd.init();
  lcd.backlight();
 
 
}

void loop() {
  // Kirim pulsa pendek untuk memicu sensor ultrasonik
  digitalWrite(trig, LOW);
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);

  // Ukur durasi pulsa dari sensor ultrasonik
  duration = pulseIn(echo, HIGH);

  // Hitung jarak dalam sentimeter menggunakan kecepatan suara
  distance = duration / 50;

  // Cetak jarak ke Serial Monitor untuk debugging
  Serial.print("Jarak: ");
  Serial.println(distance);

  // Periksa apakah jarak kurang dari 100 cm
  if (distance < 100) {
    // Jika ada mobil, nyalakan LED hijau dan buka servo
    digitalWrite(ledmerah, LOW);
    digitalWrite(ledhijau, HIGH);
    servo.write(90); // Posisi terbuka

        // Tunda selama 1 detik sebelum menutup servo lagi
    //delay(1000);
  } else {
    // Jika tidak ada mobil, nyalakan LED merah dan tutup servo
    digitalWrite(ledmerah, HIGH);
    digitalWrite(ledhijau, LOW);
    servo.write(0); // Posisi tertutup
  }

  //lcd
  
  lcd.setCursor(0, 0);
  lcd.print("Jarak: ");
  lcd.print(distance);
  lcd.print(" cm");
 
  lcd.setCursor(0, 1);
  lcd.print("Servo: ");
  if (servo.read() >= 80) {
    lcd.print("Terbuka");
  } else {
    lcd.print("Tertutup");
  }

}

//saya sengaja menukar arti if dan else karena servo dalam 0 itu ke atas dan 90 itu kebawah
//catatan lagi servo wokwi tidak bisa di putar hanay bisa di ubah sampai 180
$abcdeabcde151015202530fghijfghij