#include <ESP32Servo.h>
#define PIR_PIN 27
#define BUTTON_PIN 12
#define SERVO_PIN 14
#define OPEN_DURATION 10000
#define SERVO_CLOSED 0
#define SERVO_OPEN 90
#define DEBOUNCE_DELAY 50
Servo gateServo;
bool gateOpen = false;
unsigned long gateOpenTime = 0;
bool lastButtonReading = HIGH;
bool buttonStableState = HIGH;
unsigned long lastDebounceTime = 0;
bool lastPirState = LOW;
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
gateServo.attach(SERVO_PIN);
gateServo.write(SERVO_CLOSED);
Serial.println("System ready. Gate CLOSED.");
}
void openGate(const char* trigger) {
gateServo.write(SERVO_OPEN);
gateOpen = true;
gateOpenTime = millis();
Serial.print("Gate OPENED by: ");
Serial.println(trigger);
}
void loop() {
unsigned long currentTime = millis();
bool pirState = digitalRead(PIR_PIN);
if (pirState == HIGH && lastPirState == LOW) {
if (!gateOpen) {
openGate("PIR Motion Sensor");
} else {
gateOpenTime = currentTime;
Serial.println("Motion detected - timer extended.");
}
}
lastPirState = pirState;
bool reading = digitalRead(BUTTON_PIN);
if (reading != lastButtonReading) {
lastDebounceTime = currentTime;
}
if ((currentTime - lastDebounceTime) > DEBOUNCE_DELAY) {
if (reading != buttonStableState) {
buttonStableState = reading;
if (buttonStableState == LOW) {
if (!gateOpen) {
openGate("Manual Pushbutton");
} else {
gateOpenTime = currentTime;
Serial.println("Button pressed - timer extended.");
}
}
}
}
lastButtonReading = reading;
if (gateOpen && (currentTime - gateOpenTime >= OPEN_DURATION)) {
gateServo.write(SERVO_CLOSED);
gateOpen = false;
Serial.println("Gate CLOSED automatically.");
}
delay(10);
}