const byte PIR_PIN = 2;
const byte LED_PIN = 8;
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 sumDelta = 0;
unsigned long minDelta = 0xFFFFFFFFUL;
unsigned long maxDelta = 0;
unsigned long trials = 0;
void 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);
attachInterrupt(digitalPinToInterrupt(PIR_PIN), pirChange, CHANGE);
}
void loop() {
if (motionFlag) {
motionFlag = false;
digitalWrite(LED_PIN, HIGH);
tLedOn = micros();
unsigned long delta = tLedOn - tDetect;
trials++;
sumDelta += delta;
if (delta < minDelta) minDelta = delta;
if (delta > maxDelta) maxDelta = delta;
unsigned long avg = sumDelta / trials;
Serial.print("trial=");
Serial.print(trials);
Serial.print(", t_detect_us=");
Serial.print(tDetect);
Serial.print(", t_led_on_us=");
Serial.print(tLedOn);
Serial.print(", delta_us=");
Serial.print(delta);
Serial.print(", avg_us=");
Serial.print(avg);
Serial.print(", min_us=");
Serial.print(minDelta);
Serial.print(", max_us=");
Serial.println(maxDelta);
}
if (endFlag) {
endFlag = false;
digitalWrite(LED_PIN, LOW);
tLedOff = micros();
unsigned long deltaOff = tLedOff - tMotionEnd;
Serial.print("end, t_motion_end_us=");
Serial.print(tMotionEnd);
Serial.print(", t_led_off_us=");
Serial.print(tLedOff);
Serial.print(", delta_off_us=");
Serial.println(deltaOff);
}
}