Pb Clavier 4x4-LCD, difference de caracteres entre les 2

Bonjour a tous, je suis débutant et j’apprends en faisant de petits exercices. Je veux faire un simple menu avec un clavier 4 x 4 en matriciel et un LCD 16 x 2. J’utilise la bib. Keypad, j’ai copie un exemple et ça fonctionne. Dans mon programme je ne comprends pas pourquoi sur le LCD j’ai bien le bon caractère et pas sur le moniteur serie qui m’envoie un petit carré ? j’ai essayé de mettre les caractères en décimale c’est pareil ? de plus le clavier n’attend pas, j’ai dû introduire la variable ‘cla’ à chaque passage dans la fonction clavier, ce qui ne me parait pas normal. Ca fait des jours que je recherche et j’essaye sans succès.

J’ai aussi besoin d’un conseil, je n’ai jamais entré une valeur à 3 chiffres, pour moi, si je dois rentrer la valeur 350 je récupe le 5 que je multiplie par 100, que le mets dans ma variable, le 2ème caractère multiplié par 10, que j’ajoute à ma variable et même chose pour l’unité. Est-ce qu’il existe une autre méthode ? excusez mon ignorance je découvre petit à petit le C et c’est pas si simple.

Je vous remercie pour votre aide.

#include <Wire.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
// valeur
uint16_t valeur [] = {500,750}; // valeur par défaut

byte rowPins[ROWS] = {9,8,7,6,}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5,4,3,2}; //connect to the column pinouts of the keypad

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

LiquidCrystal_I2C lcd(0x27,16, 2);  // SET I2C Address
char key;
byte partie =0;
byte cla=0;
byte tval;
char carac;

void setup(){
    Serial.begin(9600);
    lcd.init();
    lcd.backlight();
    lcd.print("salut");
}  
void loop(){
  // on attend l'apuye sur une touche 
clavier(); Serial.println(key);
if (cla=1){
//key='A'; // utilise pour verifier test du switch
switch(key){
case '*':
lcd.clear();lcd.print ("Choix du Programme "); 
lcd.setCursor(0, 01);   lcd.print ("A ou B ");cla=0;
break;
  case'A':
  lcd.clear();
  lcd.setCursor(0, 0); lcd.print("lire valeur");
  lcd.setCursor(0, 1);lcd.print(valeur[0]);cla=0;

  break;
  case 'B':
  lcd.clear(); 
  lcd.setCursor(0, 0); lcd.print("entrée valeur 350");cla=0;
                  // a écrire
  break;
    }
  }
} //fin
//____________________________________________
void clavier() //clavier
{
char key = keypad.getKey();
  if (key)
  {
 //Serial.println(key);
  lcd.print(key);
  cla=1;;
    } 
 return (key);} 

Bonjour,

Est ce que votre moniteur Série est bien configurer en 9600 Bauds ?

Cette ligne ne teste pas si la variable cla vaut 1. Elle met 1 dans cla.
= indique une affectation
== teste l'égalité
Donc pour faire un test il faut écrire
if (cla == 1){


ATTENTION, ici c'est sans importance mais, un 0 devant une constante numérique indique que la valeur est écrite en octal.

Oui, la ligne est bien à 9600.

Bonjour, ce qui est curieux c'est qu'en supprimant la fonction clavier est en mettant l'acquisition du caractere à la place de l'appel de la fonction, ça fonctionne. c'est comme si le char key = keypad.getKey();ne fonctionnait pas dans une fonction.Quelqu'un a surement du le tester?
Merci pour votre aide et réponses, bonne journée

key est une variable locale dans la fonction clavier donc elle n'a pas d'existence hors de cette fonction.
Et d'autre part tu as déclaré une variable key en global à laquelle tu n'affectes aucune valeur.
Ce sont 2 variables distinctes.

À la fin de clavier tu fais

Donc il faut que tu fasses

key = clavier(); Serial.println(key);
if (cla=1){
//key='A'; // utilise pour verifier test du switch
switch(key){

ainsi, la variable global key contiendra la valeur retournée par clavier().

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.