keypad et addition de variable

Bonjour,

Je souhaite récupérer dans une variable un nombre saisi avec un keypad.
Pas de problème avec le fonctionnement du clavier, j'utilise la librairie keypad.h
Mais je sais pas comment récupérer dans une variable l'ensemble des touches saisies.
J'essaie avec un tableau mais comment rassembler les nombre du tableau dans une variable ?

void loop(){
byte Clavier[4];
int compteur = 0;
int valeur; 

  char key = keypad.getKey(); // Lecture de la touche actionnée

  if (key != NO_KEY){
    // Si une touche est actionnée, envoi sur le port série 
    
    Serial.println(key);
    Clavier[compteur]= key;
    compteur++;
  valeur = (Clavier[0]&&Clavier[1]&&Clavier[2]&&Clavier[3]);
    Serial.println(valeur);
  }

}

Je fais un tableau : Clavier[4]; et un compteur pour l'index.
A chaque saisie j'ajoute la valeur dans le tableau, l'index ajoute 1.

Puis comment récupérer la saisie ?
exemple : touche1 ->1 touche 2 ->2 touche3 ->3
valeur = 123

Salut,

Outch le massacre xD

Déjà si tu déclares ton tableau en local, il est effacé à chaque itération de loop(), il faut soit le déclaré en globale, soit le mettre en static. Pareil pour compteur.

Ensuite ton opération pour valeur n'est pas bonne. Il faut soit stocker ton tableau en char tout simplement.

void loop(){

static char Clavier[4];

static int compteur = 0;

  char key = keypad.getKey(); // Lecture de la touche actionnée

  if (key != NO_KEY){
    // Si une touche est actionnée, envoi sur le port série 
    
    Serial.println(key);

    Clavier[compteur++]= key;

    if(compteur>=3) {
    compteur=0;
    
    Serial.println(valeur);
    Serial.print("Somme = ");
    Serial.println(Clavier[0] + Clavier[1] + Clavier[2]);
}
  }

}

Bonjour B@tto,

Merci pour le coup de pouce mais ça me retourne une somme en ascii par exemple :

Une pression sur les touches 1, 2 et 3 me donne la somme de 150.
Ce qui m'intéresse c'est une variable avec 123 ? Donc, juste reprendre la saisie du clavier.

Oups en effet :

Serial.println(Clavier[0]-'0' + Clavier[1]-'0' + Clavier[2]-'0');

Et erreur sur

Serial.println(valeur);

à remplacer par

Serial.println(Clavier);

Et rajouter un

Clavier[4]='\0';

Après le if (compteur>=3)

Ca me retourne toujours une somme --> appuie 3 x sur la touche 5
réponse dans le moniteur série "somme = 15"
Ce qu'il me faut c'est : nombre saisi par le clavier = 555

Je te l'ai dit : Serial.println(Clavier);

  if (key != NO_KEY){
    // Si une touche est actionnée, envoi sur le port série 
    
    Serial.println(key);

    Clavier[compteur++]= key;
    Clavier[compteur]= '\0';    // termine la chaîne de caractères
    int toto = atoi(Clavier);     / conversion en int

Si la valeur saisie est un flottant remplacer atoi() par atof()

Bonjour B@tto et fdufneuxs,

Pour B@tto :

Je te l’ai dit : Serial.println(Clavier);

ça me retourne une erreur, Clavier c’est une variable tableau ?

J’ai refait le code sans cette ligne et ça ne génère pas d’erreur mais fait toujours une fonction de calculatrice ???

appuie 3 x sur la touche 5
réponse dans le moniteur série “somme = 15”
Ce qu’il me faut c’est : nombre saisi par le clavier = 555

#include <Keypad.h>
byte Clavier[4];
int compteur = 0;
int valeur; 

const byte ROWS = 4; // Définition du nombre de lignes 
const byte COLS = 3; // Définition du nombre de colonnes
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {12, 11, 10, 9}; // Définition des ports où sont raccordées les lignes 
byte colPins[COLS] = {8, 7, 6}; // Définition des ports où sont raccordées les colonnes



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

void setup(){
  Serial.begin(9600); // Initialisation du port série à 95600 bits/seconde
}
void loop(){

  char key = keypad.getKey(); // Lecture de la touche actionnée

  if (key != NO_KEY){
    // Si une touche est actionnée, envoi sur le port série 
    
  //  Serial.println(key);
 
    Clavier[compteur++]= key;

    if(compteur>=3) {
      Clavier[4]='\0';
      compteur=0;
    
   // Serial.println(valeur);
    //Serial.println(Clavier);
    Serial.print("Somme = ");
    valeur = (Clavier[0]-'0' + Clavier[1]-'0' + Clavier[2]-'0');
    Serial.println(valeur);
}
  }

}

Pour fdufneuxs,

A la ligne

 int toto = atoi(Clavier);     / conversion en int

J’ai une erreur : invalid conversion from’byte* to’const char*’

dapres ce que je comprend ta valeur renvoyer par le key pad et un byte Char , il faut que tu recupere un char et que tu le place comme tu l'a fait dans un tableau de char le quel sera reconvertie en int par la fonction atoi()

dans l'idée

char clavier[5];
clavier[compteur]=key;
compteur++;
......
.......
.......
///a la fin de reception 
clavier[compteur]='/0';// on ajoute le caractere de fin de chaine
valeur =atoi(clavier);// on convertie le tableau de char ex {1,2,3,...,/0} en 123

lapenduledargent:
Bonjour B@tto et fdufneuxs,

Pour B@tto :

ça me retourne une erreur, Clavier c’est une variable tableau ?

J’ai refait le code sans cette ligne et ça ne génère pas d’erreur mais fait toujours une fonction de calculatrice ???

#include <Keypad.h>

byte Clavier[4];
int compteur = 0;
int valeur;

const byte ROWS = 4; // Définition du nombre de lignes
const byte COLS = 3; // Définition du nombre de colonnes
char keys[ROWS][COLS] = {
  {‘1’,‘2’,‘3’},
  {‘4’,‘5’,‘6’},
  {‘7’,‘8’,‘9’},
  {’*’,‘0’,’#’}
};
byte rowPins[ROWS] = {12, 11, 10, 9}; // Définition des ports où sont raccordées les lignes
byte colPins[COLS] = {8, 7, 6}; // Définition des ports où sont raccordées les colonnes

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

void setup(){
  Serial.begin(9600); // Initialisation du port série à 95600 bits/seconde
}
void loop(){

char key = keypad.getKey(); // Lecture de la touche actionnée

if (key != NO_KEY){
    // Si une touche est actionnée, envoi sur le port série
   
  //  Serial.println(key);

Clavier[compteur++]= key;

if(compteur>=3) {
      Clavier[4]=’\0’;
      compteur=0;
   
  // Serial.println(valeur);
    //Serial.println(Clavier);
    Serial.print("Somme = ");
    valeur = (Clavier[0]-‘0’ + Clavier[1]-‘0’ + Clavier[2]-‘0’);
    Serial.println(valeur);
}
  }

}






Pour fdufneuxs,

A la ligne



int toto = atoi(Clavier);    / conversion en int





J'ai une erreur : invalid conversion from'byte* to'const char*'

Et pour cause, tu as déclarer Clavier en byte …

Bonsoir,

Alors maintenant ça fonctionne :slight_smile: Merci à tous !

Je vais pouvoir continuer avec mes essais de communication entre arduino.

Si ça peut aider quelqu’un et pour avoir cherché longtemps (peut être mal,…) je vous joins le code complet :

#include <Keypad.h>
char Clavier[5];
int compteur = 0;
int valeur; 

const byte ROWS = 4; // Définition du nombre de lignes 
const byte COLS = 3; // Définition du nombre de colonnes
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {12, 11, 10, 9}; // Définition des ports où sont raccordées les lignes 
byte colPins[COLS] = {8, 7, 6}; // Définition des ports où sont raccordées les colonnes

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

void setup(){
  Serial.begin(9600); // Initialisation du port série à 95600 bits/seconde
}
void loop()
{

  char key = keypad.getKey(); // Lecture de la touche actionnée

  if (key != NO_KEY)    // Si une touche est actionnée, envoi sur le port série 
  {
    
      Clavier[compteur++]= key;
      Clavier[compteur]= '\0';    // termine la chaîne de caractères
   
          if (key == '*')
              {
                   valeur= atoi(Clavier);     // conversion en int
                   Serial.println(valeur);
                   compteur = 0;
              }
   
   }


}