project 12 board

 

 

 

 

 

 

 

 

project 12 componenten

 

 

 

 

 

 

 

project 12 circuit

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; 
  } 
}