Arduino Forum

International => Français => Topic started by: Dams501 on Apr 23, 2019, 11:25 pm

Title: besoin d'aide pour un menu,
Post by: Dams501 on Apr 23, 2019, 11:25 pm
bonjour

je suis nouveau et débutant dans l Arduino j'ai crée un menu en suivant un tuto dans le quelle je peux naviguer dans des sous menu. et la je bloque je souhaiterai afficher une variable dans mon menu je vous colle mon code la ou je voudrait que ma variable apparaisse.
je voudrait qu il soit afficher sur mon lcd par exemple

2.1  Tmin....................25

et la je bloc impossible d ajouter ma variable 25


Code: [Select]

NumMenu[21] = (TypeMenu) {
  "2.1 T min"
};



je vous mais mon code complet egalement

Code: [Select]






#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int ventilo = 6;
int sonde = 7;
int relais = 8;
int Tmin = 25;
int Tmax= Tmin + 10;

int unsigned Menu = 0;
int unsigned SousMenu = 0;

double Tempo = millis();
double Tempo2 = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int DOWN = A2;
int LEFT = A3;
int RIGHT = A4;



typedef struct {
 String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
 NumMenu[10] = (TypeMenu) {
   "1. Home "
 };
 NumMenu[20] = (TypeMenu) {
   "2. Temperature"
 };
 NumMenu[21] = (TypeMenu) {
   "2.1 T min"
 };
 NumMenu[22] = (TypeMenu) {
   "2.2 T max"
 };
 NumMenu[30] = (TypeMenu) {
   "3. Humiditer"
 };
 NumMenu[31] = (TypeMenu) {
   "3.1 H min "
 };
 NumMenu[32] = (TypeMenu) {
   "3.2 H max"
 };
 NumMenu[40] = (TypeMenu) {
   "4. Heure"
 };
 NumMenu[41] = (TypeMenu) {
   "4.1 Reglage"
 };
 NumMenu[42] = (TypeMenu) {
   "4.2 Reglage heure"
 };
}



void setup() {
 pinMode(ventilo, OUTPUT);
 pinMode(sonde, OUTPUT);
 pinMode(relais, OUTPUT);

 Serial.begin(9600);
 Initialisation();
 lcd.begin(16, 2);
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("  * TUTORIEL *  ");
 lcd.setCursor(0, 1);
 lcd.print("IHM 3D");
 delay(2000);
 
 pinMode(SELECT, INPUT_PULLUP);
 pinMode(UP, INPUT_PULLUP);
 pinMode(DOWN, INPUT_PULLUP);
 pinMode(LEFT, INPUT_PULLUP);
 pinMode(RIGHT, INPUT_PULLUP);
}



void loop() {
 Regul();
 humi();
 heure();
 bouton();
}


void bouton() {
 if ( millis() > Tempo ) {
   if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
     SousMenu++;
     Tempo = millis() + 250;
     AfficheMenu();
   } else if (digitalRead(DOWN) == LOW) { /* Bouton Down  */
     Menu = Menu - 10;
     Tempo = millis() + 250;
     SousMenu = 0 ;
     AfficheMenu();
   } else if (digitalRead(UP) == LOW) { /* Bouton Up */
     Menu = Menu + 10;
     Tempo = millis() + 250;
     SousMenu = 0;
     AfficheMenu();
   } else if (digitalRead(RIGHT) == LOW) { /* Bouton RIGHT  */
     SousMenu--;
     Tempo = millis() + 250;
     AfficheMenu();
   } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
     Tempo = millis() + 750;
     switch (Menu + SousMenu) {
     case 21 :
         Serial.print("Temp Min");

     case 22 :
         Serial.print("Temp Max");

     case 31 :
         Serial.print("Humid Min");

     case 32 :
         Serial.print("Temp Min");

     case 41 :
         Serial.print("reglage");
        
     case 42 :
         Serial.print("Heure");
        
     }
   }
 }
}

void AfficheMenu() {
 if (Menu == 0 ) {
   Menu = 40;
 }
 if (Menu == 50 ) {
   Menu = 10;
 }
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print(NumMenu[Menu].Menu);
 lcd.setCursor(0, 1);
 if ( SousMenu < 0 ) {
   SousMenu = 0;
 }
 if (NumMenu[Menu + SousMenu].Menu == "") {
   SousMenu = 0;
 }
 if (Menu + SousMenu > Menu) {
   lcd.print(NumMenu[Menu + SousMenu].Menu);
 }
}

void Regul() {
   if (test1 > 0) {
   if ((digitalRead(test1)) == HIGH) {
     Serial.print("action on test1");
   }
   if ((digitalRead(test1)) == LOW) {
     Serial.print("action off test1");
   }
 }
}

void humi() {
   if (test2 > 0) {
   if ((digitalRead(test2)) == HIGH) {
     Serial.print("action on test2");
   }
   if ((digitalRead(test2)) == LOW) {
     Serial.print("action off test2");
   }
 }
}

void heure() {
   if (test3 > 0) {
   if ((digitalRead(test3)) == HIGH) {
     Serial.print("action on test3");
   }
   if ((digitalRead(test3)) == LOW) {
     Serial.print("action off test3");
   }
 }
}
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 23, 2019, 11:37 pm
Tu peux essayer d'afficher un truc comme ça
Code: [Select]
NumMenu[21]+"........." +String(variable)
Où 'variable' contient ta valeur 25
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 12:37 am
Code: [Select]
  NumMenu[21] = (TypeMenu) {
    "Temp Mini " +String(Tmin) + ('\xB0') + "c"
  };


un grand merci pour ton aide j ai régler mon soucie par contre quand j incrémente ma variable de la manière suivant dans le Serial.print elle se met bien a jour met pas dans mon menu y a t il un moyen de remédier a cela ?

Code: [Select]
      case 21 :
          Serial.print("Temp Min");
          if(Tmin <= 30){
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          Serial.print(Tmin);
          break;
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 24, 2019, 07:41 am
Il faut ajouter après ton Serial.print la ligne de mise à jour de ton menu: NumMenu[21] =...
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 09:02 am
encore merci pour ton aide. j'ai teste se que tu ma dit mais j ai pas du tout comprendre ^^ j'ai mis sa
Code: [Select]
     switch (Menu + SousMenu) {
      case 21 :
          if(Tmin <= 29){
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if(Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
          }
          Serial.print("Tmin");
          Serial.println(Tmin);
          NumMenu[21] = (TypeMenu) {
            "Temp Mini " +String(Tmin) + ('\xB0') + "c"
            };
          break;
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 24, 2019, 09:37 am
Oui, c'est bien que ce que je voulais dire : il faut mettre ton menu à jour après avoir calculé la nouvelle valeur de Tmin. Si tu as des problèmes de compilation, ajoute des accolades autour de ton bloc 'case' :
Code: [Select]
    switch (Menu + SousMenu) {
     case 21 :
        {    <-- ici
         if(Tmin <= 29){
 ... blablabla ...
         break;
        }    <-- et là
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 09:48 am
ma compilation se passe bien mais mon menu ne se met pas a jour  :smiley-confuse: jte met mon code complet j'ai surement couiller ailleurs
Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int ventilo = 6;
int sonde = 7;
int relais = 8;
int Tmin = 20;
int Tmax= 25;
int Hmin = 20;
int Hmax = 25;
int heure = 1;
int minute = 1;

int unsigned Menu = 0;
int unsigned SousMenu = 0;

double Tempo = millis();
double Tempo2 = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int DOWN = A2;
int LEFT = A3;
int RIGHT = A4;



typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Home "
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temperature"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Mini " +String(Tmin) + ('\xB0') + "c"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " +String(Tmax) + ('\xB0') + "c"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humiditer"
  };
  NumMenu[31] = (TypeMenu) {
    "3.1 H min "
  };
  NumMenu[32] = (TypeMenu) {
    "3.2 H max"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "4.1 Reglage"
  };
  NumMenu[42] = (TypeMenu) {
    "4.2 Reglage heure"
  };
}



void setup() {
  pinMode(ventilo, OUTPUT);
  pinMode(sonde, OUTPUT);
  pinMode(relais, OUTPUT);

  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  * TUTORIEL *  ");
  lcd.setCursor(0, 1);
  lcd.print(Tmax);
  delay(2000);
 
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(DOWN, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(RIGHT, INPUT_PULLUP);
}



void loop() {
  Regul();
  humi();
  heurefunc();
  bouton();
}


void bouton() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      SousMenu++;
      Tempo = millis() + 250;
      AfficheMenu();
    } else if (digitalRead(DOWN) == LOW) { /* Bouton Down  */
      Menu = Menu - 10;
      Tempo = millis() + 250;
      SousMenu = 0 ;
      AfficheMenu();
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      AfficheMenu();
    } else if (digitalRead(RIGHT) == LOW) { /* Bouton RIGHT  */
      SousMenu--;
      Tempo = millis() + 250;
      AfficheMenu();
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      Tempo = millis() + 750;
      switch (Menu + SousMenu) {
      case 21 :
          if(Tmin <= 29){
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if(Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
          }
          Serial.print("Tmin");
          Serial.println(Tmin);
          delay(200);
          break;
          NumMenu[21] = (TypeMenu) {
          "Temp Mini " +String(Tmin) + ('\xB0') + "c"
          };

      case 22 :
          if ((Tmax > Tmin)&&(Tmax <= 30)){
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
          }
          Serial.print("Tmax");
          Serial.println(Tmax);
          delay(200);
          break;
         
      case 31 :
          if(Hmin <= 99){
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if(Hmin >= Hmax) {
            Hmax = Hmin + 1;
            Serial.print("Hmax");
            Serial.println(Hmax);
          }
          Serial.print("Hmin");
          Serial.println(Hmin);
          delay(200);
          break;

      case 32 :
          if ((Hmax > Hmin)&&(Hmax <= 99)){
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
          }
          Serial.print("Hmax");
          Serial.println(Hmax);
          delay(200);
          break;

      case 41 :
          ;
      case 42 :
          ;
      }
    }
  }
}

void AfficheMenu() {
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 50 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }
}

void Regul() {
    if (test1 == 1) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temperature Mini");
      lcd.setCursor(0, 1);
      lcd.print(Hmin);
    }
}

void humi() {
    if (test2 > 0) {
    if ((digitalRead(test2)) == HIGH) {
      Serial.print("action on test2");
    }
    if ((digitalRead(test2)) == LOW) {
      Serial.print("action off test2");
    }
  }
}

void heurefunc() {
    if (test3 > 0) {
    if ((digitalRead(test3)) == HIGH) {
      Serial.print("action on test3");
    }
    if ((digitalRead(test3)) == LOW) {
      Serial.print("action off test3");
    }
  }
}
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 24, 2019, 10:07 am
Normal, le break te fait sortir de la poule euh non, du case :
Code: [Select]
         break;
         NumMenu[21] = (TypeMenu) {
         "Temp Mini " +String(Tmin) + ('\xB0') + "c"
         };

il faut mettre le break après la mise à jour du menu.

Au passage, je ne sais pas si ton + ('\xB0')  te permettra effectivement d'afficher le caractère °, ça peut dépendre de la police utilisée par la bibliothèque du LCD. Si tu ne vois pas le caractère, tu auras intérêt à ôter ce + ('\xB0')
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 10:12 am
edit : ah je vient de voir qu il se met a jour quand je navigue dans les sous menu est-il possible qu il se mette a jour en direct sans avoir besoin de switch. on avance on avance  :D  :D  ;)




effectivement pour le caractère il ne m affiche pas le bon il me met - au lieux de ° par contre mème quand je met avent le break je n 'est pas la mise a jour de mon menu. le code modifié

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int ventilo = 6;
int sonde = 7;
int relais = 8;
int Tmin = 20;
int Tmax= 25;
int Hmin = 20;
int Hmax = 25;
int heure = 1;
int minute = 1;

int unsigned Menu = 0;
int unsigned SousMenu = 0;

double Tempo = millis();
double Tempo2 = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int DOWN = A2;
int LEFT = A3;
int RIGHT = A4;



typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Home "
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temperature"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Mini " +String(Tmin) + ('\xB0') + "c"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " +String(Tmax) + ('\xB0') + "c"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humiditer"
  };
  NumMenu[31] = (TypeMenu) {
    "3.1 H min "
  };
  NumMenu[32] = (TypeMenu) {
    "3.2 H max"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "4.1 Reglage"
  };
  NumMenu[42] = (TypeMenu) {
    "4.2 Reglage heure"
  };
}



void setup() {
  pinMode(ventilo, OUTPUT);
  pinMode(sonde, OUTPUT);
  pinMode(relais, OUTPUT);

  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  * TUTORIEL *  ");
  lcd.setCursor(0, 1);
  lcd.print(Tmax);
  delay(2000);
  
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(DOWN, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(RIGHT, INPUT_PULLUP);
}



void loop() {
  Regul();
  humi();
  heurefunc();
  bouton();
}


void bouton() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      SousMenu++;
      Tempo = millis() + 250;
      AfficheMenu();
    } else if (digitalRead(DOWN) == LOW) { /* Bouton Down  */
      Menu = Menu - 10;
      Tempo = millis() + 250;
      SousMenu = 0 ;
      AfficheMenu();
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      AfficheMenu();
    } else if (digitalRead(RIGHT) == LOW) { /* Bouton RIGHT  */
      SousMenu--;
      Tempo = millis() + 250;
      AfficheMenu();
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      Tempo = millis() + 750;
      switch (Menu + SousMenu) {
      case 21 :{
          if(Tmin <= 29){
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if(Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
          }
          NumMenu[21] = (TypeMenu) {
          "Temp Mini " +String(Tmin) + ('\xB0') + "c"
          };
          Serial.print("Tmin");
          Serial.println(Tmin);
          delay(200);
          break;
      }
      case 22 :
          if ((Tmax > Tmin)&&(Tmax <= 30)){
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
          }
          Serial.print("Tmax");
          Serial.println(Tmax);
          delay(200);
          break;
          
      case 31 :
          if(Hmin <= 99){
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if(Hmin >= Hmax) {
            Hmax = Hmin + 1;
            Serial.print("Hmax");
            Serial.println(Hmax);
          }
          Serial.print("Hmin");
          Serial.println(Hmin);
          delay(200);
          break;

      case 32 :
          if ((Hmax > Hmin)&&(Hmax <= 99)){
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
          }
          Serial.print("Hmax");
          Serial.println(Hmax);
          delay(200);
          break;

      case 41 :
          ;
      case 42 :
          ;
      }
    }
  }
}

void AfficheMenu() {
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 50 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }
}

void Regul() {
    if (test1 == 1) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temperature Mini");
      lcd.setCursor(0, 1);
      lcd.print(Hmin);
    }
}

void humi() {
    if (test2 > 0) {
    if ((digitalRead(test2)) == HIGH) {
      Serial.print("action on test2");
    }
    if ((digitalRead(test2)) == LOW) {
      Serial.print("action off test2");
    }
  }
}

void heurefunc() {
    if (test3 > 0) {
    if ((digitalRead(test3)) == HIGH) {
      Serial.print("action on test3");
    }
    if ((digitalRead(test3)) == LOW) {
      Serial.print("action off test3");
    }
  }
}
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 24, 2019, 10:33 am
C'est parce que tu n'affiches pas le menu après avoir appuyé sur le bouton SELECT : ajoute AfficheMenu(); après l'accolade fermante } à la fin de ton switch

Comme tu dois afficher le menu après chaque cas de test des boutons, tu peux aussi bien l'enlever de chaque bloc if des boutons et le mettre à la fin du bloc if ( millis() > Tempo ) { (juste avant l'accolade fermante)
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 10:58 am
edit; ah tu veux dire que je peut retirer de chaque bouton AfficheMenu(); je comprend nikel



sa marche   ;)  ;)  ;)  :D  :D  :D


tu cartonne !!!  j ai passer une bonne partie de mon weekend dessus

par contre j ai pas trop compris ou et comment tu veut que je mette

if ( millis() > Tempo ) { (juste avant l'accolade fermante)

code modifier

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int ventilo = 6;
int sonde = 7;
int relais = 8;
int Tmin = 20;
int Tmax= 25;
int Hmin = 20;
int Hmax = 25;
int heure = 1;
int minute = 1;

int unsigned Menu = 0;
int unsigned SousMenu = 0;

double Tempo = millis();
double Tempo2 = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int DOWN = A2;
int LEFT = A3;
int RIGHT = A4;



typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Home "
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temperature"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Min " +String(Tmin) + " c"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " +String(Tmax) + " c"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humiditer"
  };
  NumMenu[31] = (TypeMenu) {
    "Humid Min " +String(Hmin) + "%"
  };
  NumMenu[32] = (TypeMenu) {
    "Humid Max " +String(Hmax) + "%"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "4.1 Reglage"
  };
  NumMenu[42] = (TypeMenu) {
    "4.2 Reglage heure"
  };
}



void setup() {
  pinMode(ventilo, OUTPUT);
  pinMode(sonde, OUTPUT);
  pinMode(relais, OUTPUT);

  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  * TUTORIEL *  ");
  lcd.setCursor(0, 1);
  lcd.print(Tmax);
  delay(2000);
 
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(DOWN, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(RIGHT, INPUT_PULLUP);
}



void loop() {
  Regul();
  humi();
  heurefunc();
  bouton();
}


void bouton() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      SousMenu++;
      Tempo = millis() + 250;
    } else if (digitalRead(DOWN) == LOW) { /* Bouton Down  */
      Menu = Menu - 10;
      Tempo = millis() + 250;
      SousMenu = 0 ;
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
    } else if (digitalRead(RIGHT) == LOW) { /* Bouton RIGHT  */
      SousMenu--;
      Tempo = millis() + 250;
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      Tempo = millis() + 750;
      switch (Menu + SousMenu) {
      case 21 :
          if(Tmin <= 29){
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if(Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
            NumMenu[22] = (TypeMenu) {
            "Temp Max " +String(Tmax) + "c"
          };
          }
          NumMenu[21] = (TypeMenu) {
          "Temp Min " +String(Tmin) + "c"
          };
          Serial.print("Tmin");
          Serial.println(Tmin);
          delay(200);
          break;
     
      case 22 :
          if ((Tmax > Tmin)&&(Tmax <= 30)){
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
            NumMenu[21] = (TypeMenu) {
            "Temp Min " +String(Tmin) + "c"
          };
          }
          NumMenu[22] = (TypeMenu) {
          "Temp Max " +String(Tmax) + "c"
          };
          Serial.print("Tmax");
          Serial.println(Tmax);
          delay(200);
          break;
         
      case 31 :
          if ((Hmax > Hmin)&&(Hmin <= 99)){
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if(Hmin >= Hmax) {
            Hmax = Hmin + 5;
            NumMenu[32] = (TypeMenu) {
            "Humid Max " +String(Hmax) + " %"
            };
            Serial.print("Hmax");
            Serial.println(Hmax);
          }
          NumMenu[31] = (TypeMenu) {
          "Humid Min " +String(Hmin) + " %"
          };
          Serial.print("Hmin");
          Serial.println(Hmin);
          delay(200);
          break;

      case 32 :
          if ((Hmax > Hmin)&&(Hmax <= 99)){
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
            NumMenu[31] = (TypeMenu) {
            "Humid Min " +String(Hmin) + " %"
            };
          }
          NumMenu[32] = (TypeMenu) {
          "Humid Max " +String(Hmax) + "%"
          };
          Serial.print("Hmax");
          Serial.println(Hmax);
          delay(200);
          break;

      case 41 :
          ;
      case 42 :
          ;
      }
    }
  }
  AfficheMenu();
}

void AfficheMenu() {
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 50 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }
}

void Regul() {
    if (test1 == 1) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temperature Mini");
      lcd.setCursor(0, 1);
      lcd.print(Hmin);
    }
}

void humi() {
    if (test2 > 0) {
    if ((digitalRead(test2)) == HIGH) {
      Serial.print("action on test2");
    }
    if ((digitalRead(test2)) == LOW) {
      Serial.print("action off test2");
    }
  }
}

void heurefunc() {
    if (test3 > 0) {
    if ((digitalRead(test3)) == HIGH) {
      Serial.print("action on test3");
    }
    if ((digitalRead(test3)) == LOW) {
      Serial.print("action off test3");
    }
  }
}
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 24, 2019, 11:16 am
Au lieu de ça
Code: [Select]
     case 42 :
         ;
     }
   }
 }
 AfficheMenu();  // <-- pas ici
}


je pensais à ça
Code: [Select]
     case 42 :
         ;
     }
   }
   AfficheMenu();  // <-- un cran plus haut
 }
}

Ce n'est pas une grosse différence, mais ça ne rafraîchit l'affichage que quand tu as des modifs (c'est à dire quand tu entres dans le if ( millis() > Tempo ) { ). Le code sera plus réactif (car le rafraîchissement du LCD peut prendre du temps) ce qui est bien pour les boutons, et ça évitera le clignotement du LCD

Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 11:24 am
parfait tout marche reste pas loin de se post  ;D  ;D  ;D  je v surement avoir plein plein d'autre question mais sinon encore merci pour ton aide
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 24, 2019, 11:33 am
No problem, moi ou un autre...
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 02:03 pm
comme ta pu le remarquer je début et j ai deux code actuellement et je comprend pas tout un avec mon menu et l autre avec mes sonde qui mesure chaque une un point de température. les deux code séparer fonctionne bien j arrive a les fusionner mais j'ai des soucie ma température se retrouve afficher tout le temps et écrie pardessus mon menu .

en faite je voudrais que

en 1 : quand je lance l Arduino mais mes température de sonde s affiche pour sa c'est ok
en 2 : quand j'appuie mon menu s'affiche mais sans afficher les sonde
en 3: je voudrai que dans mon premier menu il y est un sous menu qui me permet de revenir a l affichage général

code du menu que l on a fait ensemble

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int ventilo = 6;
int sonde = 7;
int relais = 8;
int Tmin = 20;
int Tmax= 25;
int Hmin = 20;
int Hmax = 25;
int heure = 1;
int minute = 1;

int unsigned Menu = 0;
int unsigned SousMenu = 0;

double Tempo = millis();
double Tempo2 = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int DOWN = A2;
int LEFT = A3;
int RIGHT = A4;



typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Info General "
  };
  NumMenu[11] = (TypeMenu) {
    "Temp Nid:" +String(Tmin)
  };
  NumMenu[12] = (TypeMenu) {
    "Temp ADC:" +String(Tmax)
  };
  NumMenu[13] = (TypeMenu) {
    "Humidite" +String(Tmax)
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temperature"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Min " +String(Tmin) + " c"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " +String(Tmax) + " c"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humidite"
  };
  NumMenu[31] = (TypeMenu) {
    "Humid Min " +String(Hmin) + "%"
  };
  NumMenu[32] = (TypeMenu) {
    "Humid Max " +String(Hmax) + "%"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "4.1 Reglage"
  };
  NumMenu[42] = (TypeMenu) {
    "4.2 Reglage heure"
  };
}



void setup() {
  pinMode(ventilo, OUTPUT);
  pinMode(sonde, OUTPUT);
  pinMode(relais, OUTPUT);

  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  * TUTORIEL *  ");
  lcd.setCursor(0, 1);
  lcd.print(Tmax);
  delay(2000);
  
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(DOWN, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(RIGHT, INPUT_PULLUP);
}



void loop() {
  Regul();
  humi();
  heurefunc();
  bouton();
}


void bouton() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      SousMenu++;
      Tempo = millis() + 250;
      AfficheMenu();
    } else if (digitalRead(DOWN) == LOW) { /* Bouton Down  */
      Menu = Menu - 10;
      Tempo = millis() + 250;
      SousMenu = 0 ;
      AfficheMenu();
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      AfficheMenu();
    } else if (digitalRead(RIGHT) == LOW) { /* Bouton RIGHT  */
      SousMenu--;
      Tempo = millis() + 250;
      AfficheMenu();
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      Tempo = millis() + 750;
      switch (Menu + SousMenu) {
        
      case 21 :
          if(Tmin <= 29){
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if(Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
            NumMenu[22] = (TypeMenu) {
            "Temp Max " +String(Tmax) + " c"
          };
          }
          NumMenu[21] = (TypeMenu) {
          "Temp Min " +String(Tmin) + " c"
          };
          Serial.print("Tmin");
          Serial.println(Tmin);
          delay(200);
          break;
      
      case 22 :
          if ((Tmax > Tmin)&&(Tmax <= 30)){
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
            NumMenu[21] = (TypeMenu) {
            "Temp Min " +String(Tmin) + " c"
          };
          }
          NumMenu[22] = (TypeMenu) {
          "Temp Max " +String(Tmax) + " c"
          };
          Serial.print("Tmax");
          Serial.println(Tmax);
          delay(200);
          break;
          
      case 31 :
          if ((Hmax > Hmin)&&(Hmin <= 99)){
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if(Hmin >= Hmax) {
            Hmax = Hmin + 5;
            NumMenu[32] = (TypeMenu) {
            "Humid Max " +String(Hmax) + " %"
            };
            Serial.print("Hmax");
            Serial.println(Hmax);
          }
          NumMenu[31] = (TypeMenu) {
          "Humid Min " +String(Hmin) + " %"
          };
          Serial.print("Hmin");
          Serial.println(Hmin);
          delay(200);
          break;

      case 32 :
          if ((Hmax > Hmin)&&(Hmax <= 99)){
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
            NumMenu[31] = (TypeMenu) {
            "Humid Min " +String(Hmin) + " %"
            };
          }
          NumMenu[32] = (TypeMenu) {
          "Humid Max " +String(Hmax) + " %"
          };
          Serial.print("Hmax");
          Serial.println(Hmax);
          delay(200);
          break;

      case 41 :
          ;
      case 42 :
          ;
      }
      AfficheMenu();
    }
  }
}

void AfficheMenu() {
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 50 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }
}

void Regul() {
    if (test1 == 1) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temperature Mini");
      lcd.setCursor(0, 1);
      lcd.print(Hmin);
    }
}

void humi() {
    if (test2 > 0) {
    if ((digitalRead(test2)) == HIGH) {
      Serial.print("action on test2");
    }
    if ((digitalRead(test2)) == LOW) {
      Serial.print("action off test2");
    }
  }
}

void heurefunc() {
    if (test3 > 0) {
    if ((digitalRead(test3)) == HIGH) {
      Serial.print("action on test3");
    }
    if ((digitalRead(test3)) == LOW) {
      Serial.print("action off test3");
    }
  }
}




code de mais deux sonde

Code: [Select]
#include <LiquidCrystal.h>
#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds(10);  // on pin 10

byte addr1[8] = {0x28, 0xAA, 0x98, 0x12, 0x3C, 0x14, 0x01, 0xD7};
byte addr2[8] = {0x28, 0xAA, 0xC1, 0x91, 0x3B, 0x14, 0x01, 0x9A};
int SignBit = 0;
int StartCol = 8;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  Serial.begin(9600);
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Temp NID:");
  lcd.setCursor(0, 1);
  lcd.print("Temp ADC:");
}

int tc_100(byte* addr){
  int HighByte, LowByte, TReading;
  byte data[12];
  byte i;

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end

  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }

  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  return (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
}

void mypr(int Tc_100, int line) {
  int Whole, Fract;

  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  if (SignBit) // If its negative
  {
     lcd.setCursor(StartCol,line);
     lcd.print("-");
  }
  lcd.setCursor(StartCol+1,line);
  lcd.print(Whole);
  lcd.print(".");
  if (Fract < 10)
  {
     lcd.print("0");
  }
  lcd.print(Fract);
  lcd.print("C");
}

void loop()
{
  byte i;
  byte data[12];
  int Tc_100;

  Tc_100 = tc_100(addr1);
  mypr(Tc_100,0);

  Tc_100 = tc_100(addr2);
  mypr(Tc_100,1);
}



je met ma tentative de fusion dans le prochain post car je depasse les 9000 characters
Title: Re: besoin d'aide pour un menu,
Post by: dbrion06 on Apr 24, 2019, 02:10 pm
Est ce que vous pouvez definir une variable qui vaut, disons, vrai si un menu est actif, faux si on a demandé un affichage?
En plus, data ne sert à rien dans votre loop() du second mort sot.
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 02:11 pm
ma tentative de fusion des deux code

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds(10);  // on pin 10

byte addr1[8] = {0x28, 0xAA, 0x98, 0x12, 0x3C, 0x14, 0x01, 0xD7};
byte addr2[8] = {0x28, 0xAA, 0xC1, 0x91, 0x3B, 0x14, 0x01, 0x9A};
int SignBit = 0;
int StartCol = 8;

int ventilo = 6;
int sonde = 7;
int relais = 1;
int Tmin = 20;
int Tmax= 25;
int Hmin = 20;
int Hmax = 25;
int heure = 1;
int minute = 1;

int unsigned Menu = 0;
int unsigned SousMenu = 0;

double Tempo = millis();
double Tempo2 = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int DOWN = A2;
int LEFT = A3;
int RIGHT = A4;



typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Info General "
  };
  NumMenu[11] = (TypeMenu) {
    "Temp Nid:" +String(Tmin)
  };
  NumMenu[12] = (TypeMenu) {
    "Temp ADC:" +String(Tmax)
  };
  NumMenu[13] = (TypeMenu) {
    "Humidite" +String(Tmax)
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temperature"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Min " +String(Tmin) + " c"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " +String(Tmax) + " c"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humidite"
  };
  NumMenu[31] = (TypeMenu) {
    "Humid Min " +String(Hmin) + "%"
  };
  NumMenu[32] = (TypeMenu) {
    "Humid Max " +String(Hmax) + "%"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "4.1 Reglage"
  };
  NumMenu[42] = (TypeMenu) {
    "4.2 Reglage heure"
  };
}



void setup() {
  pinMode(ventilo, OUTPUT);
  pinMode(sonde, OUTPUT);
  pinMode(relais, OUTPUT);

  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp NID:");;
  lcd.setCursor(0, 1);
  lcd.print("Temp ADC:");
  delay(2000);
 
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(DOWN, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(RIGHT, INPUT_PULLUP);
}



void loop() {
  Sondes();
  Regul();
  humi();
  heurefunc();
  bouton();
}


void bouton() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      SousMenu++;
      Tempo = millis() + 250;
      AfficheMenu();
    } else if (digitalRead(DOWN) == LOW) { /* Bouton Down  */
      Menu = Menu - 10;
      Tempo = millis() + 250;
      SousMenu = 0 ;
      AfficheMenu();
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      AfficheMenu();
    } else if (digitalRead(RIGHT) == LOW) { /* Bouton RIGHT  */
      SousMenu--;
      Tempo = millis() + 250;
      AfficheMenu();
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      Tempo = millis() + 750;
      switch (Menu + SousMenu) {
         
      case 21 :
          if(Tmin <= 29){
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if(Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
            NumMenu[22] = (TypeMenu) {
            "Temp Max " +String(Tmax) + " c"
          };
          }
          NumMenu[21] = (TypeMenu) {
          "Temp Min " +String(Tmin) + " c"
          };
          Serial.print("Tmin");
          Serial.println(Tmin);
          delay(200);
          break;
     
      case 22 :
          if ((Tmax > Tmin)&&(Tmax <= 30)){
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
            NumMenu[21] = (TypeMenu) {
            "Temp Min " +String(Tmin) + " c"
          };
          }
          NumMenu[22] = (TypeMenu) {
          "Temp Max " +String(Tmax) + " c"
          };
          Serial.print("Tmax");
          Serial.println(Tmax);
          delay(200);
          break;
         
      case 31 :
          if ((Hmax > Hmin)&&(Hmin <= 99)){
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if(Hmin >= Hmax) {
            Hmax = Hmin + 5;
            NumMenu[32] = (TypeMenu) {
            "Humid Max " +String(Hmax) + " %"
            };
            Serial.print("Hmax");
            Serial.println(Hmax);
          }
          NumMenu[31] = (TypeMenu) {
          "Humid Min " +String(Hmin) + " %"
          };
          Serial.print("Hmin");
          Serial.println(Hmin);
          delay(200);
          break;

      case 32 :
          if ((Hmax > Hmin)&&(Hmax <= 99)){
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
            NumMenu[31] = (TypeMenu) {
            "Humid Min " +String(Hmin) + " %"
            };
          }
          NumMenu[32] = (TypeMenu) {
          "Humid Max " +String(Hmax) + " %"
          };
          Serial.print("Hmax");
          Serial.println(Hmax);
          delay(200);
          break;

      case 41 :
          ;
      case 42 :
          ;
      }
      AfficheMenu();
    }
  }
}

void AfficheMenu() {
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 50 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }
}

void Regul() {
    if (test1 == 1) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temperature Mini");
      lcd.setCursor(0, 1);
      lcd.print(Hmin);
    }
}

void humi() {
    if (test2 > 0) {
    if ((digitalRead(test2)) == HIGH) {
      Serial.print("action on test2");
    }
    if ((digitalRead(test2)) == LOW) {
      Serial.print("action off test2");
    }
  }
}

void heurefunc() {
    if (test3 > 0) {
    if ((digitalRead(test3)) == HIGH) {
      Serial.print("action on test3");
    }
    if ((digitalRead(test3)) == LOW) {
      Serial.print("action off test3");
    }
  }
}



// sonde temperature




int tc_100(byte* addr){
  int HighByte, LowByte, TReading;
  byte data[12];
  byte i;

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end

  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

  ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }

  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  return (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
}

void mypr(int Tc_100, int line) {
  int Whole, Fract;

  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  if (SignBit) // If its negative
  {
     lcd.setCursor(StartCol,line);
     lcd.print("-");
  }
  lcd.setCursor(StartCol+1,line);
  lcd.print(Whole);
  lcd.print(".");
  if (Fract < 10)
  {
     lcd.print("0");
  }
  lcd.print(Fract);
  lcd.print("C");
}

void Sondes()
{
  byte i;
  byte data[12];
  int Tc_100;

  Tc_100 = tc_100(addr1);
  mypr(Tc_100,0);

  Tc_100 = tc_100(addr2);
  mypr(Tc_100,1);
}
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 02:16 pm
Est ce que vous pouvez definir une variable qui vaut, disons, vrai si un menu est actif, faux si on a demandé un affichage?
En plus, data ne sert à rien dans votre loop() du second mort sot.
je v t avouai ne pas y connaitre grand chose

tu veux dire avec une

variable = 1 sa active le menu
variable = 0 sa active le menu

je voie le principe mais pas vraiment comment faire
Title: Re: besoin d'aide pour un menu,
Post by: dbrion06 on Apr 24, 2019, 02:22 pm
void Sondes()
{
 byte i;
 byte data[12];
 int Tc_100;

 Tc_100 = tc_100(addr1);
 mypr(Tc_100,0);

 Tc_100 = tc_100(addr2);
 mypr(Tc_100,1);
}
peut se reécrire (plus concis; sera plus facile à maintenir à therme)
en
Code: [Select]

void Sondes() {
  mypr(tc_100(addr1), 0);

  mypr(tc_100(addr2),1);
}
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 24, 2019, 02:33 pm
Oui c'est en effet comme ça que tu peux faire. Ce genre de variable peut être fait avec un type bool  (https://www.arduino.cc/reference/en/language/variables/data-types/bool/): c'est un booléen qui ne peut prendre comme valeurs que true ou false (ce sont des raccourcis pour 1 et 0).
Tu peux faire comme ça :
Code: [Select]
bool afficheMenu = true;
...
if (afficheMenu) {
 //  les instructions liées au menu
} else {
 // les autres instructions d'affichage
}


Pour compléter ce que propose dbrion06, en regardant la fonction de lecture des sondes, je vois que tu mets un delay(1000) : chaque lecture prend donc une seconde. Pour 2 lectures, ça fait deux secondes et pendant ce temps, le code ne fait RIEN DU TOUT. C'est bloquant : si tu appuies sur un bouton pendant ces 2 secondes, l'appui ne sera pas pris en compte !

Donc, première solution : lire les 2 sondes dans la même fonction. Ça te permet de réduire de 2 à 1 seconde, mais le résultat sera pratiquement le même.

Autre solution, écrire un code non bloquant pour lire les sondes. Pas facile sans chambouler complètement la structure du code actuel. Le plus simple serait de tirer parti de ce temps d'attente pour lire les boutons. Au lieu de
Code: [Select]
int tc_100(byte* addr){
  int HighByte, LowByte, TReading;
  byte data[12];
  byte i;

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end

  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

  ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad
...
tu peux changer le delay(1000) en
Code: [Select]
unsigned long chrono = millis();
while (millis()-chrono < 1000ul) {
    // lecture des boutons et traitement si menu
    bouton();
}
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 03:16 pm
parfait mon menu et redevenu fluide

la le dernier soucie c toujours ma température qui s affiche partout sur mes menu

(https://cdn.discordapp.com/attachments/412535649787183105/570596512384679968/JPEG_20190424_150636.jpg)

il faudrait que quand j active le menu je désactive l affichage de met sonde met uniquement l affichage que le contrôle se face en tache de fond.

pour désactiver mon menu sur quelle paramètre je doit impacter ? le void Initialisation() ?

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds(10);  // on pin 10

byte addr1[8] = {0x28, 0xAA, 0x98, 0x12, 0x3C, 0x14, 0x01, 0xD7};
byte addr2[8] = {0x28, 0xAA, 0xC1, 0x91, 0x3B, 0x14, 0x01, 0x9A};
int SignBit = 0;
int StartCol = 8;

int ventilo = 6;
int sonde = 7;
int relais = 1;
int Tmin = 20;
int Tmax= 25;
int Hmin = 20;
int Hmax = 25;
int heure = 1;
int minute = 1;

int unsigned Menu = 0;
int unsigned SousMenu = 0;

double Tempo = millis();
double Tempo2 = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int DOWN = A2;
int LEFT = A3;
int RIGHT = A4;



typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Info General "
  };
  NumMenu[11] = (TypeMenu) {
    "Temp Nid:" +String(Tmin)
  };
  NumMenu[12] = (TypeMenu) {
    "Temp ADC:" +String(Tmax)
  };
  NumMenu[13] = (TypeMenu) {
    "Humidite" +String(Tmax)
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temperature"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Min " +String(Tmin) + " c"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " +String(Tmax) + " c"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humidite"
  };
  NumMenu[31] = (TypeMenu) {
    "Humid Min " +String(Hmin) + "%"
  };
  NumMenu[32] = (TypeMenu) {
    "Humid Max " +String(Hmax) + "%"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "4.1 Reglage"
  };
  NumMenu[42] = (TypeMenu) {
    "4.2 Reglage heure"
  };
}



void setup() {
  pinMode(ventilo, OUTPUT);
  pinMode(sonde, OUTPUT);
  pinMode(relais, OUTPUT);

  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp NID:");;
  lcd.setCursor(0, 1);
  lcd.print("Temp ADC:");
  delay(2000);
 
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(DOWN, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(RIGHT, INPUT_PULLUP);
}



void loop() {
  Sondes();
  Regul();
  humi();
  heurefunc();
  bouton();
}


void bouton() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      SousMenu++;
      Tempo = millis() + 250;
      AfficheMenu();
    } else if (digitalRead(DOWN) == LOW) { /* Bouton Down  */
      Menu = Menu - 10;
      Tempo = millis() + 250;
      SousMenu = 0 ;
      AfficheMenu();
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      AfficheMenu();
    } else if (digitalRead(RIGHT) == LOW) { /* Bouton RIGHT  */
      SousMenu--;
      Tempo = millis() + 250;
      AfficheMenu();
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      Tempo = millis() + 750;
      switch (Menu + SousMenu) {
         
      case 21 :
          if(Tmin <= 29){
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if(Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
            NumMenu[22] = (TypeMenu) {
            "Temp Max " +String(Tmax) + " c"
          };
          }
          NumMenu[21] = (TypeMenu) {
          "Temp Min " +String(Tmin) + " c"
          };
          Serial.print("Tmin");
          Serial.println(Tmin);
          delay(200);
          break;
     
      case 22 :
          if ((Tmax > Tmin)&&(Tmax <= 30)){
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
            NumMenu[21] = (TypeMenu) {
            "Temp Min " +String(Tmin) + " c"
          };
          }
          NumMenu[22] = (TypeMenu) {
          "Temp Max " +String(Tmax) + " c"
          };
          Serial.print("Tmax");
          Serial.println(Tmax);
          delay(200);
          break;
         
      case 31 :
          if ((Hmax > Hmin)&&(Hmin <= 99)){
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if(Hmin >= Hmax) {
            Hmax = Hmin + 5;
            NumMenu[32] = (TypeMenu) {
            "Humid Max " +String(Hmax) + " %"
            };
            Serial.print("Hmax");
            Serial.println(Hmax);
          }
          NumMenu[31] = (TypeMenu) {
          "Humid Min " +String(Hmin) + " %"
          };
          Serial.print("Hmin");
          Serial.println(Hmin);
          delay(200);
          break;

      case 32 :
          if ((Hmax > Hmin)&&(Hmax <= 99)){
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
            NumMenu[31] = (TypeMenu) {
            "Humid Min " +String(Hmin) + " %"
            };
          }
          NumMenu[32] = (TypeMenu) {
          "Humid Max " +String(Hmax) + " %"
          };
          Serial.print("Hmax");
          Serial.println(Hmax);
          delay(200);
          break;

      case 41 :
          ;
      case 42 :
          ;
      }
      AfficheMenu();
    }
  }
}

void AfficheMenu() {
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 50 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }
}

void Regul() {
    if (test1 == 1) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temperature Mini");
      lcd.setCursor(0, 1);
      lcd.print(Hmin);
    }
}

void humi() {
    if (test2 > 0) {
    if ((digitalRead(test2)) == HIGH) {
      Serial.print("action on test2");
    }
    if ((digitalRead(test2)) == LOW) {
      Serial.print("action off test2");
    }
  }
}

void heurefunc() {
    if (test3 > 0) {
    if ((digitalRead(test3)) == HIGH) {
      Serial.print("action on test3");
    }
    if ((digitalRead(test3)) == LOW) {
      Serial.print("action off test3");
    }
  }
}



// sonde temperature




int tc_100(byte* addr){
  int HighByte, LowByte, TReading;
  byte data[12];
  byte i;

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end

  unsigned long chrono = millis();
    while (millis()-chrono < 1000ul) {
    // lecture des boutons et traitement si menu
    bouton();
    }

  ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }

  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  return (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
}

void mypr(int Tc_100, int line) {
  int Whole, Fract;

  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  if (SignBit) // If its negative
  {
     lcd.setCursor(StartCol,line);
     lcd.print("-");
  }
  lcd.setCursor(StartCol+1,line);
  lcd.print(Whole);
  lcd.print(".");
  if (Fract < 10)
  {
     lcd.print("0");
  }
  lcd.print(Fract);
  lcd.print("C");
}

void Sondes() {
  mypr(tc_100(addr1), 0);

  mypr(tc_100(addr2),1);
}

Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 03:57 pm
ou alors je prend un affichage lcd de 4*16 ?
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 24, 2019, 04:11 pm
Pas besoin...
Je pense que c'est lors de l'appui sur un bouton que tu dois switcher sur l'affichage du menu. En dehors, il faut afficher les températures. Exact ?

On y arrivera : d'abord tu déclares dans l'entête la variable booléenne globale
Code: [Select]
bool afficherMenu = false;

Puis dans bouton(), tu la passes à true lorsqu'un appui sur un bouton est détecté.

Tu modifies Sondes pour prendre en compte l'affichage
Code: [Select]
void Sondes() {
  if (!afficherMenu) {
    mypr(tc_100(addr1), 0);
    mypr(tc_100(addr2),1);
  }
}


Il reste à savoir quand la repasser à false. Quelle est ton idée, pour passer de l'affichage du menu à celui des températures ? Une temporisation ? L'appui sur un autre bouton ? Si c'est le bouton SELECT, tu peux changer ici :
Code: [Select]
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      afficherMenu = false;  // <-- ici
      Tempo = millis() + 750;


Clair ?
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 05:44 pm
merci ji voie effectivement plus clair et sa me remotive je me sens moin seul sa fait du bien ^^

j ai supprimer deux bouton dans mon code du coups j en est remis un nommé HOME dans l idéal il serait bien qu il me ramené sur l affichage principal

j ai également mis ton bout de code mais mes température reste afficher par dessus met menu

le code

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds(10);  // on pin 10

byte addr1[8] = {0x28, 0xAA, 0x98, 0x12, 0x3C, 0x14, 0x01, 0xD7};
byte addr2[8] = {0x28, 0xAA, 0xC1, 0x91, 0x3B, 0x14, 0x01, 0x9A};
int SignBit = 0;
int StartCol = 8;

bool afficherMenu = false;

int ventilo = 6;
int sonde = 7;
int relais = 1;
int Tmin = 20;
int Tmax= 25;
int Hmin = 20;
int Hmax = 25;
int heure = 1;
int minute = 1;

int unsigned Menu = 0;
int unsigned SousMenu = 0;

double Tempo = millis();
double Tempo2 = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int LEFT = A3;
int HOME = A4;



typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Info General "
  };
  NumMenu[11] = (TypeMenu) {
    "Temp Nid:" +String(Tmin)
  };
  NumMenu[12] = (TypeMenu) {
    "Temp ADC:" +String(Tmax)
  };
  NumMenu[13] = (TypeMenu) {
    "Humidite" +String(Tmax)
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temperature"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Min " +String(Tmin) + " c"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " +String(Tmax) + " c"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humidite"
  };
  NumMenu[31] = (TypeMenu) {
    "Humid Min " +String(Hmin) + "%"
  };
  NumMenu[32] = (TypeMenu) {
    "Humid Max " +String(Hmax) + "%"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "4.1 Reglage"
  };
  NumMenu[42] = (TypeMenu) {
    "4.2 Reglage heure"
  };
}



void setup() {
  pinMode(ventilo, OUTPUT);
  pinMode(sonde, OUTPUT);
  pinMode(relais, OUTPUT);

  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp NID:");;
  lcd.setCursor(0, 1);
  lcd.print("Temp ADC:");
  delay(2000);
 
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(HOME, INPUT_PULLUP);
}



void loop() {
  Sondes();
  Regul();
  humi();
  heurefunc();
  bouton();
  if ((Tmax*100) < (tc_100(addr1))){
    digitalWrite(ventilo, HIGH);
  }else {
      digitalWrite(ventilo, LOW);
    }
  }

void bouton() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      SousMenu++;
      Tempo = millis() + 250;
      AfficheMenu();
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      AfficheMenu();
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      Tempo = millis() + 750;
      switch (Menu + SousMenu) {
        
      case 21 :
          if(Tmin <= 29){
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if(Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
            NumMenu[22] = (TypeMenu) {
            "Temp Max " +String(Tmax) + " c"
          };
          }
          NumMenu[21] = (TypeMenu) {
          "Temp Min " +String(Tmin) + " c"
          };
          Serial.print("Tmin");
          Serial.println(Tmin);
          delay(200);
          break;
    
      case 22 :
          if ((Tmax > Tmin)&&(Tmax <= 30)){
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
            NumMenu[21] = (TypeMenu) {
            "Temp Min " +String(Tmin) + " c"
          };
          }
          NumMenu[22] = (TypeMenu) {
          "Temp Max " +String(Tmax) + " c"
          };
          Serial.print("Tmax");
          Serial.println(Tmax);
          delay(200);
          break;
        
      case 31 :
          if ((Hmax > Hmin)&&(Hmin <= 99)){
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if(Hmin >= Hmax) {
            Hmax = Hmin + 5;
            NumMenu[32] = (TypeMenu) {
            "Humid Max " +String(Hmax) + " %"
            };
            Serial.print("Hmax");
            Serial.println(Hmax);
          }
          NumMenu[31] = (TypeMenu) {
          "Humid Min " +String(Hmin) + " %"
          };
          Serial.print("Hmin");
          Serial.println(Hmin);
          delay(200);
          break;

      case 32 :
          if ((Hmax > Hmin)&&(Hmax <= 99)){
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
            NumMenu[31] = (TypeMenu) {
            "Humid Min " +String(Hmin) + " %"
            };
          }
          NumMenu[32] = (TypeMenu) {
          "Humid Max " +String(Hmax) + " %"
          };
          Serial.print("Hmax");
          Serial.println(Hmax);
          delay(200);
          break;

      case 41 :
          ;
      case 42 :
          ;
      }
      AfficheMenu();
    }
  }
}

void AfficheMenu() {
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 50 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }
}

void Regul() {
    if (test1 == 1) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temperature Mini");
      lcd.setCursor(0, 1);
      lcd.print(Hmin);
    }
}

void humi() {
    if (test2 > 0) {
    if ((digitalRead(test2)) == HIGH) {
      Serial.print("action on test2");
    }
    if ((digitalRead(test2)) == LOW) {
      Serial.print("action off test2");
    }
  }
}

void heurefunc() {
    if (test3 > 0) {
    if ((digitalRead(test3)) == HIGH) {
      Serial.print("action on test3");
    }
    if ((digitalRead(test3)) == LOW) {
      Serial.print("action off test3");
    }
  }
}



// sonde temperature




int tc_100(byte* addr){
  int HighByte, LowByte, TReading;
  byte data[12];
  byte i;

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end

  unsigned long chrono = millis();
    while (millis()-chrono < 1000ul) {
    // lecture des boutons et traitement si menu
    bouton();
    }

  ds.reset();
  ds.select(addr);  
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }

  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  return (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
}

void mypr(int Tc_100, int line) {
  int Whole, Fract;

  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  if (SignBit) // If its negative
  {
     lcd.setCursor(StartCol,line);
     lcd.print("-");
  }
  lcd.setCursor(StartCol+1,line);
  lcd.print(Whole);
  lcd.print(".");
  if (Fract < 10)
  {
     lcd.print("0");
  }
  lcd.print(Fract);
  lcd.print("C");
}

void Sondes() {
  if (!afficherMenu) {
    mypr(tc_100(addr1), 0);
    mypr(tc_100(addr2),1);
  } else if (digitalRead(HOME) == LOW) { /* Bouton Select */
      afficherMenu = false;  // <-- ici
      Tempo = millis() + 750;
      }
}
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 24, 2019, 05:50 pm
Tu n'as pas fait ça :
Quote
Puis dans bouton(), tu la passes à true lorsqu'un appui sur un bouton est détecté.
Code: [Select]
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      afficherMenu = true;  // <-- ici
      SousMenu++;
      Tempo = millis() + 250;
      AfficheMenu();
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      afficherMenu = true;  // <-- ici
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      AfficheMenu();
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      afficherMenu = true;  // <-- et ici
      Tempo = millis() + 750;
      switch (Menu + SousMenu) {
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 06:11 pm
ok sa marche  ;D  ;D  ;D  ;D  les température se cache

encore quelque réglage mais on est pas loin

1 par moment mais pas toujours la température reste affiché si il y a pas de sous menu qui récrie par dessus.

2 le retour se fait mais il est très long a revenir et je doit appuyer une deuxième fois en général

3 quand je revient au HOME les sous menu eux reste afficher j ai donc rajouter ceci mais je pense pas que se soit le plus propre ? mais sa marche


Code: [Select]
void Sondes() {
  if (!afficherMenu) {
    mypr(tc_100(addr1),0);
    mypr(tc_100(addr2),1);
  } else if (digitalRead(HOME) == LOW) { /* Bouton Select */
      afficherMenu = false;
      Tempo = millis() + 750;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temp NID:");;
      lcd.setCursor(0, 1);
      lcd.print("Temp ADC:");
      }
}


Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 24, 2019, 06:19 pm
Tu peux mettre un lcd.clear(); lorsque tu vois qu'un sous-menu reste en partie affiché.

Que veux-tu dire par :
Quote
le retour se fait mais il est très long a revenir et je doit appuyer une deuxième fois en général
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 06:25 pm
ok

je suis dans le menu
j'appuie une fois sur home rien ne se passe j'attends un peux rien 10/20 second
je rappuie le retour se fait

si je spams le bouton des la première fois je peux appuyer 3/4 fois avent le retour
et par moment une fois sufie
on dirait que c plus ou moin aléatoire
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 06:36 pm
j ai mis des lcd.clear dans mes bouton le retour et instantané maintenant par contre quand je rentre dans mon menu la température de la deuxième ligne reste affiché et des que je me déplace dans le menu ou sous menu elle disparait


Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds(10);  // on pin 10

byte addr1[8] = {0x28, 0xAA, 0x98, 0x12, 0x3C, 0x14, 0x01, 0xD7};
byte addr2[8] = {0x28, 0xAA, 0xC1, 0x91, 0x3B, 0x14, 0x01, 0x9A};
int SignBit = 0;
int StartCol = 8;

bool afficherMenu = false;
bool temperatureLimite = false;

int ventilo = 6;
int sonde = 7;
int relais = 1;
int Tmin = 20;
int Tmax= 25;
int Hmin = 20;
int Hmax = 25;
int heure = 1;
int minute = 1;

int unsigned Menu = 0;
int unsigned SousMenu = 0;

double Tempo = millis();
double Tempo2 = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int LEFT = A3;
int HOME = A4;



typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Info General "
  };
  NumMenu[11] = (TypeMenu) {
    "Temp Nid:" +String(Tmin)
  };
  NumMenu[12] = (TypeMenu) {
    "Temp ADC:" +String(Tmax)
  };
  NumMenu[13] = (TypeMenu) {
    "Humidite" +String(Tmax)
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temperature"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Min " +String(Tmin) + " c"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " +String(Tmax) + " c"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humidite"
  };
  NumMenu[31] = (TypeMenu) {
    "Humid Min " +String(Hmin) + "%"
  };
  NumMenu[32] = (TypeMenu) {
    "Humid Max " +String(Hmax) + "%"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "4.1 Reglage"
  };
  NumMenu[42] = (TypeMenu) {
    "4.2 Reglage heure"
  };
}



void setup() {
  pinMode(ventilo, OUTPUT);
  pinMode(sonde, OUTPUT);
  pinMode(relais, OUTPUT);

  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp NID:");;
  lcd.setCursor(0, 1);
  lcd.print("Temp ADC:");
  delay(2000);
 
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(HOME, INPUT_PULLUP);
}



void loop() {
  Sondes();
  Regul();
  humi();
  heurefunc();
  bouton();
}

void bouton() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      lcd.clear();
      afficherMenu = true;  // <-- ici
      SousMenu++;
      Tempo = millis() + 250;
      AfficheMenu();
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      lcd.clear();
      afficherMenu = true;  // <-- ici
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      AfficheMenu();
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      afficherMenu = true;  // <-- et ici
      Tempo = millis() + 750;
      switch (Menu + SousMenu) {
        
      case 21 :
          if(Tmin <= 29){
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if(Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
            NumMenu[22] = (TypeMenu) {
            "Temp Max " +String(Tmax) + " c"
          };
          }
          NumMenu[21] = (TypeMenu) {
          "Temp Min " +String(Tmin) + " c"
          };
          Serial.print("Tmin");
          Serial.println(Tmin);
          delay(200);
          break;
    
      case 22 :
          if ((Tmax > Tmin)&&(Tmax <= 30)){
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
            NumMenu[21] = (TypeMenu) {
            "Temp Min " +String(Tmin) + " c"
          };
          }
          NumMenu[22] = (TypeMenu) {
          "Temp Max " +String(Tmax) + " c"
          };
          Serial.print("Tmax");
          Serial.println(Tmax);
          delay(200);
          break;
        
      case 31 :
          if ((Hmax > Hmin)&&(Hmin <= 99)){
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if(Hmin >= Hmax) {
            Hmax = Hmin + 5;
            NumMenu[32] = (TypeMenu) {
            "Humid Max " +String(Hmax) + " %"
            };
            Serial.print("Hmax");
            Serial.println(Hmax);
          }
          NumMenu[31] = (TypeMenu) {
          "Humid Min " +String(Hmin) + " %"
          };
          Serial.print("Hmin");
          Serial.println(Hmin);
          delay(200);
          break;

      case 32 :
          if ((Hmax > Hmin)&&(Hmax <= 99)){
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
            NumMenu[31] = (TypeMenu) {
            "Humid Min " +String(Hmin) + " %"
            };
          }
          NumMenu[32] = (TypeMenu) {
          "Humid Max " +String(Hmax) + " %"
          };
          Serial.print("Hmax");
          Serial.println(Hmax);
          delay(200);
          break;

      case 41 :
          ;
      case 42 :
          ;
      }
      AfficheMenu();
    }
  }
}

void AfficheMenu() {
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 50 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }
}

void Regul() {
    if (test1 == 1) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temperature Mini");
      lcd.setCursor(0, 1);
      lcd.print(Hmin);
    }
}

void humi() {
    if (test2 > 0) {
    if ((digitalRead(test2)) == HIGH) {
      Serial.print("action on test2");
    }
    if ((digitalRead(test2)) == LOW) {
      Serial.print("action off test2");
    }
  }
}

void heurefunc() {
    if (test3 > 0) {
    if ((digitalRead(test3)) == HIGH) {
      Serial.print("action on test3");
    }
    if ((digitalRead(test3)) == LOW) {
      Serial.print("action off test3");
    }
  }
}



// sonde temperature




int tc_100(byte* addr){
  int HighByte, LowByte, TReading;
  byte data[12];
  byte i;

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end

  unsigned long chrono = millis();
    while (millis()-chrono < 1000ul) {
    // lecture des boutons et traitement si menu
    bouton();
    }

  ds.reset();
  ds.select(addr);  
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }

  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  return (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
}

void mypr(int Tc_100, int line) {
  int Whole, Fract;

  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  if (SignBit) // If its negative
  {
     lcd.setCursor(StartCol,line);
     lcd.print("-");
  }
  lcd.setCursor(StartCol+1,line);
  lcd.print(Whole);
  lcd.print(".");
  if (Fract < 10)
  {
     lcd.print("0");
  }
  lcd.print(Fract);
  lcd.print("C");
}

void Sondes() {
  if (!afficherMenu) {
    mypr(tc_100(addr1),0);
    mypr(tc_100(addr2),1);
  } else if (digitalRead(HOME) == LOW) { /* Bouton Select */
      afficherMenu = false;
      Tempo = millis() + 750;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temp NID:");;
      lcd.setCursor(0, 1);
      lcd.print("Temp ADC:");
      }
}



(https://cdn.discordapp.com/attachments/412535649787183105/570649671303692290/JPEG_20190424_183751.jpg)
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 24, 2019, 06:42 pm
1 : Tu as des delay(200) qui traînent, enlève les si tu n'en as pas besoin
2 : Si l'écran ne s'efface pas c'est que tu as oublié un endroit où mettre le lcd.clear...
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 06:48 pm
les delay(200) on l aire d avoir régler le soucie de délais du home

mais pour ma température rebel je voie pas
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 06:55 pm
en faite il désactive bien les température affiche mais si le menu n écrit pas par dessus il les laisse afficher mais ne les actualise pas comme tu dit c juste un clear mais ou ?
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 07:09 pm
je me demande si c pas a cause de mon delais sur les sonde ? es que a ton avis l actualisation peut se terminer après le clear se qui expliquerez que le clear impacte pas ?


edit

je confirme c sur que c sa ma sonde s actualise encore 1 pendant que le menu s active se qui explique qu il apparaisse 1 fois et plus après ? ta une idée de comment retarder l affichage ou supprimer la dernière actualisation de mes sonde ?
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 24, 2019, 07:29 pm
les delay(200) on l aire d avoir régler le soucie de délais du home
Pour vérifier, tu les mets en commentaire et tu regardes si tu as de nouveau le problème
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 07:29 pm

je confirme c sur que c sa ma sonde s actualise encore 1 pendant que le menu s active se qui explique qu il apparaisse 1 fois et plus après ? ta une idée de comment retarder l affichage ou supprimer la dernière actualisation de mes sonde ?
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 24, 2019, 07:31 pm
je confirme c sur que c sa ma sonde s actualise encore 1 pendant que le menu s active se qui explique qu il apparaisse 1 fois et plus après ? ta une idée de comment retarder l affichage ou supprimer la dernière actualisation de mes sonde ?
J'ai du mal à comprendre ce que tu veux dire...
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 24, 2019, 08:09 pm
en faite mes sonde s'actualise en continu


ducoups

quand je lance mon menu l affichage des sondes se désactive, clear et écrie le menu


sauf que ma dernière actualisation de met sonde se termine en général après le clear se qui fait qu il écrit une dernière fois met température après le clear et avent le menu


Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 24, 2019, 09:10 pm
Tu peux ôter ces lignes du setup :
Code: [Select]
  lcd.setCursor(0, 0);
  lcd.print("Temp NID:");;
  lcd.setCursor(0, 1);
  lcd.print("Temp ADC:");
  delay(2000);


Ensuite, modifie Sondes comme suit :
Code: [Select]
void Sondes() {
  if (!afficherMenu) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp NID:");
    lcd.setCursor(0, 1);
    lcd.print("Temp ADC:");    mypr(tc_100(addr1),0);
    mypr(tc_100(addr2),1);
   } else if (digitalRead(HOME) == LOW) { /* Bouton Select */
      afficherMenu = false;
      Tempo = millis() + 750;
   }
}


Pourquoi as-tu déplacé ces lignes de boutons vers Sondes :
Code: [Select]
else if (digitalRead(HOME) == LOW) { /* Bouton Select */
      afficherMenu = false;
      Tempo = millis() + 750;
   }

Je pense qu'il faut les laisser dans boutons, avant le test de SELECT par exemple
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 12:55 am
le code actuel sans le clear dans sonde le home s'affiche bien mais quand je rentre dans le menu les température se r affiche et si je me déplace dans le menu tout est de nouveau normal

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds(10);  // on pin 10

byte addr1[8] = {0x28, 0xAA, 0x98, 0x12, 0x3C, 0x14, 0x01, 0xD7};
byte addr2[8] = {0x28, 0xAA, 0xC1, 0x91, 0x3B, 0x14, 0x01, 0x9A};
int SignBit = 0;
int StartCol = 8;

bool afficherMenu = false;
bool temperatureLimite = false;

int ventilo = 6;
int sonde = 7;
int relais = 1;
int Tmin = 20;
int Tmax= 25;
int Hmin = 20;
int Hmax = 25;
int heure = 1;
int minute = 1;

int unsigned Menu = 0;
int unsigned SousMenu = 0;

double Tempo = millis();
double Tempo2 = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int LEFT = A3;
int HOME = A4;



typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Info General "
  };
  NumMenu[11] = (TypeMenu) {
    "Temp Nid:" +String(Tmin)
  };
  NumMenu[12] = (TypeMenu) {
    "Temp ADC:" +String(Tmax)
  };
  NumMenu[13] = (TypeMenu) {
    "Humidite" +String(Tmax)
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temperature"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Min " +String(Tmin) + " c"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " +String(Tmax) + " c"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humidite"
  };
  NumMenu[31] = (TypeMenu) {
    "Humid Min " +String(Hmin) + "%"
  };
  NumMenu[32] = (TypeMenu) {
    "Humid Max " +String(Hmax) + "%"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "4.1 Reglage"
  };
  NumMenu[42] = (TypeMenu) {
    "4.2 Reglage heure"
  };
}



void setup() {
  pinMode(ventilo, OUTPUT);
  pinMode(sonde, OUTPUT);
  pinMode(relais, OUTPUT);

  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();

 
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(HOME, INPUT_PULLUP);
}



void loop() {
  Sondes();
  Regul();
  humi();
  heurefunc();
  bouton();
}

void bouton() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      lcd.clear();
      afficherMenu = true;  // <-- ici
      SousMenu++;
      Tempo = millis() + 250;
      AfficheMenu();
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      lcd.clear();
      afficherMenu = true;  // <-- ici
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      AfficheMenu();
    } else if (digitalRead(HOME) == LOW) { /* Bouton Select */
      afficherMenu = false;
      Tempo = millis() + 750;
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      lcd.clear();
      afficherMenu = true;  // <-- et ici
      Tempo = millis() + 750;
      switch (Menu + SousMenu) {
        
      case 21 :
          if(Tmin <= 29){
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if(Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
            NumMenu[22] = (TypeMenu) {
            "Temp Max " +String(Tmax) + " c"
          };
          }
          NumMenu[21] = (TypeMenu) {
          "Temp Min " +String(Tmin) + " c"
          };
          Serial.print("Tmin");
          Serial.println(Tmin);
          break;
    
      case 22 :
          if ((Tmax > Tmin)&&(Tmax <= 30)){
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
            NumMenu[21] = (TypeMenu) {
            "Temp Min " +String(Tmin) + " c"
          };
          }
          NumMenu[22] = (TypeMenu) {
          "Temp Max " +String(Tmax) + " c"
          };
          Serial.print("Tmax");
          Serial.println(Tmax);
          break;
        
      case 31 :
          if ((Hmax > Hmin)&&(Hmin <= 99)){
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if(Hmin >= Hmax) {
            Hmax = Hmin + 5;
            NumMenu[32] = (TypeMenu) {
            "Humid Max " +String(Hmax) + " %"
            };
            Serial.print("Hmax");
            Serial.println(Hmax);
          }
          NumMenu[31] = (TypeMenu) {
          "Humid Min " +String(Hmin) + " %"
          };
          Serial.print("Hmin");
          Serial.println(Hmin);
          break;

      case 32 :
          if ((Hmax > Hmin)&&(Hmax <= 99)){
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
            NumMenu[31] = (TypeMenu) {
            "Humid Min " +String(Hmin) + " %"
            };
          }
          NumMenu[32] = (TypeMenu) {
          "Humid Max " +String(Hmax) + " %"
          };
          Serial.print("Hmax");
          Serial.println(Hmax);
          break;

      case 41 :
          ;
      case 42 :
          ;
      }
      AfficheMenu();
    }
  }
}

void AfficheMenu() {
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 50 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }
}

void Regul() {
    if (test1 == 1) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temperature Mini");
      lcd.setCursor(0, 1);
      lcd.print(Hmin);
    }
}

void humi() {
    if (test2 > 0) {
    if ((digitalRead(test2)) == HIGH) {
      Serial.print("action on test2");
    }
    if ((digitalRead(test2)) == LOW) {
      Serial.print("action off test2");
    }
  }
}

void heurefunc() {
    if (test3 > 0) {
    if ((digitalRead(test3)) == HIGH) {
      Serial.print("action on test3");
    }
    if ((digitalRead(test3)) == LOW) {
      Serial.print("action off test3");
    }
  }
}



// sonde temperature




int tc_100(byte* addr){
  int HighByte, LowByte, TReading;
  byte data[12];
  byte i;

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end

  unsigned long chrono = millis();
    while (millis()-chrono < 1000ul) {
    // lecture des boutons et traitement si menu
    bouton();
    }

  ds.reset();
  ds.select(addr);  
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }

  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  return (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
}

void mypr(int Tc_100, int line) {
  int Whole, Fract;

  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  if (SignBit) // If its negative
  {
     lcd.setCursor(StartCol,line);
     lcd.print("-");
  }
  lcd.setCursor(StartCol+1,line);
  lcd.print(Whole);
  lcd.print(".");
  if (Fract < 10)
  {
     lcd.print("0");
  }
  lcd.print(Fract);
  lcd.print("C");
}

void Sondes() {
  if (!afficherMenu) {
    lcd.setCursor(0, 0);
    lcd.print("Temp NID:");
    lcd.setCursor(0, 1);
    lcd.print("Temp ADC:");
    mypr(tc_100(addr1),0);
    mypr(tc_100(addr2),1);
      }
}



(https://cdn.discordapp.com/attachments/412535649787183105/570743572173684740/JPEG_20190425_004940.jpg)




avec le lcd.clear() je n 'est que la température du haut qui affiche et elle clignote

Code: [Select]
void Sondes() {
  if (!afficherMenu) {
    lcd.clear()
    lcd.setCursor(0, 0);
    lcd.print("Temp NID:");
    lcd.setCursor(0, 1);
    lcd.print("Temp ADC:");
    mypr(tc_100(addr1),0);
    mypr(tc_100(addr2),1);
      }
}


(https://cdn.discordapp.com/attachments/412535649787183105/570743572173684736/JPEG_20190425_005049.jpg)
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 25, 2019, 08:44 am
Essaye d'ajouter
Code: [Select]
if (!afficherMenu) return;
après
Code: [Select]
void AfficheMenu() {

Pour la température qui clignote, je pense que c'est dû au lcd.clear dans Sondes. Comme cette fonction est appelée très souvent, elle efface l'écran et affiche sans cesse. De plus il y a une temporisation d'une seconde à chaque lecture.

Il faut modifier la lecture des sondes pour les lire toutes les deux en même temps. Mais je ne comprends pas comment tu peux avoir 2 sondes alors que tu n'en déclares qu'une seule :
Code: [Select]
// DS18S20 Temperature chip i/o
OneWire ds(10);  // on pin 10

Où est branchée l'autre ?
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 08:55 am
je teste sa pour mes sonde elle sont sur le même pin car elle on chacune leur propre id

je c pas si j ai le droit de partager le lien du tuto ici car il ne vient pas de se site ?

 
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 09:01 am
n hésite pas a me faire faire des modif de code si je peux apprendre d autre truc au passage et en comprendre d autre pas de soucie,
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 25, 2019, 09:32 am
Est-il possible de connecter les 2 sondes sur 2 pins différentes ?
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 09:39 am
je pense pour les sonde je v voir et jte redit il faut que je test je v voir


sinon j ai mis des print un peux partout et voila se qui se passe dans la console quand j affiche mon menu

Code: [Select]
2081
2075
2081
2075
2081
2075
afficherMenu = true
clear du lcd
Menu afficher
2081
2081




le code avec les Print

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds(10);  // on pin 10

byte addr1[8] = {0x28, 0xAA, 0x98, 0x12, 0x3C, 0x14, 0x01, 0xD7};
byte addr2[8] = {0x28, 0xAA, 0xC1, 0x91, 0x3B, 0x14, 0x01, 0x9A};
int SignBit = 0;
int StartCol = 8;

bool afficherMenu = false;
bool temperatureLimite = false;

int ventilo = 6;
int sonde = 7;
int relais = 1;
int Tmin = 20;
int Tmax= 25;
int Hmin = 20;
int Hmax = 25;
int heure = 1;
int minute = 1;

int unsigned Menu = 0;
int unsigned SousMenu = 0;

double Tempo = millis();
double Tempo2 = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int LEFT = A3;
int HOME = A4;



typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Info General "
  };
  NumMenu[11] = (TypeMenu) {
    "Temp Nid:" +String(Tmin)
  };
  NumMenu[12] = (TypeMenu) {
    "Temp ADC:" +String(Tmax)
  };
  NumMenu[13] = (TypeMenu) {
    "Humidite" +String(Tmax)
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temperature"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Min " +String(Tmin) + " c"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " +String(Tmax) + " c"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humidite"
  };
  NumMenu[31] = (TypeMenu) {
    "Humid Min " +String(Hmin) + "%"
  };
  NumMenu[32] = (TypeMenu) {
    "Humid Max " +String(Hmax) + "%"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "4.1 Reglage"
  };
  NumMenu[42] = (TypeMenu) {
    "4.2 Reglage heure"
  };
}



void setup() {
  pinMode(ventilo, OUTPUT);
  pinMode(sonde, OUTPUT);
  pinMode(relais, OUTPUT);

  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();

 
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(HOME, INPUT_PULLUP);
}



void loop() {
  Sondes();
  Regul();
  humi();
  heurefunc();
  bouton();
}

void bouton() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      afficherMenu = true;  // <-- ici
      Serial.println("afficherMenu = true");
      SousMenu++;
      Tempo = millis() + 250;
      lcd.clear();
      Serial.println("clear du lcd");
      AfficheMenu();
      Serial.println("Menu afficher");
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      afficherMenu = true;  // <-- ici
      Serial.println("afficherMenu = true");
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      lcd.clear();
      Serial.println("clear du lcd");
      AfficheMenu();
      Serial.println("Menu afficher");
    } else if (digitalRead(HOME) == LOW) { /* Bouton Select */
      afficherMenu = false;
      Tempo = millis() + 750;
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      afficherMenu = true;  // <-- et ici
      Tempo = millis() + 750;
      lcd.clear();
      switch (Menu + SousMenu) {
        
      case 21 :
          if(Tmin <= 29){
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if(Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
            NumMenu[22] = (TypeMenu) {
            "Temp Max " +String(Tmax) + " c"
          };
          }
          NumMenu[21] = (TypeMenu) {
          "Temp Min " +String(Tmin) + " c"
          };
          Serial.print("Tmin");
          Serial.println(Tmin);
          break;
    
      case 22 :
          if ((Tmax > Tmin)&&(Tmax <= 30)){
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
            NumMenu[21] = (TypeMenu) {
            "Temp Min " +String(Tmin) + " c"
          };
          }
          NumMenu[22] = (TypeMenu) {
          "Temp Max " +String(Tmax) + " c"
          };
          Serial.print("Tmax");
          Serial.println(Tmax);
          break;
        
      case 31 :
          if ((Hmax > Hmin)&&(Hmin <= 99)){
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if(Hmin >= Hmax) {
            Hmax = Hmin + 5;
            NumMenu[32] = (TypeMenu) {
            "Humid Max " +String(Hmax) + " %"
            };
            Serial.print("Hmax");
            Serial.println(Hmax);
          }
          NumMenu[31] = (TypeMenu) {
          "Humid Min " +String(Hmin) + " %"
          };
          Serial.print("Hmin");
          Serial.println(Hmin);
          break;

      case 32 :
          if ((Hmax > Hmin)&&(Hmax <= 99)){
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
            NumMenu[31] = (TypeMenu) {
            "Humid Min " +String(Hmin) + " %"
            };
          }
          NumMenu[32] = (TypeMenu) {
          "Humid Max " +String(Hmax) + " %"
          };
          Serial.print("Hmax");
          Serial.println(Hmax);
          break;

      case 41 :
          ;
      case 42 :
          ;
      }
      AfficheMenu();
    }
  }
}

void AfficheMenu() {
  if (!afficherMenu) return;
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 50 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }
}

void Regul() {
    if (test1 == 1) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temperature Mini");
      lcd.setCursor(0, 1);
      lcd.print(Hmin);
    }
}

void humi() {
    if (test2 > 0) {
    if ((digitalRead(test2)) == HIGH) {
      Serial.print("action on test2");
    }
    if ((digitalRead(test2)) == LOW) {
      Serial.print("action off test2");
    }
  }
}

void heurefunc() {
    if (test3 > 0) {
    if ((digitalRead(test3)) == HIGH) {
      Serial.print("action on test3");
    }
    if ((digitalRead(test3)) == LOW) {
      Serial.print("action off test3");
    }
  }
}



// sonde temperature




int tc_100(byte* addr){
  int HighByte, LowByte, TReading;
  byte data[12];
  byte i;

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end

  unsigned long chrono = millis();
    while (millis()-chrono < 1000ul) {
    // lecture des boutons et traitement si menu
    bouton();
    }

  ds.reset();
  ds.select(addr);  
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }

  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  return (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
}

void mypr(int Tc_100, int line) {
  int Whole, Fract;

  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  if (SignBit) // If its negative
  {
     lcd.setCursor(StartCol,line);
     lcd.print("-");
  }
  lcd.setCursor(StartCol+1,line);
  lcd.print(Whole);
  lcd.print(".");
  if (Fract < 10)
  {
     lcd.print("0");
  }
  lcd.print(Fract);
  lcd.print("C");
}

void Sondes() {
  if (!afficherMenu) {
    lcd.setCursor(0, 0);
    lcd.print("Temp NID:");
    lcd.setCursor(0, 1);
    lcd.print("Temp ADC:");
    mypr(tc_100(addr1),0);
    mypr(tc_100(addr2),1);
    Serial.println(tc_100(addr1));
    Serial.println(tc_100(addr2));
      }
}



un autre test dans ma console

Code: [Select]
sonde 1 = 2081
sonde 2 = 2081
sonde 1 = 2081
sonde 2 = 2081
sonde 1 = 2081
sonde 2 = 2081
sonde 1 = afficherMenu = true
clear du lcd
Menu afficher
2081
sonde 2 = 2081


Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 25, 2019, 11:49 am
Ici
Code: [Select]
    mypr(tc_100(addr1),0);
    mypr(tc_100(addr2),1);
    Serial.println(tc_100(addr1));
    Serial.println(tc_100(addr2));

chaque lecture prend 1 seconde et tu en fais 4 dont 2 uniquement pour afficher les valeurs. Fais plutôt :
Code: [Select]
    int temp1 = tc_100(addr1);
    int temp2 = tc_100(addr2);
    mypr(temp1,0);
    mypr(temp2,1);
    Serial.println(temp1);
    Serial.println(temp2);


Si on peut brancher les 2 sondes sur 2 pins différentes, alors on pourra déclarer 2 instances différentes avec 2 noms différents. On fera alors la lecture en parallèle et on aura juste besoin d'attendre 1 seconde pour faire les 2 lectures. ça gagnera un peu en rapidité.
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 12:54 pm
sa marche !!!!!!!! :)  :)  :)  :) je v faire plein de teste pour voir si sa déconne pas 1 fois sur 30 mais la sa marche

j ai mis le bout de code que tu ma passer et j'ai test de mettre les variables

Code: [Select]
int temp1 = tc_100(addr1);
  int temp2 = tc_100(addr2);




avent

Code: [Select]
void Sondes() {
  int temp1 = tc_100(addr1);
  int temp2 = tc_100(addr2);
  if (!afficherMenu) {
    mypr(temp1,0);
    Serial.print("sonde 1 = ");
    Serial.println(temp1);
    mypr(temp2,1);
    Serial.print("sonde 1 = ");
    Serial.println(temp2);
      }
}


j'ai déplacer aussi l affichage de

Code: [Select]
 lcd.setCursor(0, 0);
  lcd.print("Temp NID:");
  lcd.setCursor(0, 1);
  lcd.print("Temp ADC:");



dans

Code: [Select]
void mypr(int Tc_100, int line) {
  
  int Whole, Fract;
  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;
  lcd.setCursor(0, 0);
  lcd.print("Temp NID:");
  lcd.setCursor(0, 1);
  lcd.print("Temp ADC:");
  if (SignBit) // If its negative
  {
     lcd.setCursor(StartCol,line);
     lcd.print("-");
  }
  lcd.setCursor(StartCol+1,line);
  lcd.print(Whole);
  lcd.print(".");
  if (Fract < 10)
  {
     lcd.print("0");
  }
  lcd.print(Fract);
  lcd.print("C");
}


Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 01:07 pm
T un génie t imagine même pas comment tu ma fait avancer en deux jour sur mon projet !!! merci pour ta patience et ton envie d aider

mais j'ai encore plein d autre question mon projet est loin d être complet

d ailleurs je vient de test d afficher les print suivant dans mon void régule et j ai du redéclarer mais variable dedans

int temp1 = tc_100(addr1);
 int temp2 = tc_100(addr2);

j'ai donc essayer de les mettre dans l entête  et  il n en veut pas non-plus je peux les écrire où ou comment pour quelle soit repris dans tout mes Void
Title: Re: besoin d'aide pour un menu,
Post by: dbrion06 on Apr 25, 2019, 01:32 pm
Vous faites deux variables communes à tout le monde ("globales"), avant toute déclaration de fonction;
int temp1 , temp2;

et, sans les redéclarer
temp1 = tc_100(addr1);
temp2 = tc_100(addr2);
les mettra à jour....
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 25, 2019, 02:09 pm
Si on peut brancher les 2 sondes sur 2 pins différentes, alors on pourra déclarer 2 instances différentes avec 2 noms différents. On fera alors la lecture en parallèle et on aura juste besoin d'attendre 1 seconde pour faire les 2 lectures. ça gagnera un peu en rapidité.
Je pense vraiment que tu devrais tester ça aussi, je t'aiderai à faire la lecture parallèle ensuite.
Teste avec un code simple (je n'ai pas vérifié... : s'il y a des erreurs de compilation, copie l'ensemble des erreurs dans ta réponse) :
Code: [Select]

#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds1(10);  // on pin 10
OneWire ds2(11);  // on pin 11

byte addr1[8] = {0x28, 0xAA, 0x98, 0x12, 0x3C, 0x14, 0x01, 0xD7};
byte addr2[8] = {0x28, 0xAA, 0xC1, 0x91, 0x3B, 0x14, 0x01, 0x9A};

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

void loop() {
  int temp1 = tc_101();
  int temp2 = tc_102();
  Serial.print (temp1);
  Serial.print ("\t");
  Serial.println (temp2);
}

int tc_101(){
  byte HighByte, LowByte;
  int TReading;
  byte data[12]={0};

  ds1.reset();
  ds1.select(addr1);
  ds1.write(0x44,1);         // start conversion, with parasite power on at the end
  delay(1000);
  ds1.reset();
  ds1.select(addr1); 
  ds1.write(0xBE);         // Read Scratchpad

  for (byte i = 0; i < 9; i++) data[i] = ds1.read();
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  int SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp
  return (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
}

int tc_102(){
  byte HighByte, LowByte;
  int TReading;
  byte data[12] = {0};

  ds2.reset();
  ds2.select(addr2);
  ds2.write(0x44,1);         // start conversion, with parasite power on at the end
  delay(1000);
  ds2.reset();
  ds2.select(addr2); 
  ds2.write(0xBE);         // Read Scratchpad

  for (byte i = 0; i < 9; i++) data[i] = ds2.read();
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  int SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp
  return (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
}


C'est bizarre ce code de lecture : il lit 9 bytes (tableau data) d'un tableau de dimension 12 et il n'en utilise que 2 !!! Tu l'as trouvé où...?
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 03:48 pm
j ai utilisé se tuto pour mes sonde car je n arrivé a en lire deux et les dissocier

mais c pas le seul a faire sa

https://www.dekloo.net/arduino-raspberry/arduino-capteurs-de-temperature-ds18s20/1020

d après se que j ai vu sur plusieurs tuto la sonde doit se lire en 12 bytes par défaut et apparemment en l interprètent en 8bytes on gagne du temps et cela permet de lire plusieurs sonde (un truc du genre, mais la sa dépasse mais compétence actuel)
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 04:02 pm
ton code marche il m'affiche bien les température
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 04:37 pm
j ai mixé ton code et le menu

la page principal avec les sonde s affiche nikel par contre ma température n'est pas écrite 23.56 mais 2356 sans .

par contre j ai du faire une coquille quelque part car mon menu ne se lance pas


Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds1(10);  // on pin 10
OneWire ds2(9);  // on pin 11

byte addr1[8] = {0x28, 0xAA, 0x98, 0x12, 0x3C, 0x14, 0x01, 0xD7};
byte addr2[8] = {0x28, 0xAA, 0xC1, 0x91, 0x3B, 0x14, 0x01, 0x9A};

bool afficherMenu = false;
bool temperatureLimite = false;

int ventilo = 6;
int relais = 1;
int Tmin = 20;
int Tmax= 25;
int Hmin = 20;
int Hmax = 25;
int heure = 1;
int minute = 1;

int unsigned Menu = 0;
int unsigned SousMenu = 0;

double Tempo = millis();
double Tempo2 = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int LEFT = A3;
int HOME = A4;



typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Info General "
  };
  NumMenu[11] = (TypeMenu) {
    "Temp Nid:" +String(Tmin)
  };
  NumMenu[12] = (TypeMenu) {
    "Temp ADC:" +String(Tmax)
  };
  NumMenu[13] = (TypeMenu) {
    "Humidite" +String(Tmax)
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temperature"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Min " +String(Tmin) + " c"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " +String(Tmax) + " c"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humidite"
  };
  NumMenu[31] = (TypeMenu) {
    "Humid Min " +String(Hmin) + "%"
  };
  NumMenu[32] = (TypeMenu) {
    "Humid Max " +String(Hmax) + "%"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "4.1 Reglage"
  };
  NumMenu[42] = (TypeMenu) {
    "4.2 Reglage heure"
  };
}



void setup() {
  pinMode(ventilo, OUTPUT);
  pinMode(relais, OUTPUT);

  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();

 
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(HOME, INPUT_PULLUP);
}



void loop() {
  Sondes();
  Regul();
  humi();
  heurefunc();
  bouton();
}

void bouton() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      afficherMenu = true;  // <-- ici
      Serial.println("afficherMenu = true");
      SousMenu++;
      Tempo = millis() + 250;
      lcd.clear();
      Serial.println("clear du lcd");
      AfficheMenu();
      Serial.println("Menu afficher");
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      afficherMenu = true;  // <-- ici
      Serial.println("afficherMenu = true");
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      lcd.clear();
      Serial.println("clear du lcd");
      AfficheMenu();
      Serial.println("Menu afficher");
    } else if (digitalRead(HOME) == LOW) { /* Bouton Select */
      afficherMenu = false;
      Tempo = millis() + 750;
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      afficherMenu = true;  // <-- et ici
      Tempo = millis() + 750;
      lcd.clear();
      switch (Menu + SousMenu) {
       
      case 21 :
          if(Tmin <= 29){
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if(Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
            NumMenu[22] = (TypeMenu) {
            "Temp Max " +String(Tmax) + " c"
          };
          }
          NumMenu[21] = (TypeMenu) {
          "Temp Min " +String(Tmin) + " c"
          };
          Serial.print("Tmin");
          Serial.println(Tmin);
          break;
   
      case 22 :
          if ((Tmax > Tmin)&&(Tmax <= 30)){
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
            NumMenu[21] = (TypeMenu) {
            "Temp Min " +String(Tmin) + " c"
          };
          }
          NumMenu[22] = (TypeMenu) {
          "Temp Max " +String(Tmax) + " c"
          };
          Serial.print("Tmax");
          Serial.println(Tmax);
          break;
       
      case 31 :
          if ((Hmax > Hmin)&&(Hmin <= 99)){
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if(Hmin >= Hmax) {
            Hmax = Hmin + 5;
            NumMenu[32] = (TypeMenu) {
            "Humid Max " +String(Hmax) + " %"
            };
            Serial.print("Hmax");
            Serial.println(Hmax);
          }
          NumMenu[31] = (TypeMenu) {
          "Humid Min " +String(Hmin) + " %"
          };
          Serial.print("Hmin");
          Serial.println(Hmin);
          break;

      case 32 :
          if ((Hmax > Hmin)&&(Hmax <= 99)){
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
            NumMenu[31] = (TypeMenu) {
            "Humid Min " +String(Hmin) + " %"
            };
          }
          NumMenu[32] = (TypeMenu) {
          "Humid Max " +String(Hmax) + " %"
          };
          Serial.print("Hmax");
          Serial.println(Hmax);
          break;

      case 41 :
          ;
      case 42 :
          ;
      }
      AfficheMenu();
    }
  }
}

void AfficheMenu() {
  if (!afficherMenu) return;
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 50 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }
}

void Regul() {
  int temp1 = tc_101();
  int temp2 = tc_102();
    Serial.print("sonde test 1 = ");
    Serial.println(temp1);
    Serial.print("sonde test 2 = ");
    Serial.println(temp2);
}

void humi() {
    if (test2 > 0) {
    if ((digitalRead(test2)) == HIGH) {
      Serial.print("action on test2");
    }
    if ((digitalRead(test2)) == LOW) {
      Serial.print("action off test2");
    }
  }
}

void heurefunc() {
    if (test3 > 0) {
    if ((digitalRead(test3)) == HIGH) {
      Serial.print("action on test3");
    }
    if ((digitalRead(test3)) == LOW) {
      Serial.print("action off test3");
    }
  }
}



// sonde temperature



void Sondes() {
  int temp1 = tc_101();
  int temp2 = tc_102();
  if (!afficherMenu) {
    lcd.setCursor(0, 0);
    lcd.print("Temp NID:");
    lcd.print (temp1);
    lcd.print (" ");
    lcd.print ('\xDF');
    lcd.print ("C");
    lcd.setCursor(0, 1);
    lcd.print("Temp ADC:");
    lcd.print (temp2);
    lcd.print (" ");
    lcd.print ('\xDF');
    lcd.print ("C");
    Serial.print("sonde 1 = ");
    Serial.println(temp1);
    Serial.print("sonde 2 = ");
    Serial.println(temp2);
      }
}

int tc_101(){
  byte HighByte, LowByte;
  int TReading;
  byte data[12]={0};

  ds1.reset();
  ds1.select(addr1);
  ds1.write(0x44,1);         // start conversion, with parasite power on at the end
  delay(1000);
  ds1.reset();
  ds1.select(addr1);
  ds1.write(0xBE);         // Read Scratchpad

  for (byte i = 0; i < 9; i++) data[i] = ds1.read();
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  int SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp
  return (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
}

int tc_102(){
  byte HighByte, LowByte;
  int TReading;
  byte data[12] = {0};

  ds2.reset();
  ds2.select(addr2);
  ds2.write(0x44,1);         // start conversion, with parasite power on at the end
  delay(1000);
  ds2.reset();
  ds2.select(addr2);
  ds2.write(0xBE);         // Read Scratchpad

  for (byte i = 0; i < 9; i++) data[i] = ds2.read();
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  int SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp
  return (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
}
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 25, 2019, 05:00 pm
C'est normal, le code était juste là pour tester les 2 sondes sur 2 pins différentes. Je vais te proposer une nouvelle fonction pour lire les 2 sondes en même temps.
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 05:04 pm
ah !!! ok j 'attend mais au moin ton code et plus compréhensible dans les details pour mon lvl
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 25, 2019, 05:11 pm
Voilou !  :)

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds1(10);  // on pin 10
OneWire ds2(9);   // on pin  9

byte addr1[8] = {0x28, 0xAA, 0x98, 0x12, 0x3C, 0x14, 0x01, 0xD7};
byte addr2[8] = {0x28, 0xAA, 0xC1, 0x91, 0x3B, 0x14, 0x01, 0x9A};

bool afficherMenu = false;
bool temperatureLimite = false;

int ventilo = 6;
int relais = 1;
int Tmin = 20;
int Tmax = 25;
int Hmin = 20;
int Hmax = 25;
int heure = 1;
int minute = 1;
int temp1 = 0;
int temp2 = 0;

int unsigned Menu = 0;
int unsigned SousMenu = 0;

unsigned long Tempo = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int LEFT = A3;
int HOME = A4;



typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Info General "
  };
  NumMenu[11] = (TypeMenu) {
    "Temp Nid:" + String(Tmin)
  };
  NumMenu[12] = (TypeMenu) {
    "Temp ADC:" + String(Tmax)
  };
  NumMenu[13] = (TypeMenu) {
    "Humidite" + String(Tmax)
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temperature"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Min " + String(Tmin) + " c"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " + String(Tmax) + " c"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humidite"
  };
  NumMenu[31] = (TypeMenu) {
    "Humid Min " + String(Hmin) + "%"
  };
  NumMenu[32] = (TypeMenu) {
    "Humid Max " + String(Hmax) + "%"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "4.1 Reglage"
  };
  NumMenu[42] = (TypeMenu) {
    "4.2 Reglage heure"
  };
}



void setup() {
  pinMode(ventilo, OUTPUT);
  pinMode(relais, OUTPUT);
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(HOME, INPUT_PULLUP);

  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();
  Tempo = millis();
}



void loop() {
  Sondes();
  Regul();
  humi();
  heurefunc();
  bouton();
}

void bouton() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      afficherMenu = true;
      Serial.println("afficherMenu = true");
      SousMenu++;
      Tempo = millis() + 250;
      lcd.clear();
      Serial.println("clear du lcd");
      AfficheMenu();
      Serial.println("Menu afficher");
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      afficherMenu = true;
      Serial.println("afficherMenu = true");
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      lcd.clear();
      Serial.println("clear du lcd");
      AfficheMenu();
      Serial.println("Menu afficher");
    } else if (digitalRead(HOME) == LOW) { /* Bouton Select */
      afficherMenu = false;
      Tempo = millis() + 750;
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      afficherMenu = true;
      Tempo = millis() + 750;
      lcd.clear();
      switch (Menu + SousMenu) {

        case 21 :
          if (Tmin <= 29) {
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if (Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
            NumMenu[22] = (TypeMenu) {
              "Temp Max " + String(Tmax) + " c"
            };
          }
          NumMenu[21] = (TypeMenu) {
            "Temp Min " + String(Tmin) + " c"
          };
          Serial.print("Tmin");
          Serial.println(Tmin);
          break;

        case 22 :
          if ((Tmax > Tmin) && (Tmax <= 30)) {
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
            NumMenu[21] = (TypeMenu) {
              "Temp Min " + String(Tmin) + " c"
            };
          }
          NumMenu[22] = (TypeMenu) {
            "Temp Max " + String(Tmax) + " c"
          };
          Serial.print("Tmax");
          Serial.println(Tmax);
          break;

        case 31 :
          if ((Hmax > Hmin) && (Hmin <= 99)) {
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if (Hmin >= Hmax) {
            Hmax = Hmin + 5;
            NumMenu[32] = (TypeMenu) {
              "Humid Max " + String(Hmax) + " %"
            };
            Serial.print("Hmax");
            Serial.println(Hmax);
          }
          NumMenu[31] = (TypeMenu) {
            "Humid Min " + String(Hmin) + " %"
          };
          Serial.print("Hmin");
          Serial.println(Hmin);
          break;

        case 32 :
          if ((Hmax > Hmin) && (Hmax <= 99)) {
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
            NumMenu[31] = (TypeMenu) {
              "Humid Min " + String(Hmin) + " %"
            };
          }
          NumMenu[32] = (TypeMenu) {
            "Humid Max " + String(Hmax) + " %"
          };
          Serial.print("Hmax");
          Serial.println(Hmax);
          break;

        case 41 :
          ;
        case 42 :
          ;
      }
      AfficheMenu();
    }
  }
}

void AfficheMenu() {
  if (!afficherMenu) return;
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 50 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }
}

void Regul() {
  tc_100();
  Serial.print("sonde test 1 = ");
  Serial.println(temp1);
  Serial.print("sonde test 2 = ");
  Serial.println(temp2);
}

void humi() {
  if (test2 > 0) {
    if ((digitalRead(test2)) == HIGH) {
      Serial.print("action on test2");
    }
    if ((digitalRead(test2)) == LOW) {
      Serial.print("action off test2");
    }
  }
}

void heurefunc() {
  if (test3 > 0) {
    if ((digitalRead(test3)) == HIGH) {
      Serial.print("action on test3");
    }
    if ((digitalRead(test3)) == LOW) {
      Serial.print("action off test3");
    }
  }
}

void Sondes() {
  tc_100();
  if (!afficherMenu) {
    lcd.setCursor(0, 0);
    lcd.print("Temp NID:");
    lcd.print (temp1);
    lcd.print (" ");
    lcd.print ('\xDF');
    lcd.print ("C");
    lcd.setCursor(0, 1);
    lcd.print("Temp ADC:");
    lcd.print (temp2);
    lcd.print (" ");
    lcd.print ('\xDF');
    lcd.print ("C");
    Serial.print("sonde 1 = ");
    Serial.println(temp1);
    Serial.print("sonde 2 = ");
    Serial.println(temp2);
  }
}

int tc_100() {
  byte HighByte, LowByte;
  int TReading, SignBit;
  byte data[12] = {0};

  ds1.reset();
  ds1.select(addr1);
  ds1.write(0x44, 1);
  ds2.reset();
  ds2.select(addr2);
  ds2.write(0x44, 1);
  delay(1000);  //  <-- une seule attente pour deux mesures !!!
  ds1.reset();
  ds1.select(addr1);
  ds1.write(0xBE);
  ds2.reset();
  ds2.select(addr2);
  ds2.write(0xBE);

  for (byte i = 0; i < 9; i++) data[i] = ds1.read();
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp
  temp1 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

  for (byte i = 0; i < 9; i++) data[i] = ds2.read();
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp
  temp2 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
}


Si c'est toi qui m'augmente mon karma : merci !!
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 05:45 pm
pour le karma ouep c moi c'est la moindre des chose et jte payerai bien une bière également si je pouvez ^^


sinon pour ton code je les ajouter a la page d accueil s affiche bien mais j 'ai pas de virgule a ma température mais sinon c bon

par contre le menu ne répond pas sa reste sur la page d'accueil  
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 25, 2019, 06:12 pm
Nouvelle version avec la virgule et qq petites corrections :

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds1(10);  // on pin 10
OneWire ds2(9);   // on pin  9

byte addr1[8] = {0x28, 0xAA, 0x98, 0x12, 0x3C, 0x14, 0x01, 0xD7};
byte addr2[8] = {0x28, 0xAA, 0xC1, 0x91, 0x3B, 0x14, 0x01, 0x9A};
int SignBit = 0;
int StartCol = 8;

bool afficherMenu = false;
bool temperatureLimite = false;

int ventilo = 6;
int relais = 1;
int Tmin = 20;
int Tmax = 25;
int Hmin = 20;
int Hmax = 25;
int heure = 1;
int minute = 1;
int temp1 = 0;
int temp2 = 0;

unsigned int Menu = 0;
unsigned int SousMenu = 0;
unsigned long Tempo = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int LEFT = A3;
int HOME = A4;

typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Info General "
  };
  NumMenu[11] = (TypeMenu) {
    "Temp Nid:" + String(Tmin)
  };
  NumMenu[12] = (TypeMenu) {
    "Temp ADC:" + String(Tmax)
  };
  NumMenu[13] = (TypeMenu) {
    "Humidite" + String(Tmax)
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temperature"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Min " + String(Tmin) + " c"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " + String(Tmax) + " c"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humidite"
  };
  NumMenu[31] = (TypeMenu) {
    "Humid Min " + String(Hmin) + "%"
  };
  NumMenu[32] = (TypeMenu) {
    "Humid Max " + String(Hmax) + "%"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "4.1 Reglage"
  };
  NumMenu[42] = (TypeMenu) {
    "4.2 Reglage heure"
  };
}

void setup() {
  pinMode(ventilo, OUTPUT);
  pinMode(relais, OUTPUT);
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(HOME, INPUT_PULLUP);

  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();
  Tempo = millis();
}

void loop() {
  Sondes();
  Regul();
  humi();
  heurefunc();
  bouton();
}

void bouton() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      delay(30);
      afficherMenu = true;
      Serial.println("afficherMenu = true");
      SousMenu++;
      Tempo = millis() + 250;
      lcd.clear();
      Serial.println("clear du lcd");
      AfficheMenu();
      Serial.println("Menu afficher");
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      delay(30);
      afficherMenu = true;
      Serial.println("afficherMenu = true");
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      lcd.clear();
      Serial.println("clear du lcd");
      AfficheMenu();
      Serial.println("Menu afficher");
    } else if (digitalRead(HOME) == LOW) { /* Bouton Select */
      delay(30);
      afficherMenu = false;
      Tempo = millis() + 750;
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      delay(30);
      afficherMenu = true;
      Tempo = millis() + 750;
      lcd.clear();
      switch (Menu + SousMenu) {

        case 21 :
          if (Tmin <= 29) {
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if (Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
            NumMenu[22] = (TypeMenu) {
              "Temp Max " + String(Tmax) + " c"
            };
          }
          NumMenu[21] = (TypeMenu) {
            "Temp Min " + String(Tmin) + " c"
          };
          Serial.print("Tmin");
          Serial.println(Tmin);
          break;

        case 22 :
          if ((Tmax > Tmin) && (Tmax <= 30)) {
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
            NumMenu[21] = (TypeMenu) {
              "Temp Min " + String(Tmin) + " c"
            };
          }
          NumMenu[22] = (TypeMenu) {
            "Temp Max " + String(Tmax) + " c"
          };
          Serial.print("Tmax");
          Serial.println(Tmax);
          break;

        case 31 :
          if ((Hmax > Hmin) && (Hmin <= 99)) {
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if (Hmin >= Hmax) {
            Hmax = Hmin + 5;
            NumMenu[32] = (TypeMenu) {
              "Humid Max " + String(Hmax) + " %"
            };
            Serial.print("Hmax");
            Serial.println(Hmax);
          }
          NumMenu[31] = (TypeMenu) {
            "Humid Min " + String(Hmin) + " %"
          };
          Serial.print("Hmin");
          Serial.println(Hmin);
          break;

        case 32 :
          if ((Hmax > Hmin) && (Hmax <= 99)) {
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
            NumMenu[31] = (TypeMenu) {
              "Humid Min " + String(Hmin) + " %"
            };
          }
          NumMenu[32] = (TypeMenu) {
            "Humid Max " + String(Hmax) + " %"
          };
          Serial.print("Hmax");
          Serial.println(Hmax);
          break;

        case 41 :
          ;
        case 42 :
          ;
      }
      AfficheMenu();
    }
  }
}

void AfficheMenu() {
  if (!afficherMenu) return;
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 50 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }
}

void Regul() {
  tc_100();
  Serial.print("sonde test 1 = ");
  Serial.println(temp1);
  Serial.print("sonde test 2 = ");
  Serial.println(temp2);
}

void humi() {
  if (test2 > 0) {
    if ((digitalRead(test2)) == HIGH) {
      Serial.print("action on test2");
    }
    if ((digitalRead(test2)) == LOW) {
      Serial.print("action off test2");
    }
  }
}

void heurefunc() {
  if (test3 > 0) {
    if ((digitalRead(test3)) == HIGH) {
      Serial.print("action on test3");
    }
    if ((digitalRead(test3)) == LOW) {
      Serial.print("action off test3");
    }
  }
}

void Sondes() {
  tc_100();
  if (!afficherMenu) {
    lcd.setCursor(0, 0);
    lcd.print("Temp NID:");
    mypr (temp1, 0);
    lcd.print (" ");
    lcd.print ('\xDF');
    lcd.print ("C");
    lcd.setCursor(0, 1);
    lcd.print("Temp ADC:");
    mypr (temp2, 1);
    lcd.print (" ");
    lcd.print ('\xDF');
    lcd.print ("C");
    Serial.print("sonde 1 = ");
    Serial.println(temp1);
    Serial.print("sonde 2 = ");
    Serial.println(temp2);
  }
}

void tc_100() {
  byte HighByte, LowByte;
  int TReading, SignBit;
  byte data[12] = {0};

  ds1.reset();
  ds1.select(addr1);
  ds1.write(0x44, 1);
  ds2.reset();
  ds2.select(addr2);
  ds2.write(0x44, 1);
  delay(1000);  //  <-- une seule attente pour deux mesures !!!
  ds1.reset();
  ds1.select(addr1);
  ds1.write(0xBE);
  ds2.reset();
  ds2.select(addr2);
  ds2.write(0xBE);

  for (byte i = 0; i < 9; i++) data[i] = ds1.read();
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp
  temp1 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

  for (byte i = 0; i < 9; i++) data[i] = ds2.read();
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp
  temp2 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
}

void mypr(int Tc_100, int line) {
  int Whole, Fract;
  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  if (SignBit) // If its negative
  {
     lcd.setCursor(StartCol,line);
     lcd.print("-");
  }
  lcd.setCursor(StartCol+1,line);
  lcd.print(Whole);
  lcd.print(".");
  if (Fract < 10)
  {
     lcd.print("0");
  }
  lcd.print(Fract);
}


Qu'appelles-tu la page d'accueil ? Que vois-tu lorsque tu appuies sur les boutons ? (indique moi les boutons et ce qui s'affiche)
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 07:01 pm
ma page d accueil

(https://cdn.discordapp.com/attachments/412535649787183105/571016409631686807/JPEG_20190425_185459.jpg)

mon menu

(https://cdn.discordapp.com/attachments/412535649787183105/571016410113900544/JPEG_20190425_185424.jpg)

en faite on a récupérer le soucie d hier quand j appuis pour afficher le menu le délais et long et je doit appuyer plusieurs fois pour l'afficher et la navigation dans le menu et également long pour le retour c pareille

sinon l accueil c parfait

peut tu regarder ce code c le tient mais j'ai rajouter la parti regul. bon sa marche mais je pense que se n est pas la bonne pratique et on doit pouvoir faire plus simple et propre

trop de caractère je poste le code dans 5 min^^
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 07:08 pm
partie 1 il est trop long le reste a nouveau dans 5 min^^

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#include <OneWire.h>

// DS18S20 Temperature
OneWire ds1(10);  // on pin 10
OneWire ds2(9);   // on pin  9

byte addr1[8] = {0x28, 0xAA, 0x98, 0x12, 0x3C, 0x14, 0x01, 0xD7};
byte addr2[8] = {0x28, 0xAA, 0xC1, 0x91, 0x3B, 0x14, 0x01, 0x9A};
int SignBit = 0;
int StartCol = 8;

bool afficherMenu = false;
bool temperatureLimite = false;

const char ventilo1 = 6;
const char ventilo2 = 7;

int ventilo = 6;
int relais = 1;
int Tmin = 20;
int Tmax = 25;
int temperatureControleMax = Tmax * 100;
int Hmin = 20;
int Hmax = 25;
int heure = 1;
int minute = 1;
int temp1 = 0;
int temp2 = 0;

unsigned int Menu = 0;
unsigned int SousMenu = 0;
unsigned long Tempo = 0;

int test1 = 0;
int test2 = 0;
int test3 = 0;

int SELECT = A0;
int UP = A1;
int LEFT = A3;
int HOME = A4;

typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Info General "
  };
  NumMenu[11] = (TypeMenu) {
    "Temp Nid:" + String(Tmin)
  };
  NumMenu[12] = (TypeMenu) {
    "Temp ADC:" + String(Tmax)
  };
  NumMenu[13] = (TypeMenu) {
    "Humidite" + String(Tmax)
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temperature"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Min " + String(Tmin) + " c"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " + String(Tmax) + " c"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humidite"
  };
  NumMenu[31] = (TypeMenu) {
    "Humid Min " + String(Hmin) + "%"
  };
  NumMenu[32] = (TypeMenu) {
    "Humid Max " + String(Hmax) + "%"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "4.1 Reglage"
  };
  NumMenu[42] = (TypeMenu) {
    "4.2 Reglage heure"
  };
}

void setup() {
  pinMode(ventilo1, OUTPUT);
  pinMode(ventilo2, OUTPUT);
  pinMode(relais, OUTPUT);
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(HOME, INPUT_PULLUP);

  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();
  Tempo = millis();
}

void loop() {
  Sondes();
  Regul();
  humi();
  heurefunc();
  bouton();
}

void bouton() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      delay(30);
      afficherMenu = true;
      Serial.println("afficherMenu = true");
      SousMenu++;
      Tempo = millis() + 250;
      lcd.clear();
      Serial.println("clear du lcd");
      AfficheMenu();
      Serial.println("Menu afficher");
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      delay(30);
      afficherMenu = true;
      Serial.println("afficherMenu = true");
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      lcd.clear();
      Serial.println("clear du lcd");
      AfficheMenu();
      Serial.println("Menu afficher");
    } else if (digitalRead(HOME) == LOW) { /* Bouton Select */
      delay(30);
      afficherMenu = false;
      Tempo = millis() + 750;
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      delay(30);
      afficherMenu = true;
      Tempo = millis() + 750;
      lcd.clear();
      switch (Menu + SousMenu) {

        case 21 :
          if (Tmin <= 29) {
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if (Tmin >= Tmax) {
            Tmax = Tmin + 1;
            Serial.print("Tmax");
            Serial.println(Tmax);
            NumMenu[22] = (TypeMenu) {
              "Temp Max " + String(Tmax) + " c"
            };
          }
          NumMenu[21] = (TypeMenu) {
            "Temp Min " + String(Tmin) + " c"
          };
          Serial.print("Tmin");
          Serial.println(Tmin);
          break;

        case 22 :
          if ((Tmax > Tmin) && (Tmax <= 30)) {
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
            NumMenu[21] = (TypeMenu) {
              "Temp Min " + String(Tmin) + " c"
            };
          }
          NumMenu[22] = (TypeMenu) {
            "Temp Max " + String(Tmax) + " c"
          };
          Serial.print("Tmax");
          Serial.println(Tmax);
          break;

        case 31 :
          if ((Hmax > Hmin) && (Hmin <= 99)) {
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if (Hmin >= Hmax) {
            Hmax = Hmin + 5;
            NumMenu[32] = (TypeMenu) {
              "Humid Max " + String(Hmax) + " %"
            };
            Serial.print("Hmax");
            Serial.println(Hmax);
          }
          NumMenu[31] = (TypeMenu) {
            "Humid Min " + String(Hmin) + " %"
          };
          Serial.print("Hmin");
          Serial.println(Hmin);
          break;

        case 32 :
          if ((Hmax > Hmin) && (Hmax <= 99)) {
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
            NumMenu[31] = (TypeMenu) {
              "Humid Min " + String(Hmin) + " %"
            };
          }
          NumMenu[32] = (TypeMenu) {
            "Humid Max " + String(Hmax) + " %"
          };
          Serial.print("Hmax");
          Serial.println(Hmax);
          break;

        case 41 :
          ;
        case 42 :
          ;
      }
      AfficheMenu();
    }
  }
}


}
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 07:14 pm
suite du code il est trop grand

Code: [Select]
void AfficheMenu() {
  if (!afficherMenu) return;
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 50 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }
}

void Regul() {
  tc_100();
  Serial.print("Regul : sonde test 1 = ");
  Serial.println(temp1);
  Serial.print("Regul : sonde test 2 = ");
  Serial.println(temp2);
  Serial.print("Regul : temperature max = ");
  Serial.println(temperatureControleMax);

  if (temp1 > temperatureControleMax){
    temperatureLimite = false;
    Serial.print("ventil on");
  }else{
    temperatureLimite = true;
    Serial.print("ventil off");
  }
  if (!temperatureLimite) {
    digitalWrite(ventilo1, HIGH);
    digitalWrite(ventilo2, HIGH);
    }else{
      digitalWrite(ventilo1, LOW);
      digitalWrite(ventilo2, LOW);
    }
  }

void humi() {
  if (test2 > 0) {
    if ((digitalRead(test2)) == HIGH) {
      Serial.print("action on test2");
    }
    if ((digitalRead(test2)) == LOW) {
      Serial.print("action off test2");
    }
  }
}

void heurefunc() {
  if (test3 > 0) {
    if ((digitalRead(test3)) == HIGH) {
      Serial.print("action on test3");
    }
    if ((digitalRead(test3)) == LOW) {
      Serial.print("action off test3");
    }
  }
}

void Sondes() {
  tc_100();
  if (!afficherMenu) {
    lcd.setCursor(0, 0);
    lcd.print("Temp NID:");
    mypr (temp1, 0);
    lcd.print ('\xDF');
    lcd.print ("C");
    lcd.setCursor(0, 1);
    lcd.print("Temp ADC:");
    mypr (temp2, 1);
    lcd.print ('\xDF');
    lcd.print ("C");
    Serial.print("sonde 1 = ");
    Serial.println(temp1);
    Serial.print("sonde 2 = ");
    Serial.println(temp2);
  }
}

void tc_100() {
  byte HighByte, LowByte;
  int TReading, SignBit;
  byte data[12] = {0};

  ds1.reset();
  ds1.select(addr1);
  ds1.write(0x44, 1);
  ds2.reset();
  ds2.select(addr2);
  ds2.write(0x44, 1);
  delay(1000);  //  <-- une seule attente pour deux mesures !!!
  ds1.reset();
  ds1.select(addr1);
  ds1.write(0xBE);
  ds2.reset();
  ds2.select(addr2);
  ds2.write(0xBE);

  for (byte i = 0; i < 9; i++) data[i] = ds1.read();
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp
  temp1 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

  for (byte i = 0; i < 9; i++) data[i] = ds2.read();
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp
  temp2 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
}

void mypr(int Tc_100, int line) {
  int Whole, Fract;
  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  if (SignBit) // If its negative
  {
     lcd.setCursor(StartCol,line);
     lcd.print("-");
  }
  lcd.setCursor(StartCol+1,line);
  lcd.print(Whole);
  lcd.print(".");
  if (Fract < 10)
  {
     lcd.print("0");
  }
  lcd.print(Fract);
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 25, 2019, 07:58 pm
Peux-tu ajouter au début de chaque fonction un Serial.println qui affiche le nom de la fonction ? Et commente les autres Serial.

L'idéal serait d'afficher aussi la valeur de millis. Tu fais par exemple, pour bouton ()
Code: [Select]
Serial.print ("Bouton") ;
Serial.printl ("\t") ;
Serial.println (millis ()) ;
\t c'est une tabulation...

Ensuite tu lances le programme et tu essayes le menu. Tu regardes ce qu'il affiche dans la console lorsque tu entres dans le menu et tu copies le contenu de la console dans un message.

J'ai besoin d'en savoir plus sur le déroulement du code et ce n'est pas facile en aveugle...
Merci
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 08:15 pm
je c pas si c sa que tu veux mes j ai du appuyer 10/15 fois avent de voir le menu et que les print apparaisse

Code: [Select]


j ai lancer le menu

Bouton up 38217
afficherMenu = true
clear du lcd
Menu afficher

navigue dans le menu

Bouton left 249249
afficherMenu = true
clear du lcd
Menu afficher


retour vers accueil

Bouton home 312677
sonde 1 = 2093
sonde 2 = 2050


je relance le menu avec select

Bouton select 414571

Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 08:47 pm
Code: [Select]
Bouton up 6264
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 14559
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 18715
afficherMenu = true
clear du lcd
Menu afficher
Bouton select 33227
Bouton home 37383
Bouton select 41548
Bouton select 43633
Bouton home 62286
Bouton select 72698
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 25, 2019, 09:24 pm
Et que se passe-t-il entre chaque affichage de millis ? Tu tapes sur les boutons comme un malade ?
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 09:33 pm
dans le premier oui

dans le deuxième beaucoup moin je dirait 1 fois toute les 5 a 10 seconde mais plusieurs pression avent l affichage de chaque
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 10:20 pm
j ai trouver cela vient du delay je les désactiver et sa marche c fluide

Code: [Select]
 ds1.reset();
  ds1.select(addr1);
  ds1.write(0x44, 1);
  ds2.reset();
  ds2.select(addr2);
  ds2.write(0x44, 1);
  //delay(1000);  //  <-- une seule attente pour deux mesures !!!
  ds1.reset();
  ds1.select(addr1);
  ds1.write(0xBE);
  ds2.reset();
  ds2.select(addr2);
  ds2.write(0xBE);




Code: [Select]
Menu afficher
Bouton up 28527
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 29036
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 29543
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 30409
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 30851
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 31357
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 32007
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 32583
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 33233
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 33812
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 129495
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 130425
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 131076
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 131726
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 132303
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 132880
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 133389
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 133829
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 134263
afficherMenu = true
clear du lcd
Menu afficher
Bouton select 134773
Bouton select 135635
Bouton select 136854
Bouton home 138640
Bouton up 141029
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 141608
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 141978
afficherMenu = true
clear du lcd
Menu afficher
Bouton select 142844
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 25, 2019, 10:46 pm
Et les mesures de température sont bonnes ?
Sinon, tu peux remplacer le delay par ce qu'on avait fait avant : lecture des boutons en attendant
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 10:51 pm
sans le delay ouep tout est bon température et menu
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 25, 2019, 10:58 pm
Cool!
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 25, 2019, 11:03 pm
en tout un grand merci j ai un code tout propre pour continuer mon projet et je suis remotiver a 300% j'aurai du venir ici depuis le début


passons a la suite

voila le ptit bout de code qui regul ma température et qui marche mais je doute bien qu il y a mieux et plus propre tu l écrirai comment toi  ?

Code: [Select]
void regulTemperatureADC() {

  temperatureControleMax = Tmax * 100;
  tc_100();
  //Serial.print("Regul : sonde test 1 = ");
  //Serial.println(temp1);
  //Serial.print("Regul : sonde test 2 = ");
  //Serial.println(temp2);
  //Serial.print("Regul : temperature max = ");
  //Serial.println(temperatureControleMax);

  if (temp2 > temperatureControleMax) {
    temperatureLimite = false;
    if (!temperatureLimite) {
    digitalWrite(ventilo1, HIGH);
    digitalWrite(ventilo2, HIGH);
  }
    //Serial.println("ventil on");
  } else {
    temperatureLimite = true;
    digitalWrite(ventilo1, LOW);
    digitalWrite(ventilo2, LOW);
    //Serial.println("ventil off");
  }
}



edit : j ai modifier le code je t pas mis le bon
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 25, 2019, 11:43 pm
Je pense que tu n'as pas besoin d'appeler la fonction tc_100 ici. La température varie certainement bien plus lentement que le déroulement du programme.

Si tu mets un Serial.println (millis ()) ; au début de la loop, tu verras qu'elle tourne plusieurs fois par seconde, ou en tout cas bien plus vite que le changement de température. Donc, cette fonction est appelée assez souvent comme ça, tu peux utiliser les valeurs de températures contenues dans les variables globales temp1 et temp2 pour ta régulation sans avoir besoin de les mesurer ici.

Le seul moment où les températures ne sont pas mises à jour c'est lorsque tu es dans les menus, mais là tu n'as pas besoin de faire la régulation.
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 25, 2019, 11:53 pm
Code: [Select]
void regulTemperatureADC() {

  temperatureControleMax = Tmax * 100;
  if (temp2 > temperatureControleMax) {
    digitalWrite(ventilo1, HIGH);
    digitalWrite(ventilo2, HIGH);
    //Serial.println("ventil on");
  } else {
    digitalWrite(ventilo1, LOW);
    digitalWrite(ventilo2, LOW);
    //Serial.println("ventil off");
  }
}

Voire même, pourquoi pas ?

Code: [Select]
void regulTemperatureADC() {
  temperatureControleMax = Tmax * 100;
  digitalWrite(ventilo1, (temp2 > temperatureControleMax));
  digitalWrite(ventilo2, (temp2 > temperatureControleMax));
  Serial.println ("ventilation" + (temp2 > temperatureControleMax)? "on" :"off") ;
}

À tester...
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 12:02 am
d accord je v le retirer par quand je suis dans le menu mais température continu a être mis a jour car mes ventilo s enclenche si je met ma main sur la sonde

j ai opter pour

Code: [Select]
void regulTemperatureADC() {
 temperatureControleMax = Tmax * 100;
 digitalWrite(ventilo1, (temp2 > temperatureControleMax));
 digitalWrite(ventilo2, (temp2 > temperatureControleMax));
 Serial.println ("ventilation" + (temp2 > temperatureControleMax)? "on" :"off") ;
}


simple et efficace sa marche parfaitement


sinon la je voudrait que met température de régulation reste en mémoire en cas de coupure de courant ou autre es-que cela suffirait ?

je voudrait aussi pouvoir afficher l heure et allumer ou éteindre l éclairage a des heur précise

https://www.amazon.fr/iHaospace-DS3231-AT24C32-Precision-Arduino/dp/B07CG7YTPN/ref=sr_1_6?__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&keywords=RTC+DS1307&qid=1556177160&refinements=p_76%3A437878031&rnid=437877031&rps=1&s=gateway&sr=8-6

si oui ta un modèle précis a me conseiller

et sinon comment je pourrait faire ?
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 26, 2019, 10:30 am
Salut !
Après réflexion, je me suis dit que cette version simple risque de poser problème autour de la transition : si tu passes la limite temperatureControleMax (disons qu'elle vaut 30.0°C), la précision du capteur risque de donner des valeurs qui oscillent autour de ces 30.0 (genre 29.95 puis 30.05) et ça va lancer et arrêter la ventil plus que nécessaire.

Il faut ajouter de l'hystérésis (https://fr.wikipedia.org/wiki/Hyst%C3%A9r%C3%A9sis) :

Code: [Select]
void regulTemperatureADC() {
  temperatureControleMax = Tmax * 100;
  int hysteresis = 25; // marge de +/- 0.25 degrés
  if (temp2 > temperatureControleMax + hysteresis) {
    digitalWrite(ventilo1, HIGH);
    digitalWrite(ventilo2, HIGH);
    Serial.println("ventilation on");
  } else if (temp2 < temperatureControleMax - hysteresis) {
    digitalWrite(ventilo1, LOW);
    digitalWrite(ventilo2, LOW);
    Serial.println("ventilation off");
  }
}

serait plus pertinent (mais moins joli :) ). Tu peux ensuite jouer sur la marge. Ici la ventilation se déclenche au-dessus de 30.25°C et s'arrête en dessous de 29.75°C.

La température de régulation (Tmax) est réglée par les menus ? Pour la conserver il faut la mettre en EEPROM. S'il y a coupure de courant, il faut pouvoir la lire au démarrage.

Je n'ai jamais joué avec ça, ça va être une première, tu seras le testeur...

Ajoute #include <EEPROM.h> au début du code
Définis une constante magique qui servira à savoir si on écrit pour la première fois ou non dans l'EEPROM
Code: [Select]
cont unsigned long MAGIC = 123456789;

On lit le début de l'EEPROM pour voir si la constante MAGIC s'y trouve : si oui, c'est qu'on a déjà écrit dans l'EEPROM donc on peut lire la valeur de Tmax qui y est déjà sauvegardée. Si non, on écrit MAGIC et Tmax pour plus tard.
Code: [Select]
unsigned long magic;
EEPROM.get(0,magic);
if (magic == MAGIC) {
  EEPROM.get(4,Tmax);
} else {
  EEPROM.put(0,MAGIC);
  EEPROM.put(4,Tmax);
}


Chaque fois que Tmax est changé, on réécrit sa valeur dans l'EEPROM :
Code: [Select]
EEPROM.update(4,Tmax);Je te laisse chercher où mettre cette ligne.

Pour l'heure, en effet il te faut une RTC, et le modèle DS3231 est parfait. Une autre solution serait d'aller chercher l'heure sur internet mais il te faut un Wifi et un processeur qui est capable de discuter en Wifi (arduino + shield ou ESP8266 ou ESP32).
La DS3231 se trouve en Chine (Aliexpress) pour moins cher que ça, mais il faut compter un mois d'attente pour la livraison. C'est toi qui vois...
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 02:11 pm
je v opté pour le DS3231 alors. je avancer sur met différente regul en attendent de le recevoir

sinon impeccable    int hysteresis 

et pour EEPROM impeccable toute mais variable sont sauvegarder

je v commencer a voir pour l'heur car j ai aucune idée de comment sa marche si ta des conseil ou des bon tuto je suit preneur
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 26, 2019, 02:33 pm
C'est pas très compliqué une RTC. Il faut mettre la pile pour qu'elle conserve ses données en cas de coupure d'alimentation (elle est alimentée par l'Arduino) et il faut la mettre à l'heure lors de la première utilisation.

Pour ça, c'est simple : tu prends la bibliothèque RTCLib (https://github.com/adafruit/RTClib) et tu lances l'exemple ds3231.ino (https://github.com/adafruit/RTClib/blob/master/examples/ds3231/ds3231.ino) dont les lignes suivantes servent à régler l'heure et la date :
Code: [Select]
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));


Ensuite, plus besoin de faire ça, tu l'utilises comme tu veux.

Code: [Select]
    DateTime now = rtc.now();
   
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();

Ces lignes affichent la date et l'heure courantes, tu peux les utiliser pour faire des tests :
Code: [Select]
DateTime now = rtc.now();
if (now.hour() == 8 && now.minute() == 30 && now.second() == 0) {
  // il est 8:30 du matin
}
Il faut penser que l'Arduino pédale très vite et qu'il peut faire ce test plusieurs fois dans la seconde dont s'arranger pour qu'il ne le fasse qu'une fois (avec un flag par exemple).
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 03:14 pm
ah je voyer sa plus compliquer ^^ tant mieux


sinon la en attendent de le recevoir je test de passer sur un écran 4 ligne mais quand je le branche il affiche bien la page d accueil avec les sondes mais impossible de lancer le menu on dirait qu il n y a plus que les sonde qui tourne car pas de menu afficher et pas de print quand j appuis sur le bouton et met ventilo egalement ne se déclenche plus

j ai fait les changement comme il le montre sur le tuto ou j ai pris le menu mais rien

le lien du tuto

www.ihm3d.fr/httpihm3d-frprogrammer-un-menu-avec-un-ecran-lcd.html

jte met le code en deux partie car c trop long

Code: [Select]
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);// adressage de votre carte.

#include <OneWire.h>

#include <EEPROM.h>

// DS18S20 Temperature
OneWire ds1(10);  // on pin 10
OneWire ds2(9);   // on pin  9

byte addr1[8] = {0x28, 0xAA, 0x98, 0x12, 0x3C, 0x14, 0x01, 0xD7};
byte addr2[8] = {0x28, 0xAA, 0xC1, 0x91, 0x3B, 0x14, 0x01, 0x9A};
int SignBit = 0;
int StartCol = 8;

bool afficherMenu = false;
bool temperatureLimite = false;

const char ventilo1 = 6;
const char ventilo2 = 7;
const unsigned long MAGIC = 1564;

int ventilo = 6;
int relais = 1;

int temperatureControleMaxADC;
int temperatureControleMaxNID;
 

int Tmin = EEPROM.read(4);
int Tmax = EEPROM.read(5);
int TminNID = EEPROM.read(6);
int TmaxNID = EEPROM.read(7);
int Hmin = EEPROM.read(8);
int Hmax = EEPROM.read(9);
int HminNID = EEPROM.read(10);
int HmaxNID = EEPROM.read(11);

 
 
int heure = 1;
int minute = 1;
int temp1 = 0;
int temp2 = 0;


unsigned int Menu = 0;
unsigned int SousMenu = 0;
unsigned long Tempo = 0;


int SELECT = A0;
int UP = A1;
int LEFT = A3;
int HOME = A2;


// -----------------------Initialisation Menu-----------------------------


typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Temp ADC  "
  };
  NumMenu[11] = (TypeMenu) {
    "Temp Min " + String(Tmin) + String('\xDF') + "C"
  };
  NumMenu[12] = (TypeMenu) {
    "Temp Max " + String(Tmax) + String('\xDF') + "C"
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temp NID"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Min " + String(TminNID) + String('\xDF') + "C"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " + String(TmaxNID) + String('\xDF') + "C"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humidite ADC"
  };
  NumMenu[31] = (TypeMenu) {
    "Humidite Min " + String(Hmin) + "%"
  };
  NumMenu[32] = (TypeMenu) {
    "Humidite Max " + String(Hmax) + "%"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Reglage Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "Reglage heure"
  };
  NumMenu[42] = (TypeMenu) {
    "Reglage minute"
  };
  NumMenu[50] = (TypeMenu) {
    "5. Heure eclairage"
  };
  NumMenu[51] = (TypeMenu) {
    "Eclairage ON"
  };
  NumMenu[52] = (TypeMenu) {
    "Eclairage OFF"
  };
}


// -----------------------setup et loop-----------------------------


void setup() {

  pinMode(ventilo1, OUTPUT);
  pinMode(ventilo2, OUTPUT);
  pinMode(relais, OUTPUT);
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(HOME, INPUT_PULLUP);

  Serial.begin(9600);
  lcd.init(); // initialisation de l'afficheur
  lcd.backlight();
  lcd.init(); // initialisation de l'afficheur
  lcd.backlight();
  Initialisation();
  Tempo = millis();
  unsigned long magic;
  EEPROM.get(0, magic);
  if (magic == MAGIC) {
    EEPROM.get(4, Tmin);
    EEPROM.get(5, Tmax);
    EEPROM.get(6, TminNID);
    EEPROM.get(7, TmaxNID);
    EEPROM.get(8, Hmin);
    EEPROM.get(9, Hmax);
    EEPROM.get(10, HminNID);
    EEPROM.get(11, HmaxNID);
  } else {
    EEPROM.put(0, MAGIC);
    EEPROM.put(4, 16);
    EEPROM.put(5, 18);
    EEPROM.put(6, 20);
    EEPROM.put(7, 22);
    EEPROM.put(8, 40);
    EEPROM.put(9, 45);
    EEPROM.put(10, 60);
    EEPROM.put(11, 65);
  }
 

  Serial.println(EEPROM.read(0));
  Serial.println(EEPROM.read(4));
  Serial.println(EEPROM.read(5));
  Serial.println(EEPROM.read(6));
  Serial.println(EEPROM.read(7));
  Serial.println(EEPROM.read(8));
  Serial.println(EEPROM.read(9));
  Serial.println(EEPROM.read(10));
  Serial.println(EEPROM.read(11));

}

void loop() {
  sondesTemperature();
  boutonMenu();
  regulTemperatureADC();
  regulTemperatureNID();
  regulHumiditeADC();
  gestionHeure();

}
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 03:19 pm
Code: [Select]

// -----------------------Bouton et Menu-----------------------------

void boutonMenu() {
  Tmin = EEPROM.read(4);
  Tmax = EEPROM.read(5);
  TminNID = EEPROM.read(6);
  TmaxNID = EEPROM.read(7);
  Hmin = EEPROM.read(8);
  Hmax = EEPROM.read(9);
  HminNID = EEPROM.read(10);
  HmaxNID = EEPROM.read(11);
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) { /* Bouton LEFT  */
      Serial.print ("Bouton left") ;
      Serial.print ("\t") ;
      Serial.println (millis ()) ;
      afficherMenu = true;
      Serial.println("afficherMenu = true");
      SousMenu++;
      Tempo = millis() + 250;
      lcd.clear();
      //Serial.println("clear du lcd");
      AfficheMenu();
      Serial.println("Menu afficher");
    } else if (digitalRead(UP) == LOW) { /* Bouton Up */
      Serial.print ("Bouton up") ;
      Serial.print ("\t") ;
      Serial.println (millis ()) ;
      afficherMenu = true;
      Serial.println("afficherMenu = true");
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      lcd.clear();
      Serial.println("clear du lcd");
      AfficheMenu();
      Serial.println("Menu afficher");
    } else if (digitalRead(HOME) == LOW) { /* Bouton Select */
      Serial.print ("Bouton home") ;
      Serial.print ("\t") ;
      Serial.println (millis ()) ;
      afficherMenu = false;
      Tempo = millis() + 750;
    } else if (digitalRead(SELECT) == LOW) { /* Bouton Select */
      Serial.print ("Bouton select ") ;
      Serial.print ("\t") ;
      Serial.println (millis ()) ;
      afficherMenu = true;
      Tempo = millis() + 750;
      lcd.clear();
      switch (Menu + SousMenu) {

        case 11 :
          if (Tmin <= 30) {
            Tmin = Tmin + 1;
            EEPROM.update(4, Tmin);
          }
          else {
            Tmin = 5;
            EEPROM.update(4, Tmin);
          }
          if (Tmin >= Tmax) {
            Tmax = Tmin + 1;
            EEPROM.update(5, Tmax);
            NumMenu[12] = (TypeMenu) {
            "Temp Max " + String(Tmax) + String('\xDF') + "C"
          };
          }
          NumMenu[11] = (TypeMenu) {
            "Temp Min " + String(Tmin) + String('\xDF') + "C"
          };
          break;

        case 12 :
          if ((Tmax > Tmin) && (Tmax <= 31)) {
            Tmax = Tmax + 1;
            EEPROM.update(5, Tmax);
          }
          else {
            Tmax = Tmin + 1;
            EEPROM.update(5, Tmax);
          }
          NumMenu[12] = (TypeMenu) {
            "Temp Max " + String(Tmax) + String('\xDF') + "C"
          };
          break;

        case 21 :
          if (TminNID <= 30) {
            TminNID = TminNID + 1;
            EEPROM.update(6, TminNID);
          }
          else {
            TminNID = 5;
            EEPROM.update(6, TminNID);
          }
          if (TminNID >= TmaxNID) {
            TmaxNID = TminNID + 1;
            EEPROM.update(7, TmaxNID);
            NumMenu[22] = (TypeMenu) {
            "Temp Max " + String(TmaxNID) + String('\xDF') + "C"
          };
          }
          NumMenu[21] = (TypeMenu) {
            "Temp Min " + String(TminNID) + String('\xDF') + "C"
          };
          break;

        case 22 :
          if ((TmaxNID > TminNID) && (TmaxNID <= 31)) {
            TmaxNID = TmaxNID + 1;
            EEPROM.update(7, TmaxNID);
          }
          else {
            TmaxNID = TminNID + 1;
            EEPROM.update(7, TmaxNID);
          }
          NumMenu[22] = (TypeMenu) {
            "Temp Max " + String(TmaxNID) + String('\xDF') + "C"
          };
          break;

        case 31 :
          if ((Hmax > Hmin) && (Hmin <= 99)) {
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if (Hmin >= Hmax) {
            Hmax = Hmin + 5;
            NumMenu[32] = (TypeMenu) {
              "Humidite Max " + String(Hmax) + "%"
            };
            //Serial.print("Hmax");
            //Serial.println(Hmax);
          }
          NumMenu[31] = (TypeMenu) {
            "Humidite Min " + String(Hmin) + "%"
          };
          //Serial.print("Hmin");
          //Serial.println(Hmin);
          break;

        case 32 :
          if ((Hmax > Hmin) && (Hmax <= 99)) {
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
            NumMenu[31] = (TypeMenu) {
              "Humidite Min " + String(Hmin) + "%"
            };
          }
          NumMenu[32] = (TypeMenu) {
            "Humidite Max " + String(Hmax) + "%"
          };
          //Serial.print("Hmax");
          //Serial.println(Hmax);
          break;

        case 41 :
          ;
        case 42 :
          ;
      }
      AfficheMenu();
    }
  }
}

void AfficheMenu() {
  Tmin = EEPROM.read(4);
  Tmax = EEPROM.read(5);
  TminNID = EEPROM.read(6);
  TmaxNID = EEPROM.read(7);
  Hmin = EEPROM.read(8);
  Hmax = EEPROM.read(9);
  HminNID = EEPROM.read(10);
  HmaxNID = EEPROM.read(11);
  if (!afficherMenu) return;
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 60 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }

}

// -----------------------Sondes-----------------------------

void sondesTemperature() {

  tc_100();
  if (!afficherMenu) {
    lcd.setCursor(0, 2);
    lcd.print("Temp ADC:");
    mypr (temp1, 2);
    lcd.print ('\xDF');
    lcd.print ("C");
    lcd.setCursor(0, 3);
    lcd.print("Temp NID:");
    mypr (temp2, 3);
    lcd.print ('\xDF');
    lcd.print ("C");
    //Serial.print("sonde 1 = ");
    //Serial.println(temp1);
    //Serial.print("sonde 2 = ");
    //Serial.println(temp2);
  }

}

void tc_100() {

  byte HighByte, LowByte;
  int TReading, SignBit;
  byte data[12] = {0};

  ds1.reset();
  ds1.select(addr1);
  ds1.write(0x44, 1);
  ds2.reset();
  ds2.select(addr2);
  ds2.write(0x44, 1);
  //delay(1000);  //  <-- une seule attente pour deux mesures !!!
  ds1.reset();
  ds1.select(addr1);
  ds1.write(0xBE);
  ds2.reset();
  ds2.select(addr2);
  ds2.write(0xBE);

  for (byte i = 0; i < 9; i++) data[i] = ds1.read();
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp
  temp1 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

  for (byte i = 0; i < 9; i++) data[i] = ds2.read();
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp
  temp2 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

}

void mypr(int Tc_100, int line) {

  int Whole, Fract;
  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  if (SignBit) // If its negative
  {
    lcd.setCursor(StartCol, line);
    lcd.print("-");
  }
  lcd.setCursor(StartCol + 1, line);
  lcd.print(Whole);
  lcd.print(".");
  if (Fract < 10)
  {
    lcd.print("0");
  }
  lcd.print(Fract);

}


// -----------------------Action-----------------------------


void regulTemperatureADC() {
  temperatureControleMaxADC = Tmax * 100;
  int hysteresis = 25; // marge de +/- 0.25 degrés
  digitalWrite(ventilo1, (temp1 > temperatureControleMaxADC + hysteresis));
  digitalWrite(ventilo2, (temp1 > temperatureControleMaxADC + hysteresis));
  //Serial.println ("ventilation" + (temp2 > temperatureControleMaxADC)? "on" :"off") ;
}

void regulTemperatureNID() {
  temperatureControleMaxADC = TmaxNID * 100;
}

void regulHumiditeADC() {

}

void gestionHeure() {

}
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 26, 2019, 03:49 pm
Tu déclares 2 lignes ici !!!  :smiley-confuse:
Code: [Select]
LiquidCrystal_I2C lcd(0x27, 16, 2);// adressage de votre carte.
                                ^
                                |


Attention, petite erreur ici (temp1 pas temp2)
Code: [Select]
 //Serial.println ("ventilation" + (temp2 > temperatureControleMaxADC)? "on" :"off") ;

Par contre, je suis étonné que ta gestion de l'EEPROM fonctionne bien : es-tu sûr de ce que tu obtiens ?

Dans l'entête, tu mets :
Code: [Select]
int Tmin = EEPROM.read(4);
int Tmax = EEPROM.read(5);
int TminNID = EEPROM.read(6);
int TmaxNID = EEPROM.read(7);
int Hmin = EEPROM.read(8);
int Hmax = EEPROM.read(9);
int HminNID = EEPROM.read(10);
int HmaxNID = EEPROM.read(11);

Je pense que tu aurais dû conserver ici les initialisations que tu avais auparavant avec des valeurs par défaut. Elles te serviront lors de la première écriture dans l'EEPROM.

Dans un EEPROM.read ou EEPROM.get, l'argument c'est l'emplacement mémoire. Ce n'est pas le numéro de la variable. Il faut savoir qu'un int occupe deux cases mémoire et un unsigned long en occupe 4.

C'est pour ça que dans mon exemple, j'ai mis MAGIC à l'emplacement 0 et Tmax à l'emplacement 4 : c'est le numéro de la première case mémoire de l'EEPROM disponible après les 4 octets utilisés par MAGIC. Si tu veux écrire un int après Tmax, il sera à l'emplacement 6, puis 8 pour le suivant etc.

Toi, tu écris en 4, 5, 6, 7, etc. Donc lorsque tu écris en 5, tu écrases une partie de la valeur stockée en 4 (qui occupe deux octets en 4 et 5), idem pour la suite.

Donc il faut écrire :
(pareil pour la lecture)

Si tu veux ré-écrire des nouvelles valeurs dans l'EEPROM, change le nombre MAGIC : pour l'instant c'est 1564 dans l'EEPROM. Si tu mets une autre valeur dans ton code, il refera l'écriture initiale.

Dans ton code, tu as :
Code: [Select]
  if (magic == MAGIC) {
    EEPROM.get(4, Tmin);
    EEPROM.get(5, Tmax);
    EEPROM.get(6, TminNID);
    EEPROM.get(7, TmaxNID);
    EEPROM.get(8, Hmin);
    EEPROM.get(9, Hmax);
    EEPROM.get(10, HminNID);
    EEPROM.get(11, HmaxNID);
  } else {
    EEPROM.put(0, MAGIC);
    EEPROM.put(4, 16);
    EEPROM.put(5, 18);
    EEPROM.put(6, 20);
    EEPROM.put(7, 22);
    EEPROM.put(8, 40);
    EEPROM.put(9, 45);
    EEPROM.put(10, 60);
    EEPROM.put(11, 65);
  }

Moi j'aurais écrit :

Code: [Select]
  if (magic == MAGIC) {
    EEPROM.get(4, Tmin);
    EEPROM.get(6, Tmax);
    EEPROM.get(8, TminNID);
    EEPROM.get(10, TmaxNID);
    EEPROM.get(12, Hmin);
    EEPROM.get(14, Hmax);
    EEPROM.get(16, HminNID);
    EEPROM.get(18, HmaxNID);
  } else {
    EEPROM.put(0, MAGIC);
    EEPROM.put(4, Tmin);
    EEPROM.put(6, Tmax);
    EEPROM.put(8, TminNID);
    EEPROM.put(10, TmaxNID);
    EEPROM.put(12, Hmin);
    EEPROM.put(14, Hmax);
    EEPROM.put(16, HminNID);
    EEPROM.put(18, HmaxNID);
  }

Je crois que l'EEPROM supporte un nombre limité de lectures et d'écritures : il vaut mieux la solliciter uniquement lorsque c'est nécessaire. Donc les lignes suivantes dans les fonctions bouton et affichemenu sont à enlever :
Code: [Select]
  Tmin = EEPROM.read(4);
  Tmax = EEPROM.read(5);
  TminNID = EEPROM.read(6);
  TmaxNID = EEPROM.read(7);
  Hmin = EEPROM.read(8);
  Hmax = EEPROM.read(9);
  HminNID = EEPROM.read(10);
  HmaxNID = EEPROM.read(11);

Pas besoin de changer les valeurs des variables globales. Tes update sont bons, sauf les adresses bien sûr. Mais il est probable que tu pourrais faire les update uniquement lorsque tu as sélectionné les valeurs, et pas à chaque appui sur un bouton (je ne sais pas comment fonctionnent tes boutons : c'est du +1 ou -1 à chaque appui ? --> si oui, tu sollicites l'EEPROM trop souvent, il faut le faire uniquement lorsque la valeur est sélectionnée).
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 03:51 pm
il n y a que le bouton Home qui fonctionne je sont print mais les autre rien
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 26, 2019, 03:56 pm
Quand on change un truc, quel qu'il soit, il faut le tester auparavant pour voir s'il fonctionne. Essaye un sketch tout simple avec ton LCD :
Code: [Select]

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 4);

void setup() {
 Serial.begin(9600);
 lcd.init(); // initialisation de l'afficheur
 lcd.backlight();
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("A");
 lcd.setCursor(2,1);
 lcd.print("B");
 lcd.setCursor(4,2);
 lcd.print("C");
 lcd.setCursor(6,3);
 lcd.print("D");
}

void loop() {
 
}
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 04:00 pm
pour l EEPROM  quand je met comme toi l affichage des valeur ne s actualise pas au lancement du menu elle ne le font que au nomment ou je change ma valeur  avec select je teste de remettre comme tu as mis

je les tester il fonctionne aucun soucie pour le test mais pour le menu non il veut pas
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 26, 2019, 04:08 pm
Pour le LCD, il faut alors le déclarer avec un 4 :
Code: [Select]
LiquidCrystal_I2C lcd(0x27, 16, 4);et tu peux ôter les lignes en trop dans le setup :
Code: [Select]
 lcd.init(); // initialisation de l'afficheur
 lcd.backlight();
 lcd.init(); // initialisation de l'afficheur
 lcd.backlight();
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 05:25 pm
les bouton remarche en partie

1  la page d'accueil s'efface comme prévu quand j appuis sur le UP
2  le menu ne s affiche pas l écran et vide

3  le bouton Home effectue bien le retour

4 le bouton left comme le UP

5 bouton select pareil


par contre quand je suis sur l écran vide et que je spam le bouton UP alors j arrive a avoir par moment 1. Temp ADC sur la première ligne de l affichage


Code: [Select]
Bouton up 121744
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 162579
afficherMenu = true
Menu afficher
Bouton home 167986
Bouton select 241622
Bouton home 245074
Bouton up 247901
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 391576
afficherMenu = true
Menu afficher
Bouton home 393468
Bouton left 395147
afficherMenu = true
Menu afficher
Bouton left 396364
afficherMenu = true
Menu afficher
Bouton left 396766
afficherMenu = true
Menu afficher
Bouton left 397025
afficherMenu = true
Menu afficher
Bouton home 397675
Bouton left 399882
afficherMenu = true
Menu afficher
Bouton home 455164
Bouton select 456931
Bouton select 457793
Bouton select 458584
Bouton left 459588
afficherMenu = true
Menu afficher
Bouton left 459918
afficherMenu = true
Menu afficher
Bouton left 460178
afficherMenu = true
Menu afficher
Bouton select 460508
Bouton up 461441
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 461755
afficherMenu = true
Menu afficher
Bouton up 462565
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 462966
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 463404
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 463805
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 464100
afficherMenu = true
clear du lcd
Menu afficher
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 26, 2019, 05:42 pm
Je ne comprends pas : avant ça fonctionnait. Ensuite, les seules modifications c'est d'ajouter l'EEPROM et le LCD à 4 lignes ?
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 05:51 pm
l EEPROM sa marchai également c'est uniquement depuis l écran 
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 06:01 pm
tiens bah ducoup j ai remis mon code d avant EEPROM et la y a du mieux mais c pas sa

j'ai le menu 1 et 2 qui affiche les autre sont vide

j arrive aussi a afficher le sous menu par moment mais une fois il est entier une fois il est il est couper


il doit y avoir encore une histoir de delay ou alors l affichage 4 ligne prend trop de temps
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 26, 2019, 06:03 pm
Il existe de nombreuses bibliothèques pour les écrans LCD en I2C, certaines ont le même nom ce qui ne simplifie pas les choses, et l'un d'elle est buguée.

Si je prends celle-ci (https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library), je crois que les offsets des lignes 3 et 4 sont faux (je te dis ça de mémoire, ça fait longtemps que j'avais vu ça, et je n'utilise pas ces écrans). Donc d'abord, est-ce celle-là que tu utilises ?

Pour le savoir, va dans le répertoire arduino/libraries et dans le sous-rép de cette bibli. Il doit y avoir un fichier LiquidCrystal_I2C.cpp ?

La ligne 106 est-elle :
Code: [Select]
int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };

Si oui, on est un peu dans la m*** car je ne sais plus les bonnes valeurs...

Tu as testé le code que je t'ai proposé qui devait afficher un truc du genre :
Quote
A
          B
              C
                  D
Est-ce ça que tu as obtenu ?

Quote
j'ai le menu 1 et 2 qui affiche les autre sont vide
Ça veut dire quoi ? Les 2 premières lignes ?
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 26, 2019, 06:27 pm
Tu pourrais essayer avec une autre bibliothèque pour le LCD ?
Essaye celle-ci : hd44780 (https://github.com/duinoWitchery/hd44780) et teste le sketch suivant :

Code: [Select]
#include <Wire.h>
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Clcd.h> // i2c LCD i/o class header
hd44780_I2Clcd lcd;

//
// enter address of LCD.
// Addresses seen so far include:
// - 0x3a, 0x3b (PCF2119x)
// - 0x3c (unknown chip)
// - 0x3d (unknown chip)
// - 0x3e (unknown chip)
// - 0x3f (unknown chip)

// declare i2c address and constructor for specified i2c address
//const int i2c_addr = 0x3e;
//hd44780_I2Clcd lcd(i2c_addr); // use device at this address


// LCD geometry
const int LCD_COLS = 16;
const int LCD_ROWS = 4;

void setup()
{
int status;
status = lcd.begin(LCD_COLS, LCD_ROWS);
if(status) // non zero status means it was unsuccesful
{
status = -status; // convert negative status value to positive number

// begin() failed so blink error code using the onboard LED if possible
hd44780::fatalError(status); // does not return
}

// Print a message to the LCD
       lcd.setCursor(0,0);
       lcd.print("C'est a force");
       lcd.setCursor(0,1);
       lcd.print("d'enfiler les");
       lcd.setCursor(0,2);
       lcd.print("poules que l'on");
       lcd.setCursor(0,3);
       lcd.print("finit par casser");
}

void loop() {}
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 06:47 pm
celle que j utilise c 'est celle ci  https://github.com/johnrickman/LiquidCrystal_I2C

je v test avec celle la voir se que sa donne




voila se qui se passe

1 page d accueil
tout et OK

(https://cdn.discordapp.com/attachments/412535649787183105/571371335914356737/JPEG_20190426_182119.jpg)

2 j appuis sur UP
 le menu 10 s'affiche

Code: [Select]
Bouton up 4783
afficherMenu = true
clear du lcd
Menu afficher


(https://cdn.discordapp.com/attachments/412535649787183105/571371336526594048/JPEG_20190426_182148.jpg)

3 j appuis sur left pour rentrer dans le sous menu (le 11 et 12)
 le sous menu s 'affiche

Code: [Select]
Bouton left 99919
afficherMenu = true
clear du lcd
Menu afficher


(https://cdn.discordapp.com/attachments/412535649787183105/571371337021390887/JPEG_20190426_182254.jpg)

4 j appuis sur select pour changer la température
  et la l affichage du sous menu déconne

Code: [Select]
Bouton select 250867


(https://cdn.discordapp.com/attachments/412535649787183105/571371336522399754/JPEG_20190426_182311.jpg)

5 je r appuis sur up pour passer au menu suivant le 20
 l'affichage redevient normal

pour les sous menu 21 22 mème problème que avant

Code: [Select]
Bouton up 484070
afficherMenu = true
clear du lcd
Menu afficher


(https://cdn.discordapp.com/attachments/412535649787183105/571371337529163806/JPEG_20190426_182207.jpg)


6  j' appuis de nouveau  sur UP pour passer au menu 30
  et la rien écran vide

Code: [Select]
Bouton up 697805
afficherMenu = true
clear du lcd
Menu afficher


(https://cdn.discordapp.com/attachments/412535649787183105/571371337021390886/JPEG_20190426_182335.jpg)


7  j essaye d afficher le sous-menu 31 et 32

Code: [Select]
Bouton left 808970
afficherMenu = true
clear du lcd
Menu afficher



(https://cdn.discordapp.com/attachments/412535649787183105/571371335914356736/JPEG_20190426_182358.jpg)

le dernier menu même chose
uniquement le sous menu

(https://media.discordapp.net/attachments/412535649787183105/571371335435943936/JPEG_20190426_182420.jpg?width=490&height=659)


8  retour a la page d accueil avec le home
  pour celui ci c ok la page d accueil revient a la normal
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 07:03 pm
avec la bibliothèque que tu ma passer je n est carrément aucun affichage
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 07:27 pm
vla la doc de mon écran mais j ai tout comme eux
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 07:41 pm
le soucie vient du menu car si je met le  menu du tuto sa marche avec un petit bug par moment au lancement mais le menu marche


et notre code sans les sonde me pose également les mème problème d affichage
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 09:49 pm
le souci se trouve la dedans

j'ai régler le souci du menu en retirent tout les print je c pas pourquoi mais des que je les enlevé le menu remarche par contre j ai encore un soucie sur l'affichage des sous menu qui disparaisse en partie quand je clic sur select pour changer la température

Code: [Select]
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);// adressage de votre carte.

#include <OneWire.h>


byte addr1[8] = {0x28, 0xAA, 0x98, 0x12, 0x3C, 0x14, 0x01, 0xD7};
byte addr2[8] = {0x28, 0xAA, 0xC1, 0x91, 0x3B, 0x14, 0x01, 0x9A};
int SignBit = 0;
int StartCol = 8;

bool afficherMenu = false;
bool temperatureLimite = false;

const char ventilo1 = 6;
const char ventilo2 = 7;

int ventilo = 6;
int relais = 1;

int temperatureControleMaxADC;
int temperatureControleMaxNID;
 

int Tmin = 16;
int Tmax = 18;
int TminNID = 19;
int TmaxNID = 20;
int Hmin = 22;
int Hmax = 23;
int HminNID = 24;
int HmaxNID = 25;

 
 
int heure = 1;
int minute = 1;
int temp1 = 0;
int temp2 = 0;


unsigned int Menu = 0;
unsigned int SousMenu = 0;
unsigned long Tempo = 0;


int SELECT = A0;
int UP = A1;
int LEFT = A3;
int HOME = A2;


// -----------------------Initialisation Menu-----------------------------


typedef struct {
  String Menu;
}

TypeMenu;
TypeMenu NumMenu[100];

void Initialisation() {
  NumMenu[10] = (TypeMenu) {
    "1. Temp ADC  "
  };
  NumMenu[11] = (TypeMenu) {
    "Temp Min " + String(Tmin) + String('\xDF') + "C"
  };
  NumMenu[12] = (TypeMenu) {
    "Temp Max " + String(Tmax) + String('\xDF') + "C"
  };
  NumMenu[20] = (TypeMenu) {
    "2. Temp NID"
  };
  NumMenu[21] = (TypeMenu) {
    "Temp Min " + String(TminNID) + String('\xDF') + "C"
  };
  NumMenu[22] = (TypeMenu) {
    "Temp Max " + String(TmaxNID) + String('\xDF') + "C"
  };
  NumMenu[30] = (TypeMenu) {
    "3. Humidite ADC"
  };
  NumMenu[31] = (TypeMenu) {
    "Humidite Min " + String(Hmin) + "%"
  };
  NumMenu[32] = (TypeMenu) {
    "Humidite Max " + String(Hmax) + "%"
  };
  NumMenu[40] = (TypeMenu) {
    "4. Reglage Heure"
  };
  NumMenu[41] = (TypeMenu) {
    "Reglage heure"
  };
  NumMenu[42] = (TypeMenu) {
    "Reglage minute"
  };
  NumMenu[50] = (TypeMenu) {
    "5. Heure eclairage"
  };
  NumMenu[51] = (TypeMenu) {
    "Eclairage ON"
  };
  NumMenu[52] = (TypeMenu) {
    "Eclairage OFF"
  };
}


// -----------------------setup et loop-----------------------------


void setup() {

  pinMode(ventilo1, OUTPUT);
  pinMode(ventilo2, OUTPUT);
  pinMode(relais, OUTPUT);
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(HOME, INPUT_PULLUP);

  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  Initialisation();
  Tempo = millis();
}

void loop() {

  boutonMenu();
 

}

// -----------------------Bouton et Menu-----------------------------

void boutonMenu() {
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) {
      afficherMenu = true;
      SousMenu++;
      Tempo = millis() + 250;
      lcd.clear();
      AfficheMenu();
    } else if (digitalRead(UP) == LOW) {
      afficherMenu = true;
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      lcd.clear();
      AfficheMenu();
    } else if (digitalRead(HOME) == LOW) {
      afficherMenu = false;
      Tempo = millis() + 750;
    } else if (digitalRead(SELECT) == LOW) {
      afficherMenu = true;
      Tempo = millis() + 750;
      lcd.clear();
      switch (Menu + SousMenu) {

        case 11 :
          if (Tmin <= 30) {
            Tmin = Tmin + 1;
          }
          else {
            Tmin = 5;
          }
          if (Tmin >= Tmax) {
            Tmax = Tmin + 1;
            NumMenu[12] = (TypeMenu) {
            "Temp Max " + String(Tmax) + String('\xDF') + "C"
          };
          }
          NumMenu[11] = (TypeMenu) {
            "Temp Min " + String(Tmin) + String('\xDF') + "C"
          };
          break;

        case 12 :
          if ((Tmax > Tmin) && (Tmax <= 31)) {
            Tmax = Tmax + 1;
          }
          else {
            Tmax = Tmin + 1;
          }
          NumMenu[12] = (TypeMenu) {
            "Temp Max " + String(Tmax) + String('\xDF') + "C"
          };
          break;

        case 21 :
          if (TminNID <= 30) {
            TminNID = TminNID + 1;
          }
          else {
            TminNID = 5;
          }
          if (TminNID >= TmaxNID) {
            TmaxNID = TminNID + 1;
            NumMenu[22] = (TypeMenu) {
            "Temp Max " + String(TmaxNID) + String('\xDF') + "C"
          };
          }
          NumMenu[21] = (TypeMenu) {
            "Temp Min " + String(TminNID) + String('\xDF') + "C"
          };
          break;

        case 22 :
          if ((TmaxNID > TminNID) && (TmaxNID <= 31)) {
            TmaxNID = TmaxNID + 1;
          }
          else {
            TmaxNID = TminNID + 1;
          }
          NumMenu[22] = (TypeMenu) {
            "Temp Max " + String(TmaxNID) + String('\xDF') + "C"
          };
          break;

        case 31 :
          if ((Hmax > Hmin) && (Hmin <= 99)) {
            Hmin = Hmin + 1;
          }
          else {
            Hmin = 5;
          }
          if (Hmin >= Hmax) {
            Hmax = Hmin + 5;
            NumMenu[32] = (TypeMenu) {
              "Humidite Max " + String(Hmax) + "%"
            };
          }
          NumMenu[31] = (TypeMenu) {
            "Humidite Min " + String(Hmin) + "%"
          };
          break;

        case 32 :
          if ((Hmax > Hmin) && (Hmax <= 99)) {
            Hmax = Hmax + 1;
          }
          else {
            Hmax = Hmin + 1;
            NumMenu[31] = (TypeMenu) {
              "Humidite Min " + String(Hmin) + "%"
            };
          }
          NumMenu[32] = (TypeMenu) {
            "Humidite Max " + String(Hmax) + "%"
          };
          //Serial.print("Hmax");
          //Serial.println(Hmax);
          break;

        case 41 :
          ;
        case 42 :
          ;
      }
      AfficheMenu();
    }
  }
}

void AfficheMenu() {
  if (!afficherMenu) return;
  if (Menu == 0 ) {
    Menu = 40;
  }
  if (Menu == 60 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }

}
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 26, 2019, 10:17 pm
Je regarde ça demain...
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 26, 2019, 11:29 pm
pas de soucie mais en faite j'ai fait plein de post et vla le nombre de personne qui on le mème soucie que moi. d après la plupart des poste c des soucie de librairie du-coups chacun y va avec sa librairie qui soit disant marche mais au final la plupart l ache l affaire.

j en est essayer plusieurs et rien jten mais deux si tu pourras jeter un regard

https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home (https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home)

post

il as le mème soucie que moi  

https://forum.arduino.cc/index.php?topic=375009.0 (https://forum.arduino.cc/index.php?topic=375009.0)


a demain bonne soiré  :D  :D  :D  :D
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 26, 2019, 11:58 pm
Je ne peux pas t'aider car c'est toi qui as l'écran. Il faut que tu testes les bibliothèques avec un code simple comme celui que je t'ai proposé plus haut, jusqu'à trouver celle qui fonctionne correctement avec ton écran.

Edit : j'ai trouvé aussi celle que tu proposes (https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home), qui semble bien. Tu peux la télécharger et tester avec un code simple comme celui qui est proposé :

Code: [Select]
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x38);  // Set the LCD I2C address

#define BACKLIGHT_PIN     13

void setup()
{
  // Switch on the backlight
  pinMode ( BACKLIGHT_PIN, OUTPUT );
  digitalWrite ( BACKLIGHT_PIN, HIGH );
 
  lcd.begin(20,4);               // initialize the lcd

  lcd.home ();                   // go home
  lcd.print("Hello, ARDUINO "); 
  lcd.setCursor ( 0, 1 );        // go to the next line
  lcd.print (" WORLD!  ");     
  lcd.setCursor ( 2, 2 );        // go to the next line
  lcd.print (" Ca marche!  ");     
  lcd.setCursor ( 4, 3 );        // go to the next line
  lcd.print (" Ou pas...  ");     
}

void loop()
{

}
Si tu n'as pas de pin pour le backlight, ôte les instructions qui en parlent. Aussi, change l'adresse I2C de ton écran si ça ne fonctionne pas du premier coup (tu peux la trouver avec un I2C scanner (https://playground.arduino.cc/Main/I2cScanner/))
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 27, 2019, 01:30 am
le code que tu ma passer marche et chaque code de chaque bibliothèque marche avec leur propre code  y a pas de soucie la dessus mais avec notre code sa ne marche pas comme il faut.

j ai de jas fait le scan c est un 0x27 et je voie pas vraiment quoi test d autre et dans le code que tu ma passer il n initialise pas l ecran et sans sa l'ecran reste vide
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 27, 2019, 09:26 am
Je suis un peu perdu entre ce qui marche et ce qui ne marche pas..

Mets en fichier attaché le code qui te semble le mieux, je vais regarder ça
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 27, 2019, 11:29 am
salut

ok jt envoie sa en pièce jointe

sinon avec cette écran aucun soucie d'affichage

(https://media.discordapp.net/attachments/412535649787183105/571626684529377300/JPEG_20190427_111842.jpg?width=490&height=659)


par contre le problème que je rencontre avec l'autre en 20*4 je le rencontre aussi avec un autre 16*2
et leur point commun contrairement a l autre c'est le variateur intégré derrière

(https://media.discordapp.net/attachments/412535649787183105/571626685116448779/JPEG_20190427_111859.jpg?width=490&height=659)

(https://media.discordapp.net/attachments/412535649787183105/571626684038774785/JPEG_20190427_111922.jpg?width=490&height=659)

(https://media.discordapp.net/attachments/412535649787183105/571626684529377301/JPEG_20190427_111948.jpg?width=490&height=659)

(https://media.discordapp.net/attachments/412535649787183105/571626685116448778/JPEG_20190427_112005.jpg?width=490&height=659)


et selon moi c cause de lui il doit rajouter du délais au traitement du menu ou ne pas savoir interpréter quelque truc
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 27, 2019, 12:22 pm
j ai éditer le code prend celui la j ai fait du ménage et refait EEPROM tout propre je v le test avec les autre affichage et te redit

edit

sinon avec la librairie la ou l initialisation de l ecran 20*4 se passe le mieux c'est avec le code
mais sa ne règle pas le soucie

Code: [Select]
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);


librairie utiliser et doc (https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!4-bit-parallel-connection)




Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 27, 2019, 12:55 pm
le menu réapparait dans affichage quand je change dans affichage
lcd.setCursor(2, 0);

je voie de nouveau tout les menu mais par contre je voie toujours pas les sous menu 22, 31 et 32 ,41 et 42

et toujours le problème d affichage quand j appuis sur select pour éditer le sous menu

Code: [Select]

lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(2, 1);
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 27, 2019, 01:14 pm
Si tu as fait des modifications, reposte le code le plus récent pour qu'on parte sur la même chose.

Je n'ai pas eu le temps ce matin, je vais essayer de regarder cet après midi.

Ton LCD est en I2C ou autre ?
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 27, 2019, 01:34 pm
tkt pas prend ton temps c dejas bien que tu m aide

le dernier c le plus propre j ai rien retoucher jte le remet

par contre quand je regarde les exemple fourni de la librairie dans Arduino

https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home

il ont l aire de devoir traiter les donnée en 4 et 8 byte mais pour moi y a beaucoup de chinois dedans c peut être une piste


pour le premier en 16/2 ou j ai pas de soucie non pas de i2c

pour les deux autre avec le variateur souder derrière oui il sont en I2c et c avec eux le soucie
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 27, 2019, 03:45 pm
Bon, j'ai revu un peu le code, en surface sans gros changement.

J'ai d'abord défini des valeurs pour l'écran : NB_LIGNES et NB_COL. Ça permet de tester divers écrans sans chercher les lignes à modifier.

Ensuite, j'ai remanié ta gestion de l'EEPROM : tel que tu le fais, tu la sollicites trop souvent. Une EEPROM Arduino a une durée d'utilisation de 100000 cycles d'écriture / effacement. A force, tu risques de la fair vieillir prématurément. Il faut s'en servir uniquement pour le stockage, pas comme une mémoire ordinaire. Au démarrage, tu lis les valeurs et tu mets les variables (Tmin, Tmax, etc) à jour. Ensuite tu utilises tes variables normalement et tu stockes en EEPROM uniquement lorsqu'une de ces variables est modifiée. Aucun besoin de lire l'EEPROM en cours de programme, elle ne sert qu'au démarrage pour se souvenir des réglages précédents (en cas de coupure de courant ou de plantage du code).

Dans la gestion des menus, j'ai simplifié les if.
Si je comprends bien, pour le menu 11
Code: [Select]
if (Tmin <= 30) Tmin++; else Tmin = 5;
tu augmentes Tmin et tu passes à 5 si ça dépasse 30 : c'est une sorte de boucle ? 5 6 7 ... 29 30 5 6 etc.
Si oui, ça peut s'écrire plus simplement (pour le fun car ton if est très bien) :
Code: [Select]
Tmin = (Tmin-4)%26 + 5;

J'ai ôté les + String('\xDF') qui risquent de poser problème pour le LCD.

Enfin, je me demande si le menu 32 est correct (lignes 261 & 262) : vérifie au besoin.

Sinon, je ne vois pas ce qui pourrait empêcher le code de marcher. A toi...
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 27, 2019, 04:26 pm
ok tout marche bien sur l écran non I2C mais toujours la mème chose avec c PU#### d'écran I2C je croie que je v les garder pour des truc simple a afficher et opter pour d autre type d'écran.

tu ma dit que tu n utiliser pas se type d'écran tu utilise quoi et tu conseillerez quoi ?

j ai vu d'autre type d'écran mais je c pas encore si c'est velue a comprendre pour mon lvl ?

https://www.amazon.fr/dp/B078J5TS2G/ref=twister_B078KKSGBM?_encoding=UTF8&psc=1 (https://www.amazon.fr/dp/B078J5TS2G/ref=twister_B078KKSGBM?_encoding=UTF8&psc=1)
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 27, 2019, 04:55 pm
Oui, c'est ça que j'utilise : écran TFT couleur en SPI. Il existe en touchscreen ce qui te permet de faire une interface tactile.

SPI ! c'est important pour ne pas avoir trop de fils à connecter. (un peu comme l'I2C)

Si tu veux monter jusque vers 20€, tu peux prendre un écran Nextion (https://nextion.itead.cc/nextion-shop/), c'est top. Nextion propose un logiciel pour construire l'IHM, ce qui simplifie énormément le travail.

(https://cdn.itead.cc/media/catalog/product/cache/1/image/400x400/9df78eab33525d08d6e5fb8d27136e95/_/-/_-5__1.jpg)


Moi, je n'en ai jamais testé, mais on trouve de l'aide sur le forum pour ça aussi.
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 27, 2019, 04:56 pm
Si tout marche bien maintenant, enlève les lignes à la fin du setup, qui ne servent à rien et diminuent la longévité de ton EEPROM

Code: [Select]
 Serial.println(EEPROM.read(0));
 Serial.println(EEPROM.read(4));
 Serial.println(EEPROM.read(6));
 Serial.println(EEPROM.read(8));
 Serial.println(EEPROM.read(10));
 Serial.println(EEPROM.read(12));
 Serial.println(EEPROM.read(14));
 Serial.println(EEPROM.read(16));
 Serial.println(EEPROM.read(18));
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 27, 2019, 05:52 pm
ok je nettoie sa

au début en faite je penser que EEPROM avez une durée de vie mais a l écriture  je ne penser pas que la lecture impacter aussi


sinon ouep je vient voir une vidéo sur le logiciel de l'écran et c juste ouf et sa na pas l aire incompréhensible je croie je v partir sur sa. leur logiciel et utilisable pour tout leur écran ? ou faut que je fasse gaffe ?
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 27, 2019, 05:55 pm
Je pense que c'est pour tous leurs écrans. Je crois que tu peux le télécharger et l'essayer sans acheter d'écran
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 27, 2019, 06:39 pm
bin parfait je v regarder sa et m en prendre un le mois prochain je croie en tout cas un grand merci pour ton aide tu ma fait avancer énormément dans mon projet.
Title: Re: besoin d'aide pour un menu,
Post by: lesept on Apr 27, 2019, 07:08 pm
Pas de souci, ça m'a fait plaisir. A+ pour la suite !
Title: Re: besoin d'aide pour un menu,
Post by: hbachetti on Apr 28, 2019, 11:03 am
J'ai suivi en diagonale.

Si j'ai bien compris :
Vous ne parvenez pas à afficher quoi que ce soit avec un LCD 20x4 I2C ?

Pourtant avec la librairie proposée par lesept : https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library.git (https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library.git), ça marche tout seul.

Title: Re: besoin d'aide pour un menu,
Post by: dfgh on Apr 28, 2019, 12:48 pm
hello
moi j'utilise celle ci sans prob
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 29, 2019, 08:33 am
dfgh hbachetti en faite je n 'est aucun soucie pour des affichage simple mais avec mon menu je doit avoir certaine incompatibilité avec la librairie

sans I2C sa marche impeccable et des que je passe avec I2C tout est en vrac et j ai pu constater que beaucoup de monde était dans mon cas
Title: Re: besoin d'aide pour un menu,
Post by: hbachetti on Apr 29, 2019, 09:39 am
Tu pourrais être plus précis et poster le code avec I2C ?
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 29, 2019, 01:22 pm
bien-sur pas de soucie jte poste sa. etre plus précis c compliquer pour moi je suis novice sur le Arduino


pas de soucie quand je suis sans I2C mon menu affiche bien je peux naviguer rentrer dans les sous menu et les éditer

par contre en I2C mes sonde sont bien afficher j arrive a rentrer dans le menu j'affiche les menu 10,20,30

pour les sous menu seul les sous menu 11,12 et 21 apparaisse le 22 j ai uniquement le dernier caractère de mon sous menu qui s affiche

et quand je souhaite augmenter la température de ma regul dans le sous menu l' affichage de celui si plante

second soucie il ne prend plus en conte mes ventilo et ne d'éclanche plus

merci

Title: Re: besoin d'aide pour un menu,
Post by: hbachetti on Apr 29, 2019, 11:03 pm
Il n'y a pas de LCD I2C dans ce code.
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 30, 2019, 10:48 am
ah !!! zut je me suis planté de code dsl
Title: Re: besoin d'aide pour un menu,
Post by: hbachetti on Apr 30, 2019, 11:03 am
Il manque :
- type de carte utilisée
- librairie LCD utilisée

Title: Re: besoin d'aide pour un menu,
Post by: hbachetti on Apr 30, 2019, 11:27 am
J'ai trouvé :  https://bitbucket.org/fmalpartida/new-liquidcrystal/src

Dans to premier code :

Code: [Select]

LiquidCrystal_I2C lcd(0x27,20,4);// adressage de votre carte.


Cette librairie possède un constructeur qui correspond à ce passage de paramètres mais les paramètres ne sont pas ceux que tu crois :

Code: [Select]

   LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t lcd_Addr, uint8_t backlighPin,
                                     t_backlightPol pol = POSITIVE)
   // plus loin dans ton setup :
  lcd.init();             // inutile
  lcd.backlight();
  lcd.begin(16, 2);  // 16x2 ???


Tu mélanges tout.

Parlons du deuxième code :

Code: [Select]

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);


Les paramètres correspondent à ce constructeur :

Code: [Select]
LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t lcd_Addr, uint8_t En, uint8_t Rw,
                                     uint8_t Rs, uint8_t d4, uint8_t d5,
                                     uint8_t d6, uint8_t d7, uint8_t backlighPin,
                                     t_backlightPol pol = POSITIVE )


Ce constructeur permet de préciser quelles pins du convertisseur I2C sont reliées aux pins de l'afficheur.
Es-tu sûr de la correspondance ?

Sincèrement tu ferais mieux d'utilisée cette librairie : Arduino-LiquidCrystal-I2C-library.git (https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library.git)

Dans le premier code, supprime l'appel à lcd.init() et les paramètres de lcd.begin()

Code: [Select]

//  lcd.init();
  lcd.backlight();
  lcd.begin();


La librairie new-liquidcrystal est un monstre qui permet d'adresser beaucoup d'afficheurs.
Inutile dans ton cas.
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 30, 2019, 12:42 pm
je v essayer quand je rentre mais j'ai test cette librairie en première. jte redit en tout cas merci de te pencher sur mon soucie 
Title: Re: besoin d'aide pour un menu,
Post by: Dams501 on Apr 30, 2019, 01:07 pm
au passage j ai jeté un coups d'œil a ton blog y a pas mal de contenu c cool. ta fait pas mal de chose sur les capteur et du coups je suis a la recherche d'une sonde d'humidité qui ressemblerai a la DS18B20 la forme la taille etc il ne faut pas plus grand car dans l idéale il faudrait que je puisse l envoyer dans un trous entre 5 et 10 mm et que les connectique soit étanche car elle sera coulé dans de la pierre reconstitué ?
Title: Re: besoin d'aide pour un menu,
Post by: hbachetti on May 01, 2019, 03:20 pm
Je ne connais pas de capteur d'humidité de cette taille.