Problème dans l'utilisation du return

Bien le bonsoir.

J'ai écrit un code qui est sensé me permettre de commander (carte arduino MEGA) des LED par action sur les boutons d'un clavier matriciel 4x4.

Lorsque je réalise une simulation sous le logiciel PROTEUS, les les ne fonctionnent pas comme je le souhaite.

Lorsque j'appuis sur le bouton '1' du clavier, la 'lampeSalon' s'allume.

Mais lorsque j'appuis sur les autres boutons ( '2', '3', '4', '5' ) du clavier matriciel, aucune des autres LED ne s'allume.
Pourtans elles sont sensées s'allumer.

Svp quelqu'un pourrait-il me dire d'où peut venir ce problème ???

Voici le code :

#include <Key.h>
#include <Keypad.h>


/*-----------------------------déclaration des variables de gestion du clavier-------------------------------*/
    const int ROW_NUM = 4; //four rows
    const int COLUMN_NUM = 4; //four columns
    
    char keys[ROW_NUM][COLUMN_NUM] = {
    
    {'1','2','3', 'A'},
    
    {'4','5','6', 'B'},
    
    {'7','8','9', 'C'},
    
    {'*','0','#', 'D'}
    
    };
        
    byte pin_rows[ROW_NUM] = {34, 36, 38, 40}; //connect to the row pinouts of the keypad{42, 44, 46, 48}{40, 38, 36, 34}
    byte pin_column[COLUMN_NUM] = {42, 44, 46, 48}; //connect to the column pinouts of the keypad{34, 36, 38, 40}{48, 46, 44, 42}
    Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
/*-----------------------------déclaration des variables de gestion du clavier-------------------------------*/


/*--------------------------------------declaration des Pins des lampes--------------------------------------*/
    const int lampeSalon = 22;
    const int lampeChambre = 24;
    const int lampeCuisine = 26;
    const int lampeGarage = 28;
    const int lampeDouche = 30;
/*--------------------------------------declaration des Pins des lampes--------------------------------------*/


/*--------------------------------------------------declaration des des variables pour la gestion de l'éclairage-------------------------*/

//------------variables des switch/case de la fonction éclairage
    int sal = 0 ;
    int cha = 0 ;
    int cui = 0 ;
    int gar = 0 ;
    int dou = 0 ;
//------------variables du switch/case de la fonction 'éclairage()'

//------------variables de gestion des états des lampes
    int state_Salon = 0 ;
    int state_Chambre = 0 ;
    int state_Cuisine = 0 ;
    int state_Garage = 0 ;
    int state_Douche = 0 ;
//------------variables de gestion des états des lampes
/*--------------------------------------------------declaration des des variables pour la gestion de l'éclairage-------------------------*/

/*----------------------------------------Déclaration des fonctions---------------------------------------------*/
    int eclairage (int a, int b, int c, int d, int e ); // fontion de gestion de l'éclairage
   int gestion_clavier(); // fonction de gestion du clavier
/*----------------------------------------Déclaration des fonctions---------------------------------------------*/

void setup() {
    
   Serial.begin(9600);

/*--------------------------------------configuration des Pins en entrée/sortie--------------------------------------*/ 
     pinMode(lampeSalon, OUTPUT);
     pinMode(lampeChambre, OUTPUT);
     pinMode(lampeCuisine, OUTPUT);
     pinMode(lampeGarage, OUTPUT);
     pinMode(lampeDouche, OUTPUT);
/*--------------------------------------configuration des Pins en entrée/sortie--------------------------------------*/


/*-------------------------------------gestion du clavier-------------------------------------*/
    keypad.setDebounceTime(50); // pour régler l'anti-rebon à 50ms
/*-------------------------------------gestion du clavier-------------------------------------*/
 
 }



void loop(){
    
    gestion_clavier();
    eclairage(sal, cha, cui, gar, dou) ;
}



/*----------------------------------fonction de reccupération des touches enfoncées du clavier-------------------------------------*/
int gestion_clavier(){

    char code = keypad.getKey();
    Serial.println(code);
   
         if (code != NO_KEY){ 
  
         switch (code){
          
              case '1' :
               sal = 1 ;
              break;
              
              case '2' :  
               cha = 1 ;
              break;
              
              case '3' :
               cui = 1 ;
              break;
               
              case '4' :
               gar = 1 ;
              break;
              
              case '5' :
               dou = 1 ;
              break;      
        }   
      }

      return sal;
      return cha;
      return cui;
      return gar;
      return dou;
}
      
/*----------------------------------fonction  de reccupération des touches enfoncées du clavier-------------------------------------*/


/*-----------------------------fonction gestion de l'éclairage à partir des requetes obtenues précédemment--------------------*/
int eclairage (int a, int b, int c, int d, int e){

          switch (a){
            
            case 1 :
              digitalWrite(lampeSalon, HIGH);
              state_Salon = 1 ;
              a = 0 ;
            break;

            case 2 :
              digitalWrite(lampeSalon, LOW); 
              state_Salon = 0 ;
              a = 0 ;
            break;  
         }
return state_Salon;

          switch (b){
            
            case 1 :
              digitalWrite(lampeChambre, HIGH);
              state_Chambre = 1 ;
              b = 0 ;
            break;

            case 2 :
              digitalWrite(lampeChambre, LOW);
              state_Chambre = 0 ; 
              b = 0 ;
            break;  
         }
return state_Chambre;
          
          switch (c){
            
            case 1 :
              digitalWrite(lampeCuisine, HIGH);
              state_Cuisine = 1 ; 
              c = 0 ;
            break;

            case 2 :
              digitalWrite(lampeCuisine, LOW);
              state_Cuisine = 0 ; 
              c = 0 ;
            break;  
         } 
return state_Cuisine;

          switch (d){
            
            case 1 :
              digitalWrite(lampeGarage, HIGH);
              state_Garage = 1 ;
              d = 0 ;
            break;

            case 2 :
              digitalWrite(lampeGarage, LOW);
              state_Garage = 0 ; 
              d = 0 ;
            break;  
         } 
return state_Garage;

          switch (e){
            
            case 1 :
              digitalWrite(lampeDouche, HIGH);
              state_Douche = 1 ;
              e = 0 ;
            break;

            case 2 :
              digitalWrite(lampeDouche, LOW);
              state_Douche = 0 ;
              e = 0 ;
            break;  
         }    
return state_Douche;

}
/*-----------------fonction gestion de l'éclairage à partir des requetes obtenues précédemment--------------------*/

Voici le schéma de câblage :
SCHEMA DE MONTAGE.pdf (188,2 Ko)

On ne peut avoir qu’un seul return en C ou C++ donc la fonction retourne juste sal mais comme ce sont des variables globales elles sont bien modifiées.

Par contre ce return interrompt la fonction et donc vous n’exécutez jamais ce qui suit…

Faut revoir le cours sur les return, ça ne doit pas être clair pour vous… (en gros avec vos variables globales vous n’en avez pas besoin d’ailleurs)

1 Like

Merci, je dois avouer que j'utilisais 'return' sans vraiment comprendre son fonctionnement.

Je constate que c'est le 'return state_Salon' qui empêchait les lampes de briller.

Comme vous me l'avez suggéré, je vais me documenter sur le return.

J'ai supprimer les return et tout marche comme je le souhaite.

Oui comme ce sont des variables globales tout est pris en compte

J'ai modifié le code pour pouvoir allumer les lampes en appuyant 2 boutons du clavier ( l'un après l'autre ).

En gros lorsque j'appuis le bouton '*', le système est sensé attendre que j'appuis un second bouton ( compris entre '1' et '5' ) pour allumer la lampe correspondante.

Mais lorsque j'appuis le bouton '*' et après j'appuis sur un autre ( '1' par exemple) , rien ne se produit, la lampe ne s'allume pas.

Voici le code modifié :

#include <Key.h>
#include <Keypad.h>


/*-----------------------------déclaration des variables de gestion du clavier-------------------------------*/
    const int ROW_NUM = 4; //four rows
    const int COLUMN_NUM = 4; //four columns
    
    char keys[ROW_NUM][COLUMN_NUM] = {
    
    {'1','2','3', 'A'},
    
    {'4','5','6', 'B'},
    
    {'7','8','9', 'C'},
    
    {'*','0','#', 'D'}
    
    };
        
    byte pin_rows[ROW_NUM] = {34, 36, 38, 40}; //connect to the row pinouts of the keypad{42, 44, 46, 48}{40, 38, 36, 34}
    byte pin_column[COLUMN_NUM] = {42, 44, 46, 48}; //connect to the column pinouts of the keypad{34, 36, 38, 40}{48, 46, 44, 42}
    Keypad clavier = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
/*-----------------------------déclaration des variables de gestion du clavier-------------------------------*/


/*--------------------------------------declaration des Pins des lampes--------------------------------------*/
    int lampeSalon = 22;
    int lampeChambre = 24;
    int lampeCuisine = 26;
    int lampeGarage = 28;
    int lampeDouche = 30;
/*--------------------------------------declaration des Pins des lampes--------------------------------------*/


/*--------------------------------------------------declaration des des variables pour la gestion de l'éclairage-------------------------*/

//------------variables des switch/case de la fonction éclairage
    int sal = 0 ;
    int cha = 0 ;
    int cui = 0 ;
    int gar = 0 ;
    int dou = 0 ;
//------------variables du switch/case de la fonction 'éclairage()'

//------------variables de gestion des états des lampes
    int state_Salon = 0 ;
    int state_Chambre = 0 ;
    int state_Cuisine = 0 ;
    int state_Garage = 0 ;
    int state_Douche = 0 ;

//------------variables de gestion des états des lampes
/*--------------------------------------------------declaration des des variables pour la gestion de l'éclairage-------------------------*/

/*----------------------------------------Déclaration des fonctions---------------------------------------------*/
    int eclairage (int a, int b, int c, int d, int e ); // fontion de gestion de l'éclairage
   int gestion_clavier(); // fonction de gestion du clavier
/*----------------------------------------Déclaration des fonctions---------------------------------------------*/

void setup() {
    
   Serial.begin(9600);

/*--------------------------------------configuration des Pins en entrée/sortie--------------------------------------*/ 
     pinMode(lampeSalon, OUTPUT);
     pinMode(lampeChambre, OUTPUT);
     pinMode(lampeCuisine, OUTPUT);
     pinMode(lampeGarage, OUTPUT);
     pinMode(lampeDouche, OUTPUT);
/*--------------------------------------configuration des Pins en entrée/sortie--------------------------------------*/


/*-------------------------------------gestion du clavier-------------------------------------*/
    //keypad.setDebounceTime(50); // pour régler l'anti-rebon à 50ms
/*-------------------------------------gestion du clavier-------------------------------------*/
 
 }



void loop(){
    
    gestion_clavier();
    eclairage(sal, cha, cui, gar, dou) ;
}



/*----------------------------------fonction de reccupération des touches enfoncées du clavier-------------------------------------*/
int gestion_clavier(){

    char code = clavier.getKey();
    Serial.println(code);
    
  if (code != NO_KEY){ 
    
        if (code == '*'){
          
              switch (code){
                  
                      case '1' :
                       sal = 1 ;
                      break;
                      
                      case '2' :  
                       cha = 1 ;
                      break;
                      
                      case '3' :
                       cui = 1 ;
                      break;
                       
                      case '4' :
                       gar = 1 ;
                      break;
                      
                      case '5' :
                       dou = 1 ;
                      break;      
                  }
                }
              }
            } 
      
/*----------------------------------fonction  de reccupération des touches enfoncées du clavier-------------------------------------*/


/*-----------------------------fonction gestion de l'éclairage à partir des requetes obtenues précédemment--------------------*/
int eclairage (int a, int b, int c, int d, int e){

          switch (a){
            
            case 1 :
              digitalWrite(lampeSalon, HIGH);
              state_Salon = 1 ;
              a = 0 ;
            break;

            case 2 :
              digitalWrite(lampeSalon, LOW); 
              state_Salon = 0 ;
              a = 0 ;
            break; 

         }


          switch (b){
            
            case 1 :
              digitalWrite(lampeChambre, HIGH);
              state_Chambre = 1 ;
              b = 0 ;
            break;

            case 2 :
              digitalWrite(lampeChambre, LOW);
              state_Chambre = 0 ; 
              b = 0 ;
            break;

         }

          
          switch (c){
            
            case 1 :
              digitalWrite(lampeCuisine, HIGH);
              state_Cuisine = 1 ; 
              c = 0 ;
            break;

            case 2 :
              digitalWrite(lampeCuisine, LOW);
              state_Cuisine = 0 ; 
              c = 0 ;
            break; 

         } 


          switch (d){
            
            case 1 :
              digitalWrite(lampeGarage, HIGH);
              state_Garage = 1 ;
              d = 0 ;
            break;

            case 2 :
              digitalWrite(lampeGarage, LOW);
              state_Garage = 0 ; 
              d = 0 ;
            break;  

         } 


          switch (e){
            
            case 1 :
              digitalWrite(lampeDouche, HIGH);
              state_Douche = 1 ;
              e = 0 ;
            break;

            case 2 :
              digitalWrite(lampeDouche, LOW);
              state_Douche = 0 ;
              e = 0 ;
            break;  

         }    

}
/*-----------------fonction gestion de l'éclairage à partir des requetes obtenues précédemment--------------------*/

J'ai juste insérer une boucle 'if' dans la fonction gestion_clavier()

C’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

J'ai lu votre tutoriel ( les trois premiers exercices ) mais là encore je n'ai pas tout compris.

Je n'ai pas pu faire une analogie car votre tutoriel parle de bouton poussoir tandis que moi j'utilise un clavier matriciel.

Je me dis que la réception des actions d'un bouton poussoir n'est pas la même que la réception des actions d'un clavier matriciel.

Alors je ne parviens pas à adapter mon code à votre tutoriel.

Votre tutoriel est très intéressant, il va beaucoup m'aider dans la rédaction du code de mes projets.

Le bouton c’est pour l’exemple de la machine à état. Tout ce qui génère un événement est envisageable. Il suffit de tester l’appui attendu

Si vous voulez écouter le port série ou gérer un flux asynchrone genre keypad vous pouvez jeter un oeil à mon petit tuto sur le sujet

Le soucis avec ton code, c'est que tu ne maîtrise pas la base de la programmation ou que tu ne porte pas assez attention à ce que tu demande à travers ton code .
Dans ta fonction gestion_clavier, tu récupère le code de la touche qui a été pressée dans la variable code, grâce à la fonction clavier.getKey().
Avec le if tu test si c'est la touche *.
Si c'est le cas, tu test cette même touche est un chiffre.
C'est à dire que la variable code contient toujours la valeur initiale.

Il faut donc faire deux choses, récupérer le nouveau code de la touche pressé, toujours avec la fonction clavier.getKey(), mais aussi attente ou laisser le temps à l'utilisateur de lever son doigt et d'appuyer sur une autre touche.

Pour bien faire, il faudrait au moins gérer des variables d'état, qui t'indique ce que tu attends, une *, puis une chiffre.

1 Like

Merci pour votre apport, j'ai pu écrire un code qui marche plutôt bien.

En créant des variables pour m'informer lorsqu'il ya appuis sur une touche.

J'ai loupé votre message car je n'avais pas vu la notification.

Merci encore.

Voici le nouveau code :

#include <Key.h>
#include <Keypad.h>


/*-----------------------------déclaration des variables de gestion du clavier-------------------------------*/
    const int ROW_NUM = 4; //four rows
    const int COLUMN_NUM = 4; //four columns
    
    char keys[ROW_NUM][COLUMN_NUM] = {
    
    {'1','2','3', 'A'},
    
    {'4','5','6', 'B'},
    
    {'7','8','9', 'C'},
    
    {'*','0','#', 'D'}
    
    };
        
    byte pin_rows[ROW_NUM] = {34, 36, 38, 40}; //connect to the row pinouts of the keypad{42, 44, 46, 48}{40, 38, 36, 34}
    byte pin_column[COLUMN_NUM] = {42, 44, 46, 48}; //connect to the column pinouts of the keypad{34, 36, 38, 40}{48, 46, 44, 42}
    Keypad clavier = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
/*-----------------------------déclaration des variables de gestion du clavier-------------------------------*/


/*--------------------------------------declaration des Pins des lampes--------------------------------------*/
    int lampeSalon = 22;
    int lampeChambre = 24;
    int lampeCuisine = 26;
    int lampeGarage = 28;
    int lampeDouche = 30;
/*--------------------------------------declaration des Pins des lampes--------------------------------------*/


/*--------------------------------------------------declaration des des variables pour la gestion de l'éclairage-------------------------*/

//------------variables des switch/case de la fonction éclairage
    int sal = 0 ;
    int cha = 0 ;
    int cui = 0 ;
    int gar = 0 ;
    int dou = 0 ;
//------------variables du switch/case de la fonction 'éclairage()'

//------------variables de gestion des états des lampes
    int state_Salon = 0 ;
    int state_Chambre = 0 ;
    int state_Cuisine = 0 ;
    int state_Garage = 0 ;
    int state_Douche = 0 ;  
//------------variables de gestion des états des lampes

//------------variables de gestion du clavier
    bool etat_button_etoile = false;
    bool etat_button_dieze = false;
 //------------variables de gestion du clavier
/*--------------------------------------------------declaration des des variables pour la gestion de l'éclairage-------------------------*/

/*----------------------------------------Déclaration des fonctions---------------------------------------------*/
    int eclairage (int a, int b, int c, int d, int e ); // fontion de gestion de l'éclairage
   int gestion_clavier(); // fonction de gestion du clavier
/*----------------------------------------Déclaration des fonctions---------------------------------------------*/

void setup() {
    
   Serial.begin(9600);

/*--------------------------------------configuration des Pins en entrée/sortie--------------------------------------*/ 
     pinMode(lampeSalon, OUTPUT);
     pinMode(lampeChambre, OUTPUT);
     pinMode(lampeCuisine, OUTPUT);
     pinMode(lampeGarage, OUTPUT);
     pinMode(lampeDouche, OUTPUT);
/*--------------------------------------configuration des Pins en entrée/sortie--------------------------------------*/


/*-------------------------------------gestion du clavier-------------------------------------*/
    //keypad.setDebounceTime(50); // pour régler l'anti-rebon à 50ms
/*-------------------------------------gestion du clavier-------------------------------------*/
 
 }



void loop(){
    
    gestion_clavier();
    eclairage(sal, cha, cui, gar, dou) ;
}



/*----------------------------------fonction de reccupération des touches enfoncées du clavier-------------------------------------*/
int gestion_clavier(){

    char code = clavier.getKey();
    Serial.println(code);
     Serial.print("etoile : ");
      Serial.println(etat_button_etoile);
      Serial.print("dieze : ");
      Serial.println(etat_button_dieze);
 if (code != NO_KEY){ 
    if (code == '*'){ 
      etat_button_dieze = false;
      etat_button_etoile = true; 
      }
    else if (code == '#'){ 
      etat_button_etoile = false;
      etat_button_dieze = true; 
      }

  else if (etat_button_etoile == true){

             switch (code){
          
              case '1' :
               sal = 1 ;
              break;
              
              case '2' :  
               cha = 1 ;
              break;
              
              case '3' :
               cui = 1 ;
              break;
               
              case '4' :
               gar = 1 ;
              break;
              
              case '5' :
               dou = 1 ;
              break;             
        }
    etat_button_etoile = false ;
  }

   else if (etat_button_dieze == true){

             switch (code){
          
              case '1' :
               sal = 2 ;
              break;
              
              case '2' :  
               cha = 2 ;
              break;
              
              case '3' :
               cui = 2 ;
              break;
               
              case '4' :
               gar = 2 ;
              break;
              
              case '5' :
               dou = 2 ;
              break;            
        }
    etat_button_dieze = false ;
  }
           
         }
        }
      
/*----------------------------------fonction  de reccupération des touches enfoncées du clavier-------------------------------------*/


/*-----------------------------fonction gestion de l'éclairage à partir des requetes obtenues précédemment--------------------*/
int eclairage (int a, int b, int c, int d, int e){

          switch (a){
            
            case 1 :
              digitalWrite(lampeSalon, HIGH);
              state_Salon = 1 ;
              a = 0 ;
            break;

            case 2 :
              digitalWrite(lampeSalon, LOW); 
              state_Salon = 0 ;
              a = 0 ;
            break; 

         }


          switch (b){
            
            case 1 :
              digitalWrite(lampeChambre, HIGH);
              state_Chambre = 1 ;
              b = 0 ;
            break;

            case 2 :
              digitalWrite(lampeChambre, LOW);
              state_Chambre = 0 ; 
              b = 0 ;
            break;

         }

          
          switch (c){
            
            case 1 :
              digitalWrite(lampeCuisine, HIGH);
              state_Cuisine = 1 ; 
              c = 0 ;
            break;

            case 2 :
              digitalWrite(lampeCuisine, LOW);
              state_Cuisine = 0 ; 
              c = 0 ;
            break; 

         } 


          switch (d){
            
            case 1 :
              digitalWrite(lampeGarage, HIGH);
              state_Garage = 1 ;
              d = 0 ;
            break;

            case 2 :
              digitalWrite(lampeGarage, LOW);
              state_Garage = 0 ; 
              d = 0 ;
            break;  

         } 


          switch (e){
            
            case 1 :
              digitalWrite(lampeDouche, HIGH);
              state_Douche = 1 ;
              e = 0 ;
            break;

            case 2 :
              digitalWrite(lampeDouche, LOW);
              state_Douche = 0 ;
              e = 0 ;
            break;  

         }    
}
/*-----------------fonction gestion de l'éclairage à partir des requetes obtenues précédemment--------------------*/

Je l'ai déjà écrit qque part : il ne sert à rien de remettre a ou b ou c ... à zéro dans la fonction éclairage(). En C/C++ les paramètres sont passés par valeur, c-à-d que la fonction reçoit des copies des variables passées lors de l'appel (ici c'est sal, cha...).
En conséquence les variables sal, cha... ne sont jamais remises à zéro. Ce qui aura des effets indésirables.

J'ai aussi déjà écrit que c'est un non-sens de passer les variables globales en paramètres à une fonction. Ces variables sont visibles partout, la fonction éclairage() peut travailler directement sur sal, cha... et dans ce cas ne prend plus d'arguments. Et comme ça, leur remise à zéro dans la fonction ... fonctionne.

1 Like

J'ai lu, sans comprendre ce que vous vouliez dire, votre précédent message sous un autre post mais à présent je comprends car vous êtes un peu plus explicite.

Là je commence à comprendre comment ça fonctionne.
Je vais encore peaufiner mon code.

En passant, svp avez-vous un document sur les bases de la programmation en C/C++ à me proposer ?

Merci vraiment pour votre aide, vous êtes géniaux dans ce forum.

OpenClassroom a un cours correct sur le C et le C++

Merci, je fais un tour sur Openclassroom

sinon pourquoi vous séparez les appuis des touches de la commande ? ça vous fait répéter en boucle les commandes même si vous n'avez pas d'appui sur le clavier.

autant faire un truc du genre

#include <Keypad.h>

const int ROW_NUM = 4;
const int COLUMN_NUM = 4;

char keys[ROW_NUM][COLUMN_NUM] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte pin_rows[ROW_NUM] = {34, 36, 38, 40};
byte pin_column[COLUMN_NUM] = {42, 44, 46, 48};
Keypad clavier = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );

/*--------------------------------------declaration des Pins des lampes--------------------------------------*/
const byte lampeSalon   = 22;
const byte lampeChambre = 24;
const byte lampeCuisine = 26;
const byte lampeGarage  = 28;
const byte lampeDouche  = 30;

enum {inconnu, etoile, diese} mode = inconnu;

void gestion_clavier() {
  switch (clavier.getKey()) {
    case '*': mode = etoile; break;
    case '#': mode = diese;  break;
    case '1': digitalWrite(lampeSalon,   (mode == etoile) ? HIGH : LOW); break; // en mode inconnu on laisse éteint
    case '2': digitalWrite(lampeChambre, (mode == etoile) ? HIGH : LOW); break;
    case '3': digitalWrite(lampeCuisine, (mode == etoile) ? HIGH : LOW); break;
    case '4': digitalWrite(lampeGarage,  (mode == etoile) ? HIGH : LOW); break;
    case '5': digitalWrite(lampeDouche,  (mode == etoile) ? HIGH : LOW); break;
    default:  break;
  }
}

void setup() {
  pinMode(lampeSalon,   OUTPUT);
  pinMode(lampeChambre, OUTPUT);
  pinMode(lampeCuisine, OUTPUT);
  pinMode(lampeGarage,  OUTPUT);
  pinMode(lampeDouche,  OUTPUT);
  Serial.begin(115200); Serial.println();
}

void loop() {
  gestion_clavier();
}

il n'y a pas non plus besoin de mémoriser l'état (vous pouvez le lire en lisant l'état de la pin)
(tapé ici, non testé)

Je suis entrain de travailler sur un projet de maison intelligente. En plus du clavier, les lampes seront commandées par une page web ( hébergée su un ESP32) qui contient des boutons pour commander les lampes , c'est la raison pour laquelle j'ai séparé les appuis des touches de la commande.

Je constate que j'ai encore tellement de choses à apprendre sur la programmation en C/C++.

OK dans ce cas c'est bien d'avoir des fonctions dédiées au lieu de répéter du code. Sans parler de tableau et de struct (ce qui simplifierait énormément le code) vous pourriez faire

#include <Keypad.h>

const int ROW_NUM = 4;
const int COLUMN_NUM = 4;

char keys[ROW_NUM][COLUMN_NUM] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte pin_rows[ROW_NUM] = {34, 36, 38, 40};
byte pin_column[COLUMN_NUM] = {42, 44, 46, 48};
Keypad clavier = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );

/*--------------------------------------declaration des Pins des lampes--------------------------------------*/
const byte lampeSalon   = 22;
const byte lampeChambre = 24;
const byte lampeCuisine = 26;
const byte lampeGarage  = 28;
const byte lampeDouche  = 30;

enum {allumage, extinction} mode = extinction;

void allumerSalon()  {digitalWrite(lampeSalon, HIGH);}
void eteindreSalon() {digitalWrite(lampeSalon, LOW);}

void allumerChambre()  {digitalWrite(lampeChambre, HIGH);}
void eteindreChambre() {digitalWrite(lampeChambre, LOW);}

void allumerCuisine()  {digitalWrite(lampeCuisine, HIGH);}
void eteindreCuisine() {digitalWrite(lampeCuisine, LOW);}

void allumerGarage()  {digitalWrite(lampeGarage, HIGH);}
void eteindreGarage() {digitalWrite(lampeGarage, LOW);}

void allumerDouche()  {digitalWrite(lampeDouche, HIGH);}
void eteindreDouche() {digitalWrite(lampeDouche, LOW);}

void gestion_clavier() {
  switch (clavier.getKey()) {
    case '*': mode = allumage; break;
    case '#': mode = extinction;  break;
    case '1': if (mode == allumage) allumerSalon();   else eteindreSalon();   break; 
    case '2': if (mode == allumage) allumerChambre(); else eteindreChambre(); break; 
    case '3': if (mode == allumage) allumerCuisine(); else eteindreCuisine(); break; 
    case '4': if (mode == allumage) allumerGarage();  else eteindreGarage();  break; 
    case '5': if (mode == allumage) allumerDouche();  else eteindreDouche();  break; 
    default:  break;
  }
}

void setup() {
  pinMode(lampeSalon,   OUTPUT);
  pinMode(lampeChambre, OUTPUT);
  pinMode(lampeCuisine, OUTPUT);
  pinMode(lampeGarage,  OUTPUT);
  pinMode(lampeDouche,  OUTPUT);
  Serial.begin(115200); Serial.println();
}

void loop() {
  gestion_clavier();
}

passez du temps sur la théorie et les possibilités - faire un cours sur le C++, c'est une bonne idée

Waouh, l'idée d'utiliser des fonctions est très bonne, ainsi je pourrais directement appeller ces fonctions lorsque je reçois des commandes venant de la page web.

Au départ en écrivant mon code de cette façon, je pensais rendre mon code digeste, mais avec les différentes propositions que je recois dans ce forum mon code sera encore plus petit et digeste.

Ensuite le mieux serait de créer une structure dans laquelle vous regroupereriez la pin de la lampe, la commande associée, son nom / pièce éventuellement son état puis de faire des fonctions dans la structure (une classe)

Vous instanciez ces éléments, vous les mettez dans un tableau et la boucle distribue les commandes reçues aux instances qui décident si elles ont quelque chose à faire.

Ça permettrait en gérant le temps par exemple de dire « allumer le jardin pour 10 minutes »

Les structures et classes c'est encore nouveau ( ou plutôt leurs applications ) pour moi.

C'est d'ailleur pour ça ( vous l'aurez sans doute remarqué ) que je programme au plus bas niveau car celà me permet de mieux comprendre ce que je fait.

Je constate que apprendre la programmation directement sur arduino ce n'est pas la plus belle des manière d'apprendre à programmer.

Svp avez-vous un lien (sujets de ce forum) qui parle des structures et classes ?