#include <Arduino.h>
const int PIR_PIN = 27;
const int LED_PIN = 2;
volatile bool motionFlag = false;
volatile bool endFlag = false;
volatile unsigned long tDetect = 0;
volatile unsigned long tMotionEnd = 0;
unsigned long tLedOn = 0;
unsigned long tLedOff = 0;
unsigned long trials = 0;
unsigned long sumDelta = 0;
unsigned long minDelta = 0xFFFFFFFFUL;
unsigned long maxDelta = 0;
void IRAM_ATTR pirChange() {
int s = digitalRead(PIR_PIN);
if (s == HIGH) {
tDetect = micros();
motionFlag = true;
} else {
tMotionEnd = micros();
endFlag = true;
}
}
void setup() {
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
Serial.begin(115200);
while (!Serial) {}
Serial.println("event,trial,detect_to_led_on_us,min_us,max_us,avg_us");
attachInterrupt(digitalPinToInterrupt(PIR_PIN), pirChange, CHANGE);
}
void loop() {
if (motionFlag) {
noInterrupts();
motionFlag = false;
unsigned long td = tDetect;
interrupts();
digitalWrite(LED_PIN, HIGH);
tLedOn = micros();
unsigned long d = tLedOn - td;
trials++;
sumDelta += d;
if (d < minDelta) minDelta = d;
if (d > maxDelta) maxDelta = d;
unsigned long avg = (trials ? (sumDelta / trials) : 0);
Serial.print("ON,");
Serial.print(trials);
Serial.print(",");
Serial.print(d);
Serial.print(",");
Serial.print(minDelta);
Serial.print(",");
Serial.print(maxDelta);
Serial.print(",");
Serial.println(avg);
}
if (endFlag) {
noInterrupts();
endFlag = false;
unsigned long te = tMotionEnd;
interrupts();
digitalWrite(LED_PIN, LOW);
tLedOff = micros();
unsigned long dOff = tLedOff - te;
Serial.print("OFF,");
Serial.print(trials);
Serial.print(",");
Serial.print(dOff);
Serial.print(",0,0,0");
Serial.println();
}
}