Limiter la taille d'un mot de passe avec keypad.getKey()

Bonjour,

Je cherche à limiter la taille d’un passe à quatre chiffres uniquement ni plus ni moins.
Dans mon programme il n’y a pas de mot de passe prédéfini dans un objet string.
A l’heure actuelle mon programme marche bien mais mon mot de passe peut être composé de 1 à une taille indéfinie de chiffre (ce que je ne souhaite pas).

J’ai aussi programmé l’affichage de la saisi du mot de passe en avec des astérisques ****.

Dans mon montage j’ai un LCD, un clavier 3x4 et une led bicolore (rouge quand mot de passe activé et vert quand il n’y a pas de mot de passe dans le programme).

Voici un extrait du programme pour comprendre le principe:

String tempPassword=""

keypressed = keypad.getKey();

if (keypressed == ‘0’ || keypressed == ‘1’ || keypressed == ‘2’ || keypressed == ‘3’ ||
keypressed == ‘4’ || keypressed == ‘5’ || keypressed == ‘6’ || keypressed == ‘7’ ||
keypressed == ‘8’ || keypressed == ‘9’ ){
tempPassword += keypressed;
lcd.setCursor(i+8,3);
lcd.print("*");
i++;

Merci par avance pour votre aide !!

le principe n’est pas super… n’utilisez pas la classe String pour ça!

un petit buffer de caractère et un index de là où vous êtes dans le buffer devrait suffire à votre bonheur…
quand l’index atteint la taille max, vous avez fini l’entrée et vous pouvez tester.

sinon

if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
     keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
      keypressed == '8' || keypressed == '9' ){

peut s’écrire simplement if ((keypressed >= '0') && (keypressed <= '9')) {

J’avais déjà partagé un petit bout de code qui fait de l’accumulation des données tapées dans un buffer de caractères (qui garde jusqu’à 30 caractères tapés dans la version actuelle) et pour lequel vous pouvez définir une chaine de fin de commande. il suffirait de changer cette partie là juste pour tester la longueur de la chaine

l’approche montre aussi comment ne pas être en attente bloquante, la boucle tourne et vous tapez les caractères quand vous voulez (vous verrez si vous ouvrez la console que le code vous dit Hello toutes les secondes mais que si vous utilisez votre keypad il enregistre les données jusqu’à ce que vous ayez tapé

**

que j’ai défini comme endCommandMarker

bref - jetez un oeil (ignorez la partie RTCCommmandMarker c’était pour les besoins d’un autre post)

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns

//define the symbols on the buttons of the keypads
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 34, 36, 38, 40 };
// Connect keypad COL0, COL1, COL2 and COL3 to these Arduino pins.
byte colPins[COLS] = {41, 39, 37, 35};

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

const char endCommandMarker[] = "**";
const char startRTCCommmandMarker[] = "##";

const int maxCommandLength = 30;
char commandBuffer[maxCommandLength + 1];

// this function accumulates the keypad entries into the commandBuffer until the end marker is received
boolean getCommand(const char * endMarker)
{
  boolean commandComplete = false;
  static unsigned int commandIndex = 0;
  char entry = membraneKeypad.getKey();

  if (strlen(endMarker) >= maxCommandLength) {
    Serial.println(F("Your buffer is too small to receive commands with your end marker, increase maxCommandLength"));
  }

  if (entry != NO_KEY) {
    commandBuffer[commandIndex++] = entry;
    commandBuffer[commandIndex] = '\0'; // to maintain a c-string style
    if (commandIndex >= maxCommandLength) commandIndex = maxCommandLength - 1; // don't overflow, will overwrite end of command next time
    if (strlen(commandBuffer) >= strlen(endMarker)) { // check if command is complete
      if (!strcmp(commandBuffer + strlen(commandBuffer) - strlen(endMarker), endMarker)) {
        commandComplete = true;
        commandIndex = 0; // prepare for next time
      }
    }
  }
  return commandComplete;
}

void setup() {
  Serial.begin(115200);
}

void loop() {
  static unsigned long lastChrono = 0;
  const unsigned long actionPeriod = 1000;

  // check first if we have fully received a command
  if (getCommand(endCommandMarker)) {
    if (!strncmp(commandBuffer, startRTCCommmandMarker, strlen(startRTCCommmandMarker))) {
      Serial.print(F("detected RTC command: ["));
      Serial.print(commandBuffer);
      Serial.println(F("]"));

      // *******************************************************************************
      // that's where you would parse the commandBuffer to build the time_t structure
      // and call the set(time_t t); method to assign the new date/time to your RTC
      // *******************************************************************************

    } else {
      Serial.print(F("detected standard command: ["));
      Serial.print(commandBuffer);
      Serial.println(F("]"));

      // *******************************************************************************
      // here you would handle a normal command for your scoreboard
      // *******************************************************************************

    }
  }

  // here you can do other things for example time based activities
  if (millis() - lastChrono >= actionPeriod) {
    lastChrono += actionPeriod;
    Serial.print("Hello @");
    Serial.println(lastChrono);
  }
}