Pages: [1] 2   Go Down
Author Topic: Demande d'aide pour projet PPE Secret Knock Detect  (Read 1905 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 18
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Actuellement en T s j'aurais besoin d'aide pour la modification du programme Secret Knock Detecting Door Lock. J'ai souhaiterais le modifier en ajoutant :
-1 ils prioritaire dans  le programme (interrupteur de porte)
-1ils fin de course pour le moteur de déverrouillage de la porte
-Au bout de 5 fois code, le programme se met en pause et la led rouge clignote, tous ca pendant 2min, après ces 2min le programme et de nouveau opérationnel
Voila merci d'avance de votre aide ^^ ;D
Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3228
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

D'après ce que tu écris dans un autre sujet:

Quote
HELP!! Meeee  :'( :'( ;D ;D

Quote
Je ne sais pas programmer c'est ca le problème  smiley-wink je débute^^

Il faut déjà que tu apprennes un minimum à coder.... c'est pas que ce que tu demandes soit compliqué, mais c'est comme quand on veut faire de la moto avec une ancienne bécane.... faut mettre les mains dans le cambouis. smiley-wink

Va voir ici et tu reviens quand tu as tout lu 4 fois au moins  ;D et fait les exercices...:

http://www.siteduzero.com/tutoriel-3-14189-apprenez-a-programmer-en-c.html


Et mets des liens... c'est la moindre, ça évite de passer encore 10min pour chercher le bout de code que tu veux modifier... 8-)
« Last Edit: April 11, 2010, 02:25:36 am by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

0
Offline Offline
Newbie
*
Karma: 0
Posts: 18
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quand j'ai dis que je ne savait pas programmer c'était y a un mois depuis sa a changé^^
Je demande juste de l'aide. :-[
J'ai déjà commencer a introduire les ils dans le programme mais je ne sais pas comment mettre l'extinction du programme au boue de 5 fautes.

http://grathio.com/2009/11/secret-knock-detecting-door-lock.html
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 18
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

// Pin definitions
const int Piezo = 0;               // Piezo pin 0 analogique.
const int BPprogramme = 2;         // Bouton nouveau code.
const int moteur = 3;              // Moteur.
const int LEDjaune = 4;            // LED Staut moteur.
const int LEDverte = 5;            // LED Frappe.
////////////////////////////
const int LEDrouge = 8;            // LED code incorrect.
const int LEDbleu = 9;             // LED Statut porte.
const int ils = 7;                 // Interrupteur fin de course.
const int ils2 = 6;                // Interrupteur porte.
///////////////////////////////
 
// Tuning constants.  Could be made vars and hoooked to potentiometers for soft configuration, etc.
const int sensibilite = 100;       // sensibilité
const int rejectValue = 25;        // If an individual knock is off by this percentage of a knock we don't unlock..
const int averageRejectValue = 15; // If the average timing of the knocks is off by this percent we don't unlock.
const int knockFadeTime = 150;     // milliseconds we allow a knock to fade before we listen for another one. (Debounce timer.)
const int lockTurnTime = 650;      // milliseconds that we run the motor to get it to go a half turn.

const int maximumKnocks = 20;      // Maximum number of knocks to listen for.
const int knockComplete = 1200;    // Longest time to wait for a knock before we assume that it's finished.


// Variables.
int secretCode[maximumKnocks] = {100, 100, 100, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};  // Initial setup: "Shave and a Hair Cut, two bits."
int knockReadings[maximumKnocks];   // When someone knocks this array fills with delays between knocks.
int knockSensorValue = 0;           // Dernière lecture du capteur de cognement.
int programButtonPressed = false;   // Flag so we remember the programming button setting at the end of the cycle.
//////////////////////////////////////////////////
int ilsetat = 0;
int ils2etat = 0;
/////////////////////////////////////////////////

void setup() {
  pinMode(Piezo, OUTPUT);
  pinMode(moteur, OUTPUT);
  pinMode(LEDjaune, OUTPUT);
  pinMode(LEDverte, OUTPUT);
  pinMode(BPprogramme, INPUT);
 
 //////////////////////////////////////////////
  pinMode(LEDrouge, OUTPUT);
  pinMode(LEDbleu, OUTPUT);
  pinMode(ils, INPUT);                // Interrupteur fin de course.
  pinMode(ils2, INPUT);               //Interrupteur porte.
 ////////////////////////////////////////////////
  
  Serial.begin(9600);                                 // Uncomment the Serial.bla lines for debugging.
  Serial.println("Demarrage du Programme.");       // but feel free to comment them out after it's working right.
  
  digitalWrite(LEDverte, HIGH);       // Green LED on, everything is go.
}
void loop() {
  ////////////////////////////////////////

int etatils2 = digitalRead(ils2);
  if (etatils2 == HIGH) {
digitalWrite(LEDbleu, HIGH);
    
   Serial.println("PORTE FERMEE.");  
  ///////////////////////////////////////
  
  // Listen for any knock at all.
  knockSensorValue = analogRead(Piezo);
  
  if (digitalRead(BPprogramme)==HIGH){    // Si le bouton et pressé?
    programButtonPressed = true;          // Oui, laisse ainsi enregistrer cet état
    digitalWrite(LEDjaune, HIGH);         // and turn on the red light too so we know we're programming.
  } else {                                //SI NON
    programButtonPressed = false;
    digitalWrite(LEDjaune, LOW);
  }
  
  if (knockSensorValue >=sensibilite){
    listenToSecretKnock();
    }
//// /////////////////////////////////
  }
else {

  etatils2 == LOW;
  ///arreter le programme
  digitalWrite(LEDbleu, LOW);

  
  Serial.println("FERMEE LA PORTE");
 
 }
 
}
////// ///////////////////////////

// Records the timing of knocks.
void listenToSecretKnock(){
 
  Serial.println("knock starting");  

  int i = 0;
  // First lets reset the listening array.
  for (i=0;i<maximumKnocks;i++){
    knockReadings=0;
  }
  
  int currentKnockNumber=0;                           // Incrementer for the array.
  int startTime=millis();                             // Reference for when this knock started.
  int now=millis();
  
  digitalWrite(LEDverte, LOW);                        // we blink the LED for a bit as a visual indicator of the knock.
  if (programButtonPressed==true){
     digitalWrite(LEDjaune, LOW);                         // and the red one too if we're programming a new knock.
  }
  delay(knockFadeTime);                                     // wait for this peak to fade before we listen to the next one.
  digitalWrite(LEDverte, HIGH);  
  if (programButtonPressed==true){
     digitalWrite(LEDjaune, HIGH);                        
  }
  do {
    //listen for the next knock or wait for it to timeout.
    knockSensorValue = analogRead(Piezo);
    if (knockSensorValue >=sensibilite){                   //got another knock...
      //record the delay time.
      Serial.println("knock.");
      now=millis();
      knockReadings[currentKnockNumber] = now-startTime;
      currentKnockNumber ++;                             //increment the counter
      startTime=now;          
      // and reset our timer for the next knock
      digitalWrite(LEDverte, LOW);  
      if (programButtonPressed==true){
        digitalWrite(LEDjaune, LOW);                       // and the red one too if we're programming a new knock.
      }
      delay(knockFadeTime);                              // again, a little delay to let the knock decay.
      digitalWrite(LEDverte, HIGH);
      if (programButtonPressed==true){
        digitalWrite(LEDjaune, HIGH);                        
      }
    }

    now=millis();
    
    //did we timeout or run out of knocks?
  } while ((now-startTime < knockComplete) && (currentKnockNumber < maximumKnocks));
  
  //we've got our knock recorded, lets see if it's valid
  if (programButtonPressed==false){             // only if we're not in progrmaing mode.
    if (validateKnock() == true){
      triggerDoorUnlock();
    } else {
      Serial.println("Erreur code.");
      digitalWrite(LEDverte, LOW);              // We didn't unlock, so blink the red LED as visual feedback.
      for (i=0;i<4;i++){                              
        digitalWrite(LEDjaune, HIGH);
        delay(100);
        digitalWrite(LEDjaune, LOW);
        delay(100);
      }
      digitalWrite(LEDverte, HIGH);
    }
  } else { // if we're in programming mode we still validate the lock, we just don't do anything with the lock
    validateKnock();
    // and we blink the green and red alternately to show that program is complete.
    Serial.println("Nouveau code enregistré.");
    digitalWrite(LEDjaune, LOW);
    digitalWrite(LEDverte, HIGH);
    for (i=0;i<3;i++){
      delay(100);
      digitalWrite(LEDjaune, HIGH);
      digitalWrite(LEDverte, LOW);
      delay(100);
      digitalWrite(LEDjaune, LOW);
      digitalWrite(LEDverte, HIGH);      
    }
  }
}


// Runs the motor (or whatever) to unlock the door.
void triggerDoorUnlock(){
  Serial.println("Debloquee");
  int i=0;
  
  // turn the motor on for a bit.
//////////////////////////////
 if (ils2 == true)
 if (ils == true) {
///////////////////////////////  
  digitalWrite(moteur, HIGH);
  digitalWrite(LEDverte, HIGH);            // And the green LED too.
  
  //////////////////////
  delay (ils==true);                    // Wait a bit.
  /////////////////////////
  
  digitalWrite(moteur, LOW);            // Turn the motor off.
 

  // Blink the green LED a few times for more visual feedback.
  for (i=0; i < 5; i++){  
      digitalWrite(LEDverte, LOW);
      delay(100);
      digitalWrite(LEDverte, HIGH);
      delay(100);
  }
///////////////////////////////////////////////      
  } else {  
digitalWrite(moteur, LOW);
/////////////////////////////////////////////
  
  }
}


// Sees if our knock matches the secret.
// returns true if it's a good knock, false if it's not.
// todo: break it into smaller functions for readability.
boolean validateKnock(){
  int i=0;
 
  // simplest check first: Did we get the right number of knocks?
  int currentKnockCount = 0;
  int secretKnockCount = 0;
  int maxKnockInterval = 0;                            // We use this later to normalize the times.
  
  for (i=0;i<maximumKnocks;i++){
    if (knockReadings > 0){
      currentKnockCount++;
    }
    if (secretCode > 0){                                //todo: precalculate this.
      secretKnockCount++;
    }
    
    if (knockReadings > maxKnockInterval){       // collect normalization data while we're looping.
      maxKnockInterval = knockReadings;
    }
  }
  
  // If we're recording a new knock, save the info and get out of here.
  if (programButtonPressed==true){
      for (i=0;i<maximumKnocks;i++){ // normalize the times
        secretCode= map(knockReadings,0, maxKnockInterval, 0, 100);
      }
      // And flash the lights in the recorded pattern to let us know it's been programmed.
      digitalWrite(LEDverte, LOW);
      digitalWrite(LEDjaune, LOW);
      delay(1000);
      digitalWrite(LEDverte, HIGH);
      digitalWrite(LEDjaune, HIGH);
      delay(50);
      for (i = 0; i < maximumKnocks ; i++){
        digitalWrite(LEDverte, LOW);
        digitalWrite(LEDjaune, LOW);  
        // only turn it on if there's a delay
        if (secretCode > 0){                                  
          delay( map(secretCode,0, 100, 0, maxKnockInterval)); // Expand the time back out to what it was.  Roughly.
          digitalWrite(LEDverte, HIGH);
          digitalWrite(LEDjaune, HIGH);
        }
        delay(50);
      }
        return false;       // We don't unlock th
Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3228
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu mets une fonction qui contrôle vrai-faux, vrai = +0, faux =+ 1  tu incrémente une variable "faute" quand elle est à 5 ça bloque, tu remets faute à 0 et tu mets un delay (120000) pour attendre deux minutes.
« Last Edit: April 11, 2010, 06:34:25 am by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

0
Offline Offline
Newbie
*
Karma: 0
Posts: 18
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci beaucoup!!!!^^ et purkoi dans mon programme  """Serial.println("PORTE FERMEE.");"" et "" Serial.println("FERMEE LA PORTE");"" défile lorsque je mets serial monitor??  smiley-grin
Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3228
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ce serait pas pour savoir l'état de la porte  :smiley ... Enfin, je dis ça parce que ça me semble évident  :-?

Et "Fermee la porte" pour que tu fermes la porte ça sert à rien de toquer si elle est ouverte..... à voir
« Last Edit: April 11, 2010, 12:04:15 pm by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

0
Offline Offline
Newbie
*
Karma: 0
Posts: 18
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui bien sur, mais pourquoi sa défile? smiley-razz Je voulais mettre ces information pour écrire par la suite sur un lcd :o
Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3228
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ta boucle en se répétant lis imprime à chaque cycle l'état de la porte, fait comme avant une fonction qui te fais passer par dessus le serialprint au deuxième passage si l'état n'a pas changé.
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

0
Offline Offline
Newbie
*
Karma: 0
Posts: 18
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Comment ca???? ;D et je fais comment?
« Last Edit: April 11, 2010, 04:25:48 pm by floman » Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3228
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Un truc genre :

if (etat_porte==1){
serialprint(porte fermee);
etat_porte=0;
}
...

if (etat_porte==0){
serialprint(fermee la porte);
etat_porte=1;
}
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

0
Offline Offline
Newbie
*
Karma: 0
Posts: 18
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'ai encore une question au niveau du serial println , comment l'inclure dans le programme ??? ;D
Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3228
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Le "ln" indique que tu veux que ton texte saute à la ligne.

Exemple :

Code:
...
Serial.print ("aujourd'hui");
Serial.println("il fait beau,");
Serial.print ("demain aussi");
...

Ce qui donne :

aujourd'hui il faut beau,
demain aussi
« Last Edit: April 14, 2010, 08:10:14 am by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

0
Offline Offline
Newbie
*
Karma: 0
Posts: 18
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui sa je sais smiley mais se que je ne sais pas c'est comment le mettre dans le programme pour que le me ssage ne défile plus comme tu m'avais expliqué smiley-grin
Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3228
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu peux pas être un peu plus clair dans tes questions, parce que là  :-? ?
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Pages: [1] 2   Go Up
Jump to: