Knock lock reset knocks after some time

Ok, so basically I’m a complete noob at Arduino, however what i want to do is to make a knock lock, but make it so that those knocks do not stay indefinitely, but would reset if no knock is done for, say 10 seconds. For example, someone knocks twice, then goes away and comes back later, knocks once, and it counts as one lock, and not 3.
Been trying to do that without creating a topic, but failed miserably :frowning: So far my code is the basic knock lock from arduino projects book with one added line of locks resetting after the lock unlocks.

#include <Servo.h>
// create an instance of the servo library
Servo myServo;

const int piezo = A0;      // pin the piezo is attached to
const int switchPin = 2;    // pin the switch is attached to
const int yellowLed = 3;    // pin the yellow LED is attached to
const int greenLed = 4;    // pin the green LED is attached to
const int redLed = 5;   // pin the red LED is attached to

// variable for the piezo value
int knockVal;
// variable for the switch value
int switchVal;

// variables for the high and low limits of the knock value
const int quietKnock = 10;
const int loudKnock = 100;

// variable to indicate if locked or not
boolean locked = false;
// how many valid knocks you've received
int numberOfKnocks = 0;

void setup(){
  // attach the servo to pin 9

  // make the LED pins outputs
  pinMode(yellowLed, OUTPUT);
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);

  // set the switch pin as an input
  pinMode(switchPin, INPUT);

  // start serial communication for debugging

  // turn the green LED on
  digitalWrite(greenLed, HIGH);

  // move the servo to the unlocked position

  // print status to the serial monitor
  Serial.println("the box is unlocked!");

void loop(){

  // if the box is unlocked
  if(locked == false){

    // read the value of the switch pin
    switchVal = digitalRead(switchPin);

    // if the button is pressed, lock the box
    if(switchVal == HIGH){
      // set the locked variable to "true"
      locked = true;
      if (numberOfKnocks >=3){
        numberOfKnocks = 0;

      // change the status LEDs

      // move the servo to the locked position

      // print out status
      Serial.println("the box is locked!");

      // wait for the servo to move into position
      delay (1000);

  // if the box is locked
  if(locked == true){

    // check the value of the piezo
    knockVal = analogRead(piezo);

    // if there are not enough valid knocks
    if(numberOfKnocks < 3 && knockVal > 50){

      // check to see if the knock is in range
      if(checkForKnock(knockVal) == true){

        // increment the number of valid knocks

      // print status of knocks
      Serial.print(3 - numberOfKnocks);
      Serial.println(" more knocks to go");

    // if there are three knocks
    if(numberOfKnocks >= 3){
      // unlock the box
      locked = false;

      // move the servo to the unlocked position

      // wait for it to move

      // change status LEDs
      Serial.println("the box is unlocked!");

// this function checks to see if a  
// detected knock is within max and min range
boolean checkForKnock(int value){
  // if the value of the knock is greater than
  // the minimum, and larger than the maximum
  if(value > quietKnock && value < loudKnock){
    // turn the status LED on
    digitalWrite(yellowLed, HIGH);
    digitalWrite(yellowLed, LOW);
    // print out the status
    Serial.print("Valid knock of value ");
    // return true
    return true;
  // if the knock is not within range
  else {
    // print status
    Serial.print("Bad knock value ");
    // return false
    return false;

If anyone could help me do this, I would be extremely thankful.

You need to look into using millis() for timing as in the BlinkWithoutDelay example and Several things at the same time Save the time the first knock happens then each time through loop() check whether the required period has elapsed since the knock. If not then go round loop() again reading inputs etc. If the period has elapsed then take the required action to reset the system ready for another series of knocks.

if(checkForKnock(knockVal) == true){

        // increment the number of valid knocks

Here you should also record when the knock happens, using millis().

Periodically (read that as "on every pass through loop()"), use millis() to determine now. If now minus then (when the last knock happened) exceeds some value and the knock count is not 0, reset the number of knocks to 0, and reset the last knock time to 0.