Project 12 Knock Lock blz 125. terug naar de inleiding
Schets om een doos met een drukknop te sluiten en door te kloppen weer te openen.
De doos opent zich na 3 keer kloppen met een juiste intensiteit.
De schets maakt gebruik van het Piezo element als microfoon, en de boolean functie "klopcontrole" die de klopintensiteit test.
// De servo lib importeren
#include <Servo.h>
// Een instantie of object van het type Servo aanmaken
Servo myServo;
//De pinnummers in constanten stoppen
//inputpinnen
const int piezoPin = A0;
const int schakelPin = 2;
//outputpinnen
const int ledGeel = 3;
const int ledGroen = 4;
const int ledRood = 5;
//in de variabele "klopWaarde' komt de sterkte van het klopsignaal gedetecteerd door het piezo kristal
int klopWaarde;
//in de variable "schakeltoestand" komt de toestand van de schakelpin
int schakeltoestand;
//constanten waarmee je het interval van de klopintensiteit vast leg, hier [10, 100]
//Deze constanten worden gebruikt in de boolean functie "klopcontrole".
const int zachteKlopgrens = 10;
const int hardeKlopgrens = 100;
// De boolean om aan te geven of de doos dicht of open is.
// Als dicht niet waar is (false) kan je de doos openen.
boolean dicht = false;
// het aantal geregistreerde kloppen, met de juiste klopintensiteit komt in "aantalKloppen".
int aantalKloppen = 0;
void setup() {
///---------De pinnen initieren--------
// De servomotor is verbonden met pin 9
myServo.attach(9);
//De led pinnen zijn output pinnen
pinMode(ledGeel, OUTPUT);
pinMode(ledRood, OUTPUT);
pinMode(ledGroen, OUTPUT);
// De schakel- en piezo pinnen zijn input pinnen
pinMode(schakelPin, INPUT);
pinMode(piezoPin, INPUT);
// serial communicatie starten
Serial.begin(9600);
//----------startsituatie initieren-----------
// Groene led staat aan
digitalWrite(ledGroen, HIGH);
// De servo in "open" stand zetten
myServo.write(0);
// Deze stand naar de serieele monitor schrijven
Serial.println("Je kan de doos openen!");
}
void loop() {
//------------Code om de doos met het drukknopje te sluiten-----------------
// testen of de doos open is
if (dicht == false) {
// De schakelpin uitlezen
schakeltoestand = digitalRead(schakelPin);
//Als de knop wordt ingedrukt wodt dit if statement, om de doos te sluiten, doorlopen.
if (schakeltoestand == HIGH) {
// De boolean dicht op "true" zetten
dicht = true;
// met de ledjes aangeven dat de doos gesloten is
digitalWrite(ledGroen, LOW);
digitalWrite(ledRood, HIGH);
// De servomotor op 90 graden zetten, zodat de doos zal sluiten
myServo.write(90);
// Dit naar de serieele monitor schrijven
Serial.println("De doos is gesloten!");
// 1 sec wachten
delay(1000);
}
}
//----------Code om de doos te openen door 3 keer, met de juiste intensiteit te kloppen--------
// Testen of de doos dicht is
if (dicht == true) {
// De klopintensiteit uitlezen en als 10 bit getal naar "klopWaarde" schrijven
klopWaarde = analogRead(piezoPin);
// Dit if statement doorlopen zolang het aantal kloppen minder dan 3 is
// en een klop is gedetecteerd
if (aantalKloppen < 3 && klopWaarde > 0) {
// De boolean functie "klopcontrole" controleert de intensiteit van het kloppen
// "klopWaarde" wordt ,tbv deze controle, als argument aan "klopcontrole" gegeven
// De boolean functie geeft "true" terug als "klopwaarde" binnen het interval [10,100] valt
if (klopcontrole(klopWaarde) == true) {
// Als de klop de juiste intensiteit heeft, deze optellen bij het vorige aantal
aantalKloppen++;
}
//Het aantal keren dat er nog, met de juiste intensiteit, moet worden geklopt uitprinten
Serial.print(3 - aantalKloppen);
Serial.println(" keer nog te kloppen");
}
// Als er 3 kloppen met de juiste intensiteit zijn bereikt gaat de doos open
if (aantalKloppen >= 3) {
// de doos openen
dicht = false;
// De servomoter in de "open" stand zetten
myServo.write(0);
//20 milliseconde wachten
delay(20);
// met de ledjes aangeven dat de doos geopen is
digitalWrite(ledGroen, HIGH);
digitalWrite(ledRood, LOW);
Serial.println("de doos is open");
//Als de doos zich gaat openen "aantalKloppen" resetten.
aantalKloppen = 0;
}
}
}
// De boolean functie "klopcontrole" conntroleert de klopintensiteit
// "klopWaarde" komt als argument binnen en wordt in de integer "waarde" gestopt
// Als alles klopt wordt "klopcontrole" true.
boolean klopcontrole(int waarde) {
// het testen van "waarde"
if (waarde > zachteKlopgrens && waarde< hardeKlopgrens) {
//Als de intensiteit goed is gaat het gele ledje 50 milliseconde branden
digitalWrite(ledGeel, HIGH);
delay(50);
digitalWrite(ledGeel, LOW);
// De klopintensiteit uitprinten
Serial.print("de klopintensiteit is goed ");
Serial.println(waarde);
//Maak "klopcontrole" true
return true;
}
// Als de klopintensiteit fout is
else {
// print de klopintensiteit
Serial.print("De klopintensiteit is fout ");
Serial.println(waarde);
//Maak "klopcontrole" false.
return false;
}
}