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();
}
}
}
}
This function is doing a lot; maybe more than a single function ought to. You should look into introducing a State Machine approach to managing the Sensor.