#include <ESP32Servo.h>
// =========================
// HC-SR04
// =========================
#define TRIG_PIN 12
#define ECHO_PIN 14
// =========================
// LED
// =========================
#define LED_MERAH 25
#define LED_HIJAU 26
// =========================
// Servo SG90
// =========================
#define SERVO_PIN 19
// =========================
// Buzzer
// =========================
#define BUZZER_PIN 18
Servo pintu;
// Status pintu
bool pintuTerbuka = false;
// Menyimpan waktu terakhir ada objek terdeteksi
unsigned long waktuTerakhirDeteksi = 0;
// ======================================
// Fungsi Membaca Jarak HC-SR04
// ======================================
float bacaJarak() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long durasi = pulseIn(ECHO_PIN, HIGH, 30000);
if (durasi == 0) {
return 999; // tidak ada pantulan
}
float jarak = durasi * 0.0343 / 2.0;
return jarak;
}
// ======================================
// Bunyi Buzzer 3 Kali
// ======================================
void bunyiBuzzer() {
for (int i = 0; i < 3; i++) {
digitalWrite(BUZZER_PIN, HIGH);
delay(150);
digitalWrite(BUZZER_PIN, LOW);
delay(150);
}
}
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_MERAH, OUTPUT);
pinMode(LED_HIJAU, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Servo
pintu.attach(SERVO_PIN);
// Kondisi awal
pintu.write(0); // pintu tertutup
digitalWrite(LED_MERAH, HIGH);
digitalWrite(LED_HIJAU, LOW);
Serial.println("================================");
Serial.println(" SISTEM PINTU OTOMATIS ESP32");
Serial.println("================================");
}
void loop() {
float jarak = bacaJarak();
Serial.print("Jarak : ");
Serial.print(jarak);
Serial.println(" cm");
// ======================================
// ADA ORANG TERDETEKSI
// ======================================
if (jarak <= 20) {
// Jika pintu masih tertutup
if (!pintuTerbuka) {
Serial.println(">>> PINTU TERBUKA");
pintu.write(90);
digitalWrite(LED_HIJAU, HIGH);
digitalWrite(LED_MERAH, LOW);
bunyiBuzzer();
pintuTerbuka = true;
}
// Update waktu deteksi terakhir
waktuTerakhirDeteksi = millis();
}
// ======================================
// TUTUP SETELAH 5 DETIK
// TIDAK ADA DETEKSI
// ======================================
if (pintuTerbuka &&
(millis() - waktuTerakhirDeteksi >= 5000)) {
Serial.println(">>> PINTU TERTUTUP");
pintu.write(0);
digitalWrite(LED_HIJAU, LOW);
digitalWrite(LED_MERAH, HIGH);
pintuTerbuka = false;
}
delay(100);
}