Faire son propre mot de passe

Bonjour
J’ai un programme qui permet de déverrouiller une gâche avec un mot de passe, mais le problème est que le mot de passe, ce n’est pas la personne qui le définit, car on le définit dans le programme mais on ne peut pas le changer après du coup, et c’est ce que j’aimerais réaliser pour améliorer mon programme mais je n’ai pas trouvé sur internet comment faire, donc merci d’avance pour ceux qui vont m’aider.

#include <Keypad.h> // Bibliothèque pour le clavier
#include <Password.h> // Bibliothèque pour le mot de passe


#define relais A0

Password pwd = Password("1234");

int nbCodeMauvais = 0;

const byte ROWS = 4; // 4 Ligne
const byte COLS = 3; // 3 Colonne
//define the cymbols on the buttons of the keypads
char clavier[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = {8, 7, 2, 3}; //Ligne
byte colPins[COLS] = {4, 5, 6}; //Colonne

//initialize an instance of class NewKeypad
Keypad keypad = Keypad( makeKeymap(clavier), rowPins, colPins, ROWS, COLS);



void setup() {
  pinMode(relais, OUTPUT);
  pinMode(A3, INPUT_PULLUP);

  Serial.begin(9600);
  keypad.addEventListener(keypadEvent);
}

void loop() {
  int singal = digitalRead(A3);



  keypad.getKey();
}

void entree() {
  digitalWrite(relais, HIGH);
  delay(100);
  digitalWrite(relais, LOW);
}


void keypadEvent(KeypadEvent eKey) {
  switch (keypad.getState()) {
    case PRESSED:
      Serial.println(eKey);
      switch (eKey) {
        case '*': checkPassword(); break;
        case '#': pwd.reset(); break;
        default: pwd.append(eKey);
      }
  }
}

void checkPassword() {
  if (pwd.evaluate()) {
    Serial.println("Code bon");
    entree();
    nbCodeMauvais = 0;
    pwd.reset();
    //Add code to run if it works

    
  } else {
    Serial.println("Code mauvais");
    
    nbCodeMauvais++;
    //add code to run if it did not work
    if (nbCodeMauvais == 3)
    { Serial.println("Code bloqué");
    nbCodeMauvais = 0;
    Serial.println("Code débloqué");
    }
    pwd.reset();
  }
}

Tu dois définir le moyen de changer le mot de passe. Avec le Keypad ? Avec le PC via la liaison série ?

Une solution simple : il te faut 2 programmes (2 sketches)

Le 1er contient le mot de passe que tu veux installer, son rôle est juste d'écrire ce mot de passe dans l'EEPROM de la carte (c'est une mémoire qui résiste aux coupures de courant). Ce programme ne fait rien d'autre.

le 2nd programme, c'est le tien. Il lit le mot de passe valable dans la mémoire EEPROM. Quand l'utilisateur tape sont mot, il le compare au mot de passe, etc...

Quand tu veux changer le mot de passe, tu charges ton 1er prog. dans l'IDE Arduino, tu modifies le mot de passe, tu sauves et tu téléverses le prog sur la carte. Il écrit le nouveau mot de passe en EEPROM.
Tu lui laisses quelque secondes, puis tu téléverses maintenant ton programme applicatif. Il lit le mot de passe en EEPROM, et il est prêt à fonctionner.

Une solution simple : il te faut 2 programmes (2 sketches)

Encore plus simple est faire la même chose en 1 seul programme pour que le changement de mdp soit opérable par l'utilisateur sans recours du développeur.
Mais d'abord il faut que bouyou répond à la question de lesept.

Mais d'abord il faut que bouyou répond à la question de lesept.

Absolument.

On peut imaginer beaucoup de solutions :

  • clé secrète pour entrer dans un mode saisie du nouveau mot de passe à l'aide du keypad
  • changement de mot de passe par la ligne série
  • roues codeuses
  • chargement du mot de passe à partir d'une carte SD
  • ethernet
  • WIFI
  • n'allons pas trop loin :confused:
  • etc.

Bonjour
J'aimerais définir le mot de passe avec le Keypad

Comment ton code peut-il savoir que tu définis le mot de passe ? Tu mets un préfixe d'abord, par exemple # puis le nouveau mot de passe ?

Pense aussi à confirmer le nouveau mot de passe, comme ça se fait en informatique, pour éviter les fautes de frappe

Oui pour définir le mot de passe, je réserverais une touche du keypad pour faire créer son mot de passe, mais c’est justement ça que je ne sais pas faire.

j'ai un petit tuto sur le sujet pour gérer un flux asynchrone genre Série ou keypad, si ça vous tente...

ensuite c'est du stockage EEPROM tout simple avec put et get (éventuellement avec un mot magique pour voir si l'EEPROM a été initialisée)

Le keypad est géré par interruptions :

void setup() {
 ...
  keypad.addEventListener(keypadEvent);
}

void loop() {
  int singal = digitalRead(A3);
  keypad.getKey();
}

Il faut regarder le contenu de la bibliothèque password.h et utiliser les fonctions pour faire ça.

Dans ton code, la lecture du keypad et la formation du password se font dans cette fonction:

void keypadEvent(KeypadEvent eKey) {
  switch (keypad.getState()) {
    case PRESSED:
      Serial.println(eKey);
      switch (eKey) {
        case '*': checkPassword(); break;
        case '#': pwd.reset(); break;
        default: pwd.append(eKey);
      }
  }
}

En gros, elle est appelée à chaque appui d'une touche et :

  • si c'est *: fin du password, on vérifie s'il est bon
  • si c'est #: on recommence
  • si c'est une autre touche, elle est ajoutée au password.
    Je ne connais pas ton keypad, s'il reste une touche inutilisée, genre '+', tu peux ajouter un case qui met le programme en mode 'nouveau password', par exemple avec un booléen. Ensuite, lors de la vérification du pass, si le booléen est 'false' il vérifie normalement, s'il est 'true', il modifie le password avec la valeur entrée au clavier (méthode set de la bibli : pwd.set(...); )

Bon, là ça coince car la bibli ne prend que des valeurs char* et ton code ne connait pas le password car il est créé directement par la bibliothèque (méthode append), donc il faut que tu crées une variable qui va stocker le pass lorsque ton booléen est 'true'... C'est un peu plus lourd que prévu, mais c'est faisable...

j’ai repris mon exemple de gestion EEPROM ainsi que mon exemple de gestion de keypad et je les ai fusionnés en rajoutant un petit menu admin.

c’est la librairie KeyPad arduino standard.

Voilà ce que ça donne (pas bcp testé) → mis en projets finis