ecran LCD et fonction switch

Bonjour,
Je suis en terminale, et on me demande de créer un distributeur de cartes de jeu automatique. Pour l’instant, j’ai réussi à afficher les messages que je voulais, mais j’aimerais lorsque je suis a “affichage==3”, c’est a dire “tarot?”, appuyer sur un autre bouton (ici boutonn) et afficher “poker”. Ensuite afficher d’autres messages que ceux du tarot, pour le poker.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int buttonnPin =9 ;     
const int ledPin =  13;      
const int buttonPin = 10;  
int buttonState = 0;   
int buttonnState = 0;
void setup() {
   pinMode(ledPin, OUTPUT);      
}
void loop() {
  static int lastState=HIGH;
  static int affichage=0 ;
    buttonState = digitalRead(buttonPin);
  if (buttonState==LOW && lastState==HIGH)
  {
    // on a appuyé sur le bouton
      affichage++;
  }    
  
 lastState=buttonState;


 
 buttonnState = digitalRead(buttonnPin);
  if (buttonnState==LOW && lastState==HIGH)
  {
    // on a appuyé sur le bouton
      affichage++;
  }    
  
 lastState=buttonnState;

 
  
switch(affichage)
{

  case 1 : (affichage==2);
     digitalWrite(ledPin, LOW);
      lcd.setCursor(0, 0);
   lcd.print("mode de jeu ");
     delay(100);
     lcd.clear();
     delay(1);
     break;
     
     case 2 :(affichage==3);
      digitalWrite(ledPin, LOW);
      lcd.setCursor(0, 0);
   lcd.print("tarot ?");
   delay(100);
   lcd.clear();
     delay(1);
     break;

     case 3 : (affichage==4);
      lcd.setCursor(0, 0);
   lcd.print("nombre de joueurs");
   delay(100);
   lcd.clear();
     delay(1);
     break; 
     
     case 4 : (affichage==5);
      lcd.setCursor(0, 0);
   lcd.print("trois joueurs ?");
   delay(100);
   lcd.clear();
     delay(1);
     break; 


case 5 : (affichage==6);
      lcd.setCursor(0, 0);
   lcd.print("quatre joueurs ?");
   delay(100);
   lcd.clear();
     delay(1);
     break; 

     case 6 :(affichage==6);
      lcd.setCursor(0, 0);
   lcd.print("cinq joueurs ?");
   delay(100);
   lcd.clear();
     delay(1);
     break; 


     case 7 :(affichage>=6);
    lcd.begin(16, 2);   
      lcd.setCursor(0, 0);
   lcd.print("impossible 5");
   lcd.setCursor(0,1);
   lcd.print("joueurs au max");
   delay(1000); 
   
    break; 

     
     default :
     lcd.setCursor(0,0);
     lcd.print("erreur");
      delay(100);
     lcd.clear();
     delay(1);
     break;
}
}

Je vous remercie d’avance pour votre réponse, bonne journée

bonjour,
ca ne veut rien dire tes case

  case 1 : (affichage==2);

dans ce cas, affichage vaut 1
idem pour
case 2-3-4- etc....
donc, une petite lecture ou relecture de switch case pour comprendre son fonctionnement

il en est de même pour les variables static int dans le loop qui devraient être déclarées au début.

bonjour,
Je pensais que cela voulait dire que lorsque la variable "affichage" est égale a 2, alors elle affiche "mode de jeu". Ce programme marche quand j'utilise un bouton, mais pas le deuxieme..
Et pour les variables du début que me conseilez vous ?

Bonjour,

Il sert à quoi ton deuxième bouton qui ne fonctionne pas?
Appeler un bouton ‘bouton’ et l’autre ‘boutonn’, ça ne me semble pas propice à une bonne compréhension du programme.

infobarquee:
il en est de même pour les variables static int dans le loop qui devraient être déclarées au début.

Bonjour infobarquee,

Permet moi de ne pas être d'accord avec toi, il n'y a aucune raison que des variables utilisées uniquement dans la fonction soient déclarées en dehors de la fonction. C'est bien plus modulaire. Si tu veux déplacer ta fonction dans un autre fichier ou la réutiliser tu la déplace et elle embarque toutes ses variables locales avec elle.

oui, mais lorsque l'on débute, il est préférable de définir les variables au début.
après, on peut très bien déclarer des variables dans une fonction afin quelle soit embarquée ailleurs.

dans le cas présent, sauf erreur de ma part

static int lastState=HIGH;
  static int affichage=0 ;

les variables seront toujours HIGH et 0 à chaque loop
ce qui va détruire l'instruction qui suit

 lastState=buttonState;

Le mot-clé static est utilisé pour créer des variables qui sont visibles à une seule fonction. Toutefois, contrairement à des variables locales qui obtiennent créés et détruits chaque fois qu'une fonction est appelée,
les variables statiques persistent au-delà de l'appel de fonction, en préservant leurs données entre les appels de fonction.

Les variables déclarées comme statiques ne seront créés et initialisés la première fois qu'une fonction est appelée.

Comme tu le cites toi même les variables statiques ne sont initialisées que la première fois, mais lors des appels suivants leur valeur précédente va persister, donc ça va fonctionner correctement.
C'est exactement le même fonctionnement qu'une variable globale, sauf qu'au lieu d'être déclarée on ne sait ou, elle est déclarée au plus près de son utilisation.

Le fait que comme tu dis, quand on débute, il est préférable de déclarer ses variables au début, ça peut se discuter, mais je ne suis pas pour, autant prendre de bonnes habitudes dès le début et déclarer en global uniquement ce qui a besoin d'être global.

ce que je comprends est que les static int, gardent leur valeur quoiqu'il arrive et ne sont pas changées.
donc, si on met une variable à 0 via static int, sa valeur ne changera pas (en préservant leurs données entre les appels de fonction.)

mais on s'égare un peu du sujet je pense :wink:

Oui, on s'égare un peu :slight_smile: , mais pour être clair comme les variables globales les variables statiques sont initialisées une fois avec la valeur donnée à la déclaration, elles peuvent bien sur être modifiées en leur affectant une valeur et elles gardent cette valeurs entre les différents appels de la fonction.

Il serait plus important de savoir ce que notre ami veut faire avec son bouton et boutonn