#include <Servo.h>
// === Pin Setup ===
#define TRIG_PIN 2
#define ECHO_PIN 3
#define SERVO_PIN 4
#define BUZZER_PIN 5
#define PIR_PIN 6
#define LED_PIR 7
Servo gateServo;
long duration;
int distance;
int servoPos = 0;
// === Buzzer Kontrol ===
bool buzzerState = false;
unsigned long lastBuzzerToggle = 0;
const unsigned long buzzerInterval = 600; // 600ms interval
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIR, OUTPUT);
gateServo.attach(SERVO_PIN);
gateServo.write(0); // Awal: gerbang tertutup
Serial.begin(9600);
}
void loop() {
// === PIR Sensor & LED ===
int pirState = digitalRead(PIR_PIN);
digitalWrite(LED_PIR, pirState);
// === Sensor Ultrasonik untuk Buka/Tutup Gerbang ===
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
Serial.print("Jarak: ");
Serial.print(distance);
Serial.println(" cm");
// === Kontrol Servo Gerbang ===
if (distance >= 30 && servoPos != 90) {
gateServo.write(90);
servoPos = 90;
} else if (distance < 30 && servoPos != 0) {
gateServo.write(0);
servoPos = 0;
}
// === Logika Buzzer: LED ON atau Servo = 90 ===
if (pirState == HIGH || servoPos == 90) {
if (millis() - lastBuzzerToggle >= buzzerInterval) {
buzzerState = !buzzerState;
if (buzzerState) {
tone(BUZZER_PIN, 1000); // Buzzer ON
} else {
noTone(BUZZER_PIN); // Buzzer OFF
}
lastBuzzerToggle = millis();
}
} else {
noTone(BUZZER_PIN); // Matikan buzzer jika tidak ada kondisi aktif
buzzerState = false;
}
delay(50); // Loop cepat agar responsif
}