Keypad mot de passe

Bonjour,

je viens vous demander de l'aide par rapport à un code pour faire un mot de passe. Je ne comprends pas très bien comment il fonctionne surtout à partir de la première boucle If. Si quelqu'un pouvait me l'expliquer cela serait très gentil. Dans la boucle If c'est surtout les " While" que je ne comprends pas :

           a=keypad.getKey();

   while(a == NO_KEY)

          a=keypad.getKey();

          Serial.print(a); 

à quoi correspond le "NO_KEY" ?
à quoi correspond le "kepad.getKey" ?
pourquoi écrire "a=keypad.getKey();" avant et après le " While "
pourquoi faire toute la boucle if comme cela ?

Concernant la partie Can, à quoi correspond CAN.sendMsgBuf (0x10, 0, 1, Valeur); ?

#include <Keypad.h>
#include <SPI.h>
#include "mcp_can.h"





const byte ROWS = 4;

const byte COLS = 3;

char keys[ROWS][COLS] = {
  
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
  
};

int Code;

unsigned char Valeur[8]; 

byte rowPins[ROWS] = {7, 5, 3, 2};

byte colPins[COLS] = {4, 9, 8};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){ 
  
  Serial.begin(115200); // 
  
     delay(100);

START_INIT:


  if(CAN_OK == CAN.begin(CAN_500KBPS))  
   {
        Serial.println("CAN BUS Shield init ok!");
  }
   else
  {
    Serial.println("CAN BUS Shield init fail");
      
     Serial.println("Init CAN BUS Shield again");
   delay(100);
    
      goto START_INIT;
  
   }
 }
 



 
void loop(){
 
char a;
char b;
char c;
char d;


 
  char key = keypad.getKey();
  
  
   if (key =keypad.getKey()) {
    
   

               Serial.println ( "");
     
       
       while(key != NO_KEY)key=keypad.getKey();
  
              Serial.println(" taper le mot de passe ");
 
              a=keypad.getKey();
   
       while(a == NO_KEY)
  
              a=keypad.getKey();
  
              Serial.print(a);
 
              b=keypad.getKey();
  
       while(b == NO_KEY)
  
              b=keypad.getKey();
  
              Serial.print(b);
  
              c=keypad.getKey();
  
       while(c == NO_KEY)
  
              c=keypad.getKey();
  
              Serial.print(c);
  
              d=keypad.getKey();
  
        while(d == NO_KEY)
  
             d=keypad.getKey();
  
             Serial.print(d);
 
             Serial.println ("");
 
      if (a=='2' && b=='6' && c=='0' && d=='1') {
      
            Serial.println(" code valide");
      
            Serial.println("démarrage en cours... ");

            Code=1;
      
                    }
          
     if (a!='2' | b!='6' | c!='0' | d!='1'){
 
           Serial.println("Code erroné ");

            Code=0;
            
                    }

          Valeur[0]=Code; 
  CAN.sendMsgBuf(0x10, 0, 1, Valeur); 

delay(500);

      
  }

  
  }

Où as-tu trouvé ce code ? Il ne semble de très bonne facture...

j'ai assemblé plusieurs codes pour en faire un seul et j'ai rajouté la partie Can. La partie que je ne comprends c'est les "While". Pourquoi les avoir rédigé ainsi ?

Déjà, ce n'est pas bon : un test d'égalité c'est '=='.
Le while se lit comme ça :

a=keypad.getKey();
while (a == NO_KEY)  a=keypad.getKey();

La première ligne lit le keypad. Ensuite, tant que cette valeur est vide, il continue à lire le keypad. Il passera donc à l'instruction suivante lorsque le keypad aura renvoyé quelque chose (l'appui sur une touche). Il affiche la touche, et passe à la suite.

La suite c'est de faire la même chose mais en stockant la touche dans une autre variable. Il fait ça 4 fois car ton pass contient 4 caractères. Les caractères sont stockés dans les variables a, b, c et d.

A la fin, il vérifie que les touches correspondent bien au code :
if (a=='2' && b=='6' && c=='0' && d=='1') {
le code est bien sûr 2601

Ca c'est pas bon : un test 'ou' c'est '||'.
Tu peux faire plus simple avec else :

if (a=='2' && b=='6' && c=='0' && d=='1') {
            Serial.println(" code valide");
            Serial.println("démarrage en cours... ");
            Code=1;
 }    else {
           Serial.println("Code erroné ");
            Code=0;
   }

Merci beaucoup !!!

Pourriez-vous également me dire à quoi sert cette ligne :

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ) ;

Et aussi, pourquoi devons-nous ecrire la ligne ci-dessous comme cela ? Sommes-nous obligé de définir les touches comme cela ? ou est-ce pour nous, afin que cela soit mieux représentatif ?

char keys[ROWS][COLS] = {
  
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
  
} ;

Je suis d'accord avec vous pour le "un test 'ou' c'est '||'." après, le code a quand même fonctionné avec une seule barre.

En vous remerciant d'avance.

Oui, parce que tu es dans un cas ou toutes les sous expressions sont des booleens donc dans ce cas || et | font la même chose.

1 Like

Avec cette ligne, tu déclares une instance de Keypad appelée 'keypad' en utilisant le constructeur Keypad, qui a des arguments dont le premier est le résultat de l'appel de la méthode makeKeymap. Un peu compliqué...

Pour définir les touches, tu n'es pas obligé de faire exactement comme ça. Ceci fonctionnera aussi :
char keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} } ;
Mais avec l'autre manière, tu vois comment sont organisées les touches sur le clavier (en tout cas, c'est le but).

Non tu n'es pas obligé de définir un tableau à deux dimensions.
Tu peux aussi faire
char keys[] = { '1', '2', '3','4', '5', '6','7', '8', '9', '*', '0', '#'};
La fonction makeKeymap() permet d'accepter le deux définitions.

Mais la première définition est quand-même plus explicite.

Le contenu du tableau doit correspondre à la disposition des touches de ton clavier.
Si ton clavier se présente différemment il faut adapter le contenu du tableau.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.