Go Down

Topic: Demande d'aide pour projet PPE Secret Knock Detect (Read 2 times) previous topic - next topic

floman57

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

Jean-François

#1
Apr 11, 2010, 08:40 am Last Edit: Apr 11, 2010, 09:25 am by jfs Reason: 1
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  ;) 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. ;)

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-)
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

floman57

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

floman57

// 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

Jean-François

#4
Apr 11, 2010, 01:02 pm Last Edit: Apr 11, 2010, 01:34 pm by jfs Reason: 1
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.
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

floman57

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

Jean-François

#6
Apr 11, 2010, 06:57 pm Last Edit: Apr 11, 2010, 07:04 pm by jfs Reason: 1
Ce serait pas pour savoir l'état de la porte  ::) ... 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
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

floman57

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

Jean-François

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é.
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

floman57

#9
Apr 11, 2010, 11:23 pm Last Edit: Apr 11, 2010, 11:25 pm by floman Reason: 1
Comment ca???? ;D et je fais comment?

Jean-François

Un truc genre :

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

if (etat_porte==0){
serialprint(fermee la porte);
etat_porte=1;
}
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

floman57

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

Jean-François

#12
Apr 14, 2010, 03:09 pm Last Edit: Apr 14, 2010, 03:10 pm by jfs Reason: 1
Le "ln" indique que tu veux que ton texte saute à la ligne.

Exemple :

Code: [Select]

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


Ce qui donne :

aujourd'hui il faut beau,
demain aussi
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

floman57

Oui sa je sais :) 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é :D

Jean-François

Tu peux pas être un peu plus clair dans tes questions, parce que là  :-? ?
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

Go Up