#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myServo;
// Pin
const int trigPin = 9;
const int echoPin = 10;
const int ledMerah = 8;
const int ledHijau = 7;
// Variabel
long duration;
int distance;
bool pintuTerbuka = false; // status pintu
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ledMerah, OUTPUT);
pinMode(ledHijau, OUTPUT);
lcd.init();
lcd.backlight();
myServo.attach(6);
// Kondisi awal
digitalWrite(ledMerah, HIGH);
digitalWrite(ledHijau, LOW);
myServo.write(0);
lcd.setCursor(0, 0);
lcd.print("Pintu Tertutup");
}
void loop() {
// Hitung jarak
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
// Logika buka pintu
if (distance <= 50 && !pintuTerbuka) {
pintuTerbuka = true; // ubah status
digitalWrite(ledMerah, LOW);
digitalWrite(ledHijau, HIGH);
myServo.write(90);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pintu Terbuka");
delay(10000); // tunggu 10 detik
// Tutup pintu
digitalWrite(ledHijau, LOW);
digitalWrite(ledMerah, HIGH);
myServo.write(0);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pintu Tertutup");
// Tunggu sampai objek menjauh dulu
while (true) {
// Baca ulang jarak
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
if (distance > 50) {
pintuTerbuka = false; // reset status agar bisa buka lagi nanti
break; // keluar dari loop tunggu
}
delay(200);
}
}
delay(300);
}