keypad et addition de variable (float)

Bonjour,

Je souhaite récupérer dans une variable un nombre à 3 chiffres après la virgule (et 3 avant aussi) saisi avec un keypad : de la forme de fréquences radio: 117.975 par exemple.

Pas de problème avec le fonctionnement du clavier, j’utilise la librairie keypad.h

Mais je ne sais pas comment:

  • mettre dans mon programme que la touche “#” correspondra en réalité à “.” (la virgule du nombre),
  • utiliser un nombre à virgule avec le keypad, çad que j’obtient ce message d’erreur (avec tinkercad):
In function 'void loop()':
33:25: error: invalid types 'char [5][float]' for array subscript
34:23: error: invalid types 'char [5][float]' for array subscript

Voici mon programme :

#include <Keypad.h>

char Clavier[5];
float compteur = 0;
float valeur; 

const byte ROWS = 4; //4 lignes
const byte COLS = 4; //4 colonnes
char keys[ROWS][COLS] = {
  {'D','C','B','A'},
  {'#','9','6','3'},
  {'0','8','5','2'},
  {'*','7','4','1'}
};
byte rowPins[ROWS] = {0, 1, 2, 3}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 5, 6, 7}; //connect to the column pinouts of the keypad

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

//---------------------------------------VOID---------------------------------------------

void setup(){
  Serial.begin(9600); // Initialisation du port série à 9600 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;
              }   
   }
}

Merci de votre aide pour mes 2 questions (je débute un peu en arduino), alors soyez indulgents :wink:

Change ‘#’ en ‘.’ dans ton tableau :

  {'.', '9', '6', '3'},

et utilise atof :

      valeur = atof(Clavier);    // conversion en int

Tu ne peux pas déclarer un indice de tableau en float :

int compteur = 0;

ça donne ça :

#include <Keypad.h>

char Clavier[5];
int compteur = 0;
float valeur;
const byte ROWS = 4; //4 lignes
const byte COLS = 4; //4 colonnes
char keys[ROWS][COLS] = {
  {'D', 'C', 'B', 'A'},
  {'.', '9', '6', '3'},
  {'0', '8', '5', '2'},
  {'*', '7', '4', '1'}
};
byte rowPins[ROWS] = {9, 8, 2, 3}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 5, 6, 7}; //connect to the column pinouts of the keypad

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

//---------------------------------------VOID---------------------------------------------

void setup() {
  Serial.begin(9600); // Initialisation du port série à 9600 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 chaine de caracteres
    if (key == '*')
    {
      valeur = atof(Clavier);    // conversion en float
      Serial.println(valeur);
      compteur = 0;
    }
  }
}

Teste-le…

lesept:
ça donne ça :

...

char Clavier[5]; // <== ATTENTION SEULEMENT 4 SYMBOLES (plus le ‘\0’)

    Clavier[compteur++] = key;
    Clavier[compteur] = ‘\0’; // termine la chaine de caracteres

Attention au débordement de mémoire… @foufou voulait 7 symboles (6 digits et le point décimal) plus le caractère nul de fin soit 8 entrées nécessaires dans le tableau
Idéalement le code devrait faire un test sur compteur pour s’assurer qu’on ne déborde pas du tableau et décider de ce que l’on fait si on a tapé trop de chiffres ou deux fois un point etc