Go Down

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

lesept

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

Dams501

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

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

Dams501

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() {

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

lesept

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 :
  • MAGIC en 0
  • Tmin en 4
  • Tmax en 6
  • TminNID en 8
  • etc.
(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).
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Dams501

il n y a que le bouton Home qui fonctionne je sont print mais les autre rien
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

lesept

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

Dams501

#81
Apr 26, 2019, 04:00 pm Last Edit: Apr 26, 2019, 04:02 pm by Dams501
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
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

lesept

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

Dams501

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

lesept

Je ne comprends pas : avant ça fonctionnait. Ensuite, les seules modifications c'est d'ajouter l'EEPROM et le LCD à 4 lignes ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Dams501

l EEPROM sa marchai également c'est uniquement depuis l écran 
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

Dams501

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

lesept

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

lesept

Tu pourrais essayer avec une autre bibliothèque pour le LCD ?
Essaye celle-ci : 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() {}
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Dams501

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



2 j appuis sur UP
 le menu 10 s'affiche

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




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




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

Code: [Select]
Bouton select 250867




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





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





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

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





le dernier menu même chose
uniquement le sous menu




8  retour a la page d accueil avec le home
  pour celui ci c ok la page d accueil revient a la normal
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

Go Up