#include <ESP32Servo.h>
//set GPIOs
const int ledBlue = 17;
const int ledRed = 18;
const int motionSensor = 27;
Servo servo1;
//set variables
unsigned long currentTime = millis();
unsigned long lastTrigger = 0;
bool startTimer = false;
bool motion = false;
//chech if motion was detected, sets LED HIGH and starts a timer
void IRAM_ATTR detectsMovement(){
digitalWrite(ledRed, HIGH);
startTimer = true;
lastTrigger = millis();
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
servo1.attach(14);
pinMode(motionSensor, INPUT_PULLUP); //set motion sensor pin as interrupt, assign interrupt function and set rising mode
attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);
pinMode(ledBlue, OUTPUT);
pinMode(ledRed, OUTPUT);
//SET LEDs to low
digitalWrite(ledBlue, LOW);
digitalWrite(ledRed, LOW);
}
void loop() {
currentTime = millis();
if((digitalRead(ledRed) == HIGH) && (motion == false)){
servo1.write(180);
Serial.println("motion detected");
motion = true;
}
//turn off led after number of seconds
if (startTimer && (currentTime - lastTrigger > 5000)){
Serial.println("motion stopped..");
digitalWrite(ledRed, LOW);
servo1.write(90);
startTimer = false;
motion = false;
}
}