Sure
/*
* PIR SENSOR with a count for every event and a millis pause when active
*/
/////////////////////////////
int period = 10; // minutes
unsigned long time_now = 0;
unsigned long time_now2 = 0;
unsigned long time_now3 = 0;
unsigned long time_now4 = 0;
unsigned long time_now5 = 0;
int counter = 0;
//VARS
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
#define blueLed 13
unsigned long previousMillis = 0; // stores last time Led blinked
long interval = 200; // interval at which to blink (milliseconds)
//----------
int calibrationTime = 10;
//the time when the sensor outputs a low impulse
long unsigned int lowIn;
//the amount of milliseconds the sensor has to be low
//before we assume all motion has stopped
long unsigned int pause = 1000;
boolean lockLow = true;
boolean takeLowTime;
int pirPin = 2; //the digital pin connected to the PIR sensor's output
int ledPin = 12; // solenoid pin
/////////////////////////////
//SETUP
void setup(){
Serial.begin(9600);
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(pirPin, LOW);
//----
// set the digital pin as output:
pinMode(blueLed, OUTPUT);
//----
//give the sensor some time to calibrate
Serial.print("calibrating sensor ");
for(int i = 0; i < calibrationTime; i++){
Serial.print(".");
delay(1000);
}
Serial.println(" done");
Serial.println("SENSOR ACTIVE");
delay(50);
}
////////////////////////////
//LOOP
void loop(){
Ser();
Blink();
time_now = millis();
Sensor();
}
void Ser() {
if(millis() > time_now4 + 10000){
Serial.println();
Serial.print("The number of events : ");
Serial.print(counter);
Serial.println();
Serial.print(period);
Serial.print(" - Minutes for delay on");
Serial.println();
time_now4 = millis();}
}
void Sensor() {
if(digitalRead(pirPin) == HIGH){
while(millis() < time_now + period*60000){
if(millis() > time_now5 + period*60000){
counter = counter+1;
Serial.println("The number of events : ");
Serial.println(counter);
time_now5 = millis();}
digitalWrite(ledPin, LOW); //the led visualizes the sensors output pin state
if(millis() > time_now2 + 10000){
Serial.print("motion detected HOLD ");
Serial.print(millis()/1000);
Serial.println(" sec");
delay(50);
time_now2 = millis();
}
takeLowTime = true;
if(lockLow){ //makes sure we wait for a transition to LOW before any further output is made:
lockLow = false;
if(millis() > time_now3 + 1000){
Serial.println("---");
Serial.print("motion detected at ");
Serial.print(millis()/1000);
Serial.println(" sec");
delay(50);
time_now3 = millis();
}
}
}
}
if(digitalRead(pirPin) == LOW){
digitalWrite(ledPin, HIGH); //the led visualizes the sensors output pin state
if(takeLowTime){
lowIn = millis(); //save the time of the transition from high to LOW
takeLowTime = false; //make sure this is only done at the start of a LOW phase
}
//if the sensor is low for more than the given pause,
//we assume that no more motion is going to happen
if(!lockLow && millis() - lowIn > pause){
//makes sure this block of code is only executed again after
//a new motion sequence has been detected
lockLow = true;
if(millis() > time_now2 + 1000){
Serial.println("---");
Serial.print("motion ended at "); //output
Serial.print((millis() - pause)/1000);
Serial.println(" sec");
delay(50);
time_now2 = millis();
}
}
}
}
void Blink() {
//-/---
if (millis() - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = millis();
digitalWrite(blueLed, !digitalRead(blueLed)); //change led state
}
}