// Generic esp32 core does not define LED_BUILTIN; DevKit status output is GPIO 2. const int LED_BUILTIN = 2; // Add filtering to reduce false triggers const int PIR_PIN = 13; const int MIN_TRIGGER_DURATION = 500; // Milliseconds unsigned long triggerStartTime = 0; bool confirmedMotion = false; void setup() { Serial.begin(115200); Serial.println("PIR warm-up: wait 60 seconds"); pinMode(PIR_PIN, INPUT); pinMode(LED_BUILTIN, OUTPUT); delay(60000); // Wait for PIR warm-up } void loop() { int pirState = digitalRead(PIR_PIN); if (pirState == HIGH) { if (triggerStartTime == 0) { triggerStartTime = millis(); // Start timing } else if (millis() - triggerStartTime > MIN_TRIGGER_DURATION) { // Confirmed motion only if PIR stays HIGH for 500ms if (!confirmedMotion) { confirmedMotion = true; Serial.println("CONFIRMED MOTION"); digitalWrite(LED_BUILTIN, HIGH); } } } else { // PIR went LOW - reset triggerStartTime = 0; confirmedMotion = false; digitalWrite(LED_BUILTIN, LOW); } delay(50); }