Go Down

Topic: besoin d'aide pour un menu, (Read 2943 times) previous topic - next topic

Dams501

avec la bibliothèque que tu ma passer je n est carrément aucun affichage
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

Dams501

vla la doc de mon écran mais j ai tout comme eux
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

Dams501

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
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

Dams501

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);
  }

}
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

lesept

A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Dams501

#95
Apr 26, 2019, 11:29 pm Last Edit: Apr 26, 2019, 11:30 pm by Dams501
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

post

il as le mème soucie que moi  

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


a demain bonne soiré  :D  :D  :D  :D
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

lesept

#96
Apr 26, 2019, 11:58 pm Last Edit: Apr 27, 2019, 12:14 am by lesept
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, 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)
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Dams501

#97
Apr 27, 2019, 01:30 am Last Edit: Apr 27, 2019, 01:36 am by Dams501
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
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

lesept

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
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Dams501

#99
Apr 27, 2019, 11:29 am Last Edit: Apr 27, 2019, 12:47 pm by Dams501
salut

ok jt envoie sa en pièce jointe

sinon avec cette écran aucun soucie d'affichage




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










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
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

Dams501

#100
Apr 27, 2019, 12:22 pm Last Edit: Apr 27, 2019, 12:38 pm by Dams501
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




C'est a force d'enfiler les poules que l'on finit par casser des œufs !

Dams501

#101
Apr 27, 2019, 12:55 pm Last Edit: Apr 27, 2019, 01:01 pm by Dams501
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);
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

lesept

#102
Apr 27, 2019, 01:14 pm Last Edit: Apr 27, 2019, 02:30 pm by lesept
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 ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Dams501

#103
Apr 27, 2019, 01:34 pm Last Edit: Apr 27, 2019, 01:36 pm by Dams501
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
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

lesept

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...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up