Faire un Menu 2 Options avec un écran LCD

Ok merci beaucoup, je teste ça et je te dis quoi !

Merci beaucoup!

Grace à toi tout fonctionne comme je veux! Merci!

Je vais installer maintenant les conditions des LEDs, je te tiens au courant!

Juste un question, lorsque je sélectionne le Mode hiver (par exemple) il m'affiche correctement la température, par contre, il ne fais plus de recherche... Que faut t'il ajouter pour qu'il fasse un calcule de température toutes les 30 sec par exemple? J'ai essayé avec un delay mais ça ne fonctionne pas.

Merci de ton aide :wink:

Il faudrait que tu utilises un flag qui indique que tu affiches la température.
Tu le positionnes quand tu appuie sur le bouton sélection et dans ta loop tu mesures et afficha la température sur ce flag est positionné.
Tu remets ce flag à false quand tu affiches le menu.

Du genre :

int valcapt = analogRead(capteur);
    float voltage = valcapt * 5.0 / 1024.0;
    float temperature = (voltage - 0.5) * 100;
delay(5000);
 flag temperature

if (etatBouton2 == HIGH && etatPrecBouton2 == LOW) {

(flag temperature, HIGH)

}

?

Plutôt quelquechose comme ça:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int buttonPin = 8;
const int buttonPin2 = 9;

int capteur = A0;
int note = 330;

void setup() {

 pinMode(buttonPin, INPUT);
 pinMode(buttonPin2, INPUT);
 lcd.begin(16, 2);
 lcd.print("TEST");

}
void loop() {
 static int etatPrecBouton=LOW; // état précédent
 static int etatPrecBouton2=LOW;
 static int noMenuAffiche=-1; // numéro du menu actuellement affiché (-1 on n'est pas dans un menu)
 static int noMenu=0; // numéro du menu
 static bool flagTemp=false; // indique qu'on doit afficher la températeure
 
 int etatBouton=digitalRead(buttonPin);
 int etatBouton2=digitalRead(buttonPin2);
 
 if (etatBouton == HIGH && etatPrecBouton == LOW) {
   // appui sur le bouton menu
   noMenu++;
   noMenu%=2;
   flagTemp=false; // on affiche le menu et non la température
 }
 
 if (noMenu!=noMenuAffiche)
 {
   // affiche le menu
   lcd.clear();
   if (noMenu==0)
     lcd.print('>');
   else
     lcd.print(' ');
   lcd.print("mode ete");

   lcd.setCursor(0,1); // 2eme ligne
   if (noMenu==1)
     lcd.print('>');
   else
     lcd.print(' ');
     lcd.print("mode hiver");
   noMenuAffiche=noMenu;
 }
   

 if (etatBouton2 == HIGH && etatPrecBouton2 == LOW) {
   // selection du menu
   lcd.clear();
   if (noMenu==0)
    lcd.print("mode ete");
   else
     lcd.print("mode hiver");
   flagTemp=true;   // on doit afficher la température
 }
 if (flagTemp)
 {
   int valcapt = analogRead(capteur);
   float voltage = valcapt * 5.0 / 1024.0;
   float temperature = (voltage - 0.5) * 100;
   
   Serial.print( "température : ");
   Serial.print(temperature);
   Serial.println(" C ");

   lcd.setCursor(0,1); // 2eme ligne

   lcd.print("Temp:");
   lcd.print(temperature);
 }
 
 etatPrecBouton=etatBouton;
 etatPrecBouton2=etatBouton2;

 delay(10);
}

Ah ok merci beaucoup :wink:
Jusqu'ici ça fonctionne, je vais essayer le code avec le flag

Salut!

Merci à toi, cela fonctionne! Par contre maintenant quand je ré-appuie sur le bouton menu lorsque j'ai un menu sélectionné, il n revient pas au menu principale comme le code précédent... Sais-tu m'aider?

J'ai regardé plusieurs fois par rapport au précédent code, mais je ne vois pas la différence... Un bug peut-être?

normalement tu devrais retourner au menu en appuyant sur le bouton1
si tu veux aussi retourner au menu en appuyant sur bouton2 il faut tester si on et déjà en mode température lorsqu'on appuie sur bouton2
ce qui donne:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int buttonPin = 8;
const int buttonPin2 = 9;

int capteur = A0;
int note = 330;

void setup() {

  pinMode(buttonPin, INPUT);
  pinMode(buttonPin2, INPUT);
  lcd.begin(16, 2);
  lcd.print("TEST");
}

void loop() {
  static int etatPrecBouton=LOW;  // état précédent
  static int etatPrecBouton2=LOW;
  static int noMenuAffiche=-1;    // numéro du menu actuellement affiché (-1 on n'est pas dans un menu)
  static int noMenu=0;        // numéro du menu
  static bool flagTemp=false;   // indique qu'on doit afficher la températeure
  
  int etatBouton=digitalRead(buttonPin);
  int etatBouton2=digitalRead(buttonPin2);
  
  if (etatBouton == HIGH && etatPrecBouton == LOW) {
    // appui sur le bouton menu
    noMenu++;
    noMenu%=2;
    flagTemp=false;         // on affiche le menu et non la température
  }
  
  if (noMenu!=noMenuAffiche)
  {
    // affiche le menu
    lcd.clear();
    if (noMenu==0)
      lcd.print('>');
    else
      lcd.print(' ');
    lcd.print("mode ete");

    lcd.setCursor(0,1); // 2eme ligne
    if (noMenu==1)
      lcd.print('>');
    else
      lcd.print(' ');
      lcd.print("mode hiver");
    noMenuAffiche=noMenu;
  }

  if (etatBouton2 == HIGH && etatPrecBouton2 == LOW) {
    if (flagTemp==false)
    {
      // selection du menu
      lcd.clear();
      if (noMenu==0)
          lcd.print("mode ete");
      else
        lcd.print("mode hiver");
      flagTemp=true;
    }
    else
    {
      // on retourne au menu
      flagTemp=false;
      noMenuAffiche=-1;
    }
  }
  if (flagTemp)
  {
    int valcapt = analogRead(capteur);
    float voltage = valcapt * 5.0 / 1024.0;
    float temperature = (voltage - 0.5) * 100;
    
    Serial.print( "température : ");
    Serial.print(temperature);
    Serial.println(" C ");

    lcd.setCursor(0,1); // 2eme ligne

    lcd.print("Temp:");
    lcd.print(temperature);
  }
  
  etatPrecBouton=etatBouton;
  etatPrecBouton2=etatBouton2;

  delay(10);
}

Ok merci beaucoup :wink:

Non, j'avais beau appuyer, il ne retournait pas au menu ...

Salut!

Cela ne fonctionne pas :/, et si au lieu de mettre flagtemp==false, on met dans la condition du mode que si on appuis sur le button 1 il repasse au menu?

Ca devrait fonctionner
Le choix du menu et la selection et affichage température fonctionne bien?

Oui parfaitement même

Même les leds s'allument bien ...

Mets ton dernier code

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int buttonPin = 8;
const int buttonPin2 = 9;

int capteur = A0;
int note = 330;

void setup() {

 pinMode(buttonPin, INPUT);
 pinMode(buttonPin2, INPUT);
 lcd.begin(16, 2);
 lcd.print("TEST");
  pinMode(10, OUTPUT);
  pinMode(13, OUTPUT);
}
void loop() {
 static int etatPrecBouton=LOW; // état précédent
 static int etatPrecBouton2=LOW;
 static int noMenuAffiche=-1; // numéro du menu actuellement affiché (-1 on n'est pas dans un menu)
 static int noMenu=0; // numéro du menu
 static bool flagTemp=false; // indique qu'on doit afficher la températeure
 
 int etatBouton=digitalRead(buttonPin);
 int etatBouton2=digitalRead(buttonPin2);
 
 if (etatBouton == HIGH && etatPrecBouton == LOW) {
   // appui sur le bouton menu
   noMenu++;
   noMenu%=2;
   flagTemp=false; // on affiche le menu et non la température
 }
 
 if (noMenu!=noMenuAffiche)
 {
   // affiche le menu
   lcd.clear();
   if (noMenu==0)
     lcd.print('>');
   else
     lcd.print(' ');
   lcd.print("Mode ete");

   lcd.setCursor(0,1); // 2eme ligne
   if (noMenu==1)
     lcd.print('>');
   else
     lcd.print(' ');
     lcd.print("Mode hiver");
   noMenuAffiche=noMenu;
 }
   

 if (etatBouton2 == HIGH && etatPrecBouton2 == LOW) {
   // selection du menu
   lcd.clear();
   if (noMenu==0){
    lcd.print("Mode ete");
    flagTemp=true;
    if( flagTemp > 25){
    digitalWrite(13,HIGH); 
    digitalWrite(10,LOW);
     }
    else{
    digitalWrite(10,HIGH);  
    digitalWrite(13,LOW);
  }
   }
   
   if (noMenu==1){
     
     lcd.print("Mode hiver");
     
   flagTemp=true;   // on doit afficher la température
 if( flagTemp > 17){
    digitalWrite(10,HIGH); 
    digitalWrite(13,LOW);
   
  }
   
  else{
    digitalWrite(13,HIGH); 
    
   digitalWrite(10,LOW);
  }
   }
 }

 if (flagTemp)
 {
   int valcapt = analogRead(capteur);
   float voltage = valcapt * 5.0 / 1024.0;
   float temperature = (voltage - 0.5) * 100;
   
   Serial.print( "température : ");
   Serial.print(temperature);
   Serial.println(" C ");

   lcd.setCursor(0,1); // 2eme ligne

   lcd.print("Temp:");
   lcd.print(temperature);
   delay(5000);
   
  
 }
 
 etatPrecBouton=etatBouton;
 etatPrecBouton2=etatBouton2;

 delay(10);
}

flagTemp ce n'est pas la température, mais un flag qui vaut true ou false don tes comparaisons sont incorrectes
Il faut que tu mettes tés comparaisons après lecture de la température.

Le problème en faisant ça c'est que le programme me dit que "temperature" n'est pas déclaré dans le scop

Il faut mettre les comparaison juste après la lecture température

Alors je mets deux flagtemp? Comme j'ai deux comparaison par mode

flagTemp c'est pour indiquer qu'on est en mode affichage de température. Je ne vois pas pourquoi il y en aurait deux.

Il faut faire le test après la lecture de température

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int buttonPin = 8;
const int buttonPin2 = 9;

int capteur = A0;
int note = 330;

void setup() {

  pinMode(buttonPin, INPUT);
  pinMode(buttonPin2, INPUT);
  lcd.begin(16, 2);
  lcd.print("TEST");
}

void loop() {
  static int etatPrecBouton = LOW; // état précédent
  static int etatPrecBouton2 = LOW;
  static int noMenuAffiche = -1;  // numéro du menu actuellement affiché (-1 on n'est pas dans un menu)
  static int noMenu = 0;      // numéro du menu
  static bool flagTemp = false; // indique qu'on doit afficher la températeure

  int etatBouton = digitalRead(buttonPin);
  int etatBouton2 = digitalRead(buttonPin2);

  if (etatBouton == HIGH && etatPrecBouton == LOW) {
    // appui sur le bouton menu
    noMenu++;
    noMenu %= 2;
    flagTemp = false;       // on affiche le menu et non la température
  }

  if (noMenu != noMenuAffiche)
  {
    // affiche le menu
    lcd.clear();
    if (noMenu == 0)
      lcd.print('>');
    else
      lcd.print(' ');
    lcd.print("mode ete");

    lcd.setCursor(0, 1); // 2eme ligne
    if (noMenu == 1)
      lcd.print('>');
    else
      lcd.print(' ');
    lcd.print("mode hiver");
    noMenuAffiche = noMenu;
  }

  if (etatBouton2 == HIGH && etatPrecBouton2 == LOW) {
    if (flagTemp == false)
    {
      // selection du menu
      lcd.clear();
      if (noMenu == 0)
        lcd.print("mode ete");
      else
        lcd.print("mode hiver");
      flagTemp = true;
    }
    else
    {
      // on retourne au menu
      flagTemp = false;
      noMenuAffiche = -1;
    }
  }

  if (flagTemp)
  {
    int valcapt = analogRead(capteur);
    float voltage = valcapt * 5.0 / 1024.0;
    float temperature = (voltage - 0.5) * 100;

    Serial.print( "température : ");
    Serial.print(temperature);
    Serial.println(" C ");

    lcd.setCursor(0, 1); // 2eme ligne

    lcd.print("Temp:");
    lcd.print(temperature);

    float consigne;
    if (noMenu == 0)
      consigne = 25;
    else
      consigne = 17;
    if (temperature > consigne) {
      digitalWrite(13, HIGH);
      digitalWrite(10, LOW);
    }
    else {
      digitalWrite(10, HIGH);
      digitalWrite(13, LOW);
    }
  }

  etatPrecBouton = etatBouton;
  etatPrecBouton2 = etatBouton2;

  delay(10);
}