Go Down

Topic: probleme de validation digicode (Read 804 times) previous topic - next topic

anthology

bonjour a tous
j'ai actuellement installer un digicode pour un portail
le principe est simple
un code est demander
si le code est bon je viens piloter un opto pour l'ouverture ( et j'allume une led )
si le code n'est pas bon j'allume une autre led 
jusqu'à la pas de soucis
la carte est faite et fonctionne
( arduino nano avec opto led et keypad 4X3 alimenter par une alim 12V sur la broche VIN de l'arduino )
seulement les utilisateurs mon remonté un problème embêtant
quand il attende un peu devant le digicode il suffit d'appuyer sur le bouton de validation pour ouvrir le portail
j'avoue ne pas avoir eu de problème lors de mes test
j'ai penser a un problème de parasite
ou de watchdog qui reset la carte et qui valide n'importe quel bouton pendant le reset
donc ouverture

si vous avez une idée je suis preneur

voici le code
Code: [Select]

/*
||  Ouverture portail avec keypad 4x3
||  Création le 07/04/2013
||  allumage led sur pin 10 quand code mauvais
||  allumage led sur pin 11 quand code bon
||  pilotage opto sur pin 9 quand code bon ( voiture )
*/


//* valide la saisie 
//# reset la saisie

/////////////////////////////////////////////////////////////////

#include <avr/wdt.h>
#include <Password.h> //http://www.arduino.cc/playground/uploads/Code/Password.zip
#include <Keypad.h> //http://www.arduino.cc/playground/uploads/Code/Keypad.zip

Password password = Password( "1159" );    // voiture


const byte ROWS = 4; // 4 lignes
const byte COLS = 3; // 3 colonnes
// Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte rowPins[ROWS] = {8, 7, 6, 5};// Connecter le keypad ROW0, ROW1, ROW2 and ROW3 sur les pins 8.7.6.5
byte colPins[COLS] = {4, 3, 2};// Connecter le keypad COL0, COL1 and COL2 sur les pins 4.3


// Création du keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  wdt_enable (WDTO_8S);  // Initialise le watchdog avec un délais de 8 secondes
  keypad.addEventListener(keypadEvent); // ajout d'un evenement keypad voiture
  pinMode(10, OUTPUT);   // mauvais
  pinMode(11, OUTPUT);   // bon
  pinMode(9, OUTPUT);   // opto
}

void loop(){
  wdt_reset ();  // remet à zéro le timeout du watchdog
  keypad.getKey();
}

// mise en place bouton voiture
void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
    case PRESSED:
switch (eKey){
  case '*': checkPassword(); break;
  case '#': password.reset(); break;
  default: password.append(eKey);
     }
  }
}


void checkPassword(){        // opto
  if (password.evaluate()){ // action quand code bon
    digitalWrite(11, HIGH); // allumage led bon
    digitalWrite(9, HIGH); // opto
    delay(500);
    digitalWrite(9, LOW);
    delay(1500);
    digitalWrite(11, LOW);
  }else{                    // action quand code mauvais
    digitalWrite(10, HIGH);
    delay(2000);
    digitalWrite(10, LOW);
  }
}





fdufnews

Tu fonctionnes toujours avec tes 10m de câble et sans pullups?
Tu ferais bien de regarder ce que te retourne keypad.getKey();

Au niveau de la sécurité du code. A la fin de password.evaluate que le retour soit true ou false et après un password.append qui retourne false il faudrait faire un password.reset.
En particulier (et je crois ne pas me tromper) si password.evaluate retourne true et que la chaine n'est pas réinitialisée, il suffit de faire un # et on entre comme on veut sans avoir à ressaisir le code.

B@tto

+1

Code: [Select]

case '*': checkPassword(); password.reset(); break;


D'autre part je te conseille de prendre en charge une limite max du nombre de caractères. Si un ptit malin en tape plus de 20 (limite par défaut de la lib), dieu seul sait ce qui pourrait se passer ...
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

fdufnews


+1

Code: [Select]

case '*': checkPassword(); password.reset(); break;


D'autre part je te conseille de prendre en charge une limite max du nombre de caractères. Si un ptit malin en tape plus de 20 (limite par défaut de la lib), dieu seul sait ce qui pourrait se passer ...

La librairie le gère. Elle ne fait rien et retourne false.

anthology

merci a vous pour ses réponses
non plus de cable entre les deux ( cellules en sortie pour ouverture du portail )
pas de pullup nan plus
je viens de modifier le code en rajoutant le password reset et les pullup
si vous pouvez me dire si vous voyez des erreurs
merci a vous
Code: [Select]
/*
||  Ouverture portail avec keypad 4x3
||  Création le 07/04/2013
||  allumage led sur pin 10 quand code mauvais
||  allumage led sur pin 11 quand code bon
||  pilotage opto sur pin 9 quand code bon ( voiture )
*/


//* valide la saisie 
//# reset la saisie

/////////////////////////////////////////////////////////////////

#include <avr/wdt.h>
#include <Password.h> //http://www.arduino.cc/playground/uploads/Code/Password.zip
#include <Keypad.h> //http://www.arduino.cc/playground/uploads/Code/Keypad.zip

Password password = Password( "1159" );    // voiture


const byte ROWS = 4; // 4 lignes
const byte COLS = 3; // 3 colonnes
// Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte rowPins[ROWS] = {8, 7, 6, 5};// Connecter le keypad ROW0, ROW1, ROW2 and ROW3 sur les pins 8.7.6.5
byte colPins[COLS] = {4, 3, 2};// Connecter le keypad COL0, COL1 and COL2 sur les pins 4.3


// Création du keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  wdt_enable (WDTO_8S);  // Initialise le watchdog avec un délais de 8 secondes
  keypad.addEventListener(keypadEvent); // ajout d'un evenement keypad voiture
  pinMode(10, OUTPUT);   // mauvais
  pinMode(11, OUTPUT);   // bon
  pinMode(9, OUTPUT);   // opto
  digitalWrite(5, HIGH);       // turn on pullup resistors
  digitalWrite(6, HIGH);       // turn on pullup resistors
  digitalWrite(7, HIGH);       // turn on pullup resistors
  digitalWrite(8, HIGH);       // turn on pullup resistors

}

void loop(){
  wdt_reset ();  // remet à zéro le timeout du watchdog
  keypad.getKey();
}

// mise en place bouton voiture
void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
    case PRESSED:
switch (eKey){
  case '*': checkPassword(); password.reset(); break;
  case '#': password.reset(); break;
  default: password.append(eKey);
     }
  }
}


void checkPassword(){        // opto
  if (password.evaluate()){ // action quand code bon
    digitalWrite(11, HIGH); // allumage led bon
    digitalWrite(9, HIGH); // opto
    delay(500);
    digitalWrite(9, LOW);
    delay(1500);
    digitalWrite(11, LOW);
  }else{                    // action quand code mauvais
    digitalWrite(10, HIGH);
    delay(2000);
    digitalWrite(10, LOW);
  }
}




Go Up