/*
Arduino Starter Kit example
Project 12 - Knock Lock
This sketch is written to accompany Project 12 in the Arduino Starter Kit
Parts required:
- 1 megohm resistor
- 10 kilohm resistor
- three 220 ohm resistors
- piezo
- servo motor
- push button
- one red LED
- one yellow LED
- one green LED
- 100 uF capacitor
created 18 Sep 2012
by Scott Fitzgerald
Thanks to Federico Vanzati for improvements
https://store.arduino.cc/genuino-starter-kit
This example code is part of the public domain.
*/// import the library
#include<Servo.h>// create an instance of the Servo library
ServomyServo;constintpiezo=A0;// pin the piezo is attached to
constintswitchPin=2;// pin the switch is attached to
constintyellowLed=3;// pin the yellow LED is attached to
constintgreenLed=4;// pin the green LED is attached to
constintredLed=5;// pin the red LED is attached to
// variable for the piezo value
intknockVal;// variable for the switch value
intswitchVal;// variables for the high and low limits of the knock value
constintquietKnock=10;constintloudKnock=100;// variable to indicate if locked or not
boollocked=false;// how many valid knocks you've received
intnumberOfKnocks=0;
voidsetup(){// attach the servo to pin 9
myServo.attach(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
Serial.begin(9600);// turn the green LED on
digitalWrite(greenLed,HIGH);// move the servo to the unlocked position
myServo.write(0);// print status to the Serial Monitor
Serial.println("the box is unlocked!");}
voidloop(){// 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;// change the status LEDs
digitalWrite(greenLed,LOW);digitalWrite(redLed,HIGH);// move the servo to the locked position
myServo.write(90);// 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>0){// check to see if the knock is in range
if(checkForKnock(knockVal)==true){// increment the number of valid knocks
numberOfKnocks++;}// 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
myServo.write(0);// wait for it to move
delay(20);// change status LEDs
digitalWrite(greenLed,HIGH);digitalWrite(redLed,LOW);Serial.println("the box is unlocked!");numberOfKnocks=0;}}}
// this function checks to see if a detected knock is within max and min range
boolcheckForKnock(intvalue){// 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);delay(50);digitalWrite(yellowLed,LOW);// print out the status
Serial.print("Valid knock of value ");Serial.println(value);// return true
returntrue;}// if the knock is not within range
else{// print status
Serial.print("Bad knock value ");Serial.println(value);// return false
returnfalse;}}