Go Down

Topic: keypad et addition de variable (Read 3981 times) previous topic - next topic

lapenduledargent

Nov 03, 2014, 08:52 am Last Edit: Nov 03, 2014, 08:52 am by lapenduledargent
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 ?

Code: [Select]
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

B@tto

#1
Nov 03, 2014, 09:54 am Last Edit: Nov 03, 2014, 09:55 am by B@tto
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.

Code: [Select]
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]);
}
  }

}
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

lapenduledargent

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.

B@tto

#3
Nov 03, 2014, 12:39 pm Last Edit: Nov 03, 2014, 12:42 pm by B@tto
Oups en effet :

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

Et erreur sur

Code: [Select]
Serial.println(valeur);

à remplacer par

Code: [Select]
Serial.println(Clavier);

Et rajouter un

Code: [Select]
Clavier[4]='\0';

Après le if (compteur>=3)

Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

lapenduledargent

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

B@tto

Je te l'ai dit : Serial.println(Clavier);
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

fdufnews

Code: [Select]
  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()

lapenduledargent

Bonjour B@tto et fdufneuxs,

Pour B@tto :

Quote
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 ???

Quote
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
Code: [Select]
#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

Code: [Select]
int toto = atoi(Clavier);     / conversion en int


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

Heloderma-kris

#8
Nov 04, 2014, 09:48 am Last Edit: Nov 04, 2014, 09:54 am by Heloderma-kris
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
Code: [Select]

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

B@tto

#9
Nov 04, 2014, 10:08 am Last Edit: Nov 04, 2014, 10:09 am by B@tto
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 ???

Code: [Select]
#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

Code: [Select]
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 ...
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

lapenduledargent

Bonsoir,

Alors maintenant ça fonctionne  :)  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 :

Code: [Select]
#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;
              }
   
   }


}

Go Up