lcd 16*2 i2c adafruit menu Help

Hi every one !

I’m looking for a functionnalmenu-submenu for a cat feeder-dryer project ( one more)
at first, yo know, i have to build a functionnal menu.

In a perfect way, i would choose how many lunch per day, weight of food, it’s also displaying date and time.

but doesn’t work :confused: can some one give me a clue with my code ?

#include <Adafruit_MotorShield.h>
    #include <Adafruit_RGBLCDShield.h>
    #include <Wire.h>
    #include "RTClib.h"
    RTC_DS1307 RTC;
     
     
     
    Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();
    #define WHITE 0x7
    /* Horloge */
    const char *tableauDesJours[] = {"Sam", "Dim", "Lun", "Mar", "Merc", "Jeu", "Vend",};
    // define some values used by the panel and buttons
    int lcd_key = 0;
    int spd = 0 ;
    int rep = 0 ;
     
    // Main menu array
    String mainMenu[5];
    // Main menu default choice
    int mainSwitch = 0;
    // Amount of items in our main menu.
    // Can be found by formula:
    // (Amount_of_items - 1)
    #define mainMenuItems 4
     
    void setup()
    {
      Serial.begin(9600);
      lcd.begin(0x20, 16, 2);
      Wire.begin();
      RTC.begin();
     
      lcd.setCursor(0, 0);
      print_date();
     
      /* repas alarme -dev */
      // if(now.hour() == 17 && now.minute() == 11) {
      //Day of week : 1 pour lundi, 2 pour mardi, ...
      // lcd.print("alarme");
      //Pas d'alarme
      // } else {
      //Serial.println("Pas d'alarme");
      /* horloge et calendrier */
     
     
      // Filling our main menu items
      mainMenu[0] = "eau & croq    ";
      mainMenu[1] = "ration + 5 Gr ";
      mainMenu[2] = "ration - 5 Gr ";
      mainMenu[3] = "nbre Repas/24h";
    }
     
    uint8_t i = 0;
     
     
    void ration (byte spd)
    {
      print_date();
      lcd.print("RATION?");
      // Loop for reading buttons
      lcd_key = lcd.readButtons();
     
      switch (lcd_key)
      {
        case (BUTTON_SELECT):
     
          if (spd = 1)
          {
            lcd.print ("Action valide");
            lcd.print ("ration + 5Gr");
          }
          else if (spd = 2)
          {
            lcd.print ("Action valide");
            lcd.print ("ration - 5Gr");
          }
          break;
     
     
        // back to main menu on the left button press
        case (BUTTON_LEFT):
     
     
          break;
      }
      return;
    }
    void feed()
    {
      print_date();
      lcd.print("CROQ & EAU");
      lcd_key = lcd.readButtons();
     
      switch (lcd_key)
      {
        case (BUTTON_UP):
          lcd.print ("Action valide");
          lcd.print ("feed the beast");
          break;
        case (BUTTON_DOWN):
          lcd.print ("Action valide");
          lcd.print ("niagara");
     
          break;    // back to main menu on the left button press
        case (BUTTON_LEFT):
     
     
          break;
      }
      return;
    }
     
    void Repas()
    {
      print_date();
      lcd.print("MIAM");
      lcd_key = lcd.readButtons();
     
      switch (lcd_key)
      {
        case (BUTTON_UP):
          lcd.print ("+1 repas/24H ? ");
          rep = rep + 1;
          lcd.print(rep);
          lcd.print ("repas /24H");
     
          break;
     
        case (BUTTON_DOWN):
          lcd.print ("+1 repas/24H ? ");
          rep = rep - 1;
          lcd.print(rep);
          lcd.print ("repas /24H");
     
          break;
     
        // back to main menu on the left button press
        case (BUTTON_LEFT):
     
          break;
      }
      return;
    }
     
    void print_date()
    {
      DateTime now = RTC.now();
      Wire.beginTransmission(0x68); // Accède au RTC I2C d'adresse 0x68.
      Wire.write(0x03); // Pointe le registre du dayOfWeek (0x03).
      Wire.requestFrom(0x68, 1); // Demande de reception d'un octet depuis registre (0x03).
      byte dayOfWeek = Wire.read(); // Stocke la valeur reçue.
      Wire.endTransmission();
     
      lcd.home();
      lcd.setCursor(0, 0);
      String msg_to_print = String(tableauDesJours[dayOfWeek]);
      msg_to_print += " ";
      msg_to_print += String(now.day() / 10, DEC) + String(now.day() % 10, DEC);
      msg_to_print += "/";
      msg_to_print += String(now.month() / 10, DEC) + String(now.month() % 10, DEC);
      msg_to_print += " ";
      msg_to_print += String(now.hour() / 10, DEC) + String(now.hour() % 10, DEC);
      msg_to_print += ":";
      msg_to_print += String(now.minute() / 10, DEC) + String(now.minute() % 10, DEC);
     
      lcd.print(msg_to_print);
      lcd.setCursor(0, 1);
     
    }
     
    // Main loop
    void loop()
    {
      lcd_key = lcd.readButtons();
     
  switch (lcd_key)
  {
        case (BUTTON_LEFT):
          print_date();
          lcd.setCursor(0, 1);
          lcd.print("     test      ");
          break;
     
     
        // Enter a sub menu on Right button press
        case (BUTTON_RIGHT):
      
         switch (mainSwitch) {
        case 0:
          feed();
          break;
        case 1:
          ration (spd);
          break;
        case 2:
          ration (spd);
          break;
        case 3:
          Repas();
          break;
              break;
          }
     
        // Move to the next sub menu (UP)
        case (BUTTON_UP):
          mainSwitch = (mainSwitch == 0) ? mainMenuItems : mainSwitch - 1;
          lcd.setCursor(0, 1);
          lcd.print(mainMenu[mainSwitch]);
          delay(300);
     
          break;
     
     
        // Move to the next sub menu (DOWN)
        case (BUTTON_DOWN):
     
          mainSwitch = (mainSwitch > mainMenuItems - 1) ? mainSwitch = 0 : mainSwitch + 1;
          lcd.setCursor(0, 1);
          lcd.print(mainMenu[mainSwitch]);
          delay(300);
          break;
      }
   }
  1. what is your hardware - pls post your schematic or a self explaining picture of your wiring
  2. switch/case doesn't work with strings - have a look at the syntax that is used for switch/case

Thank’s a lot, during the week, i’ve made some change about the code, with help !

it’s arduino uno rev3, with a dstimer1307,motorshield v2.3 adafruit 1438 and lcd shield adafruit 772 with six buttons.
all is I2C connected.

#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>
#include <Adafruit_MotorShield.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

// initialisation des moteurs
Adafruit_MotorShield monShield = Adafruit_MotorShield();      // création de l'objet shield motor V3
Adafruit_DCMotor *moteurCroq = monShield.getMotor(1);         // création de l'objet moteurGauche par pointeur et repérage du numéro
Adafruit_DCMotor *moteurPompe = monShield.getMotor(4);        // création de l'objet moteurDroite par pointeur et repérage du numéro

// les différents états du menu
enum {
  date,
  miam,
  niagara,
  reprep,
  repas1,
  repas2,
  ratrat,
  ration1,
  ration2,
}
varmen = date; //
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();      // création de l'objet LCD shield adafruit 772
int     x = 8;                                            // nombre moyen de repas par jour

const char *tableauDesJours[] = {
  "Sam",
  "Dim",
  "Lun",
  "Mar",
  "Merc",
  "Jeu",
  "Vend"
};

int nour = 5000;                                     // temps en millis pour  5Gr
unsigned long rep = 86400000;                         // pour calcul de la distri auto
unsigned long Depart;

//--------------------------------------------------------------------------------
// INITIALISATION
//--------------------------------------------------------------------------------

void setup() {
  Wire.begin();                                       // On lance la communication i2c
  Serial.begin(9600);                                 // On lance la communication série

  lcd.begin(0x20, 16, 2);                             // On lance la communication avec l'écran
  lcd.setCursor(0, 0);                                // régle le curseur sur la première ligne première colonne

  RTC.begin();                                        //On lance la communication avec l'horloge
  monShield.begin();                                  //On lance la communication avec le shield

  Depart = millis();                                  // Enregistrement de mon point de départ

  uint8_t i = 0;
}
void loop()
{
  uint8_t lcd_key = lcd.readButtons();

  //   if ((millis() - Depart) >= rep) {                   // si rep ms se sont écoulées
  //   Depart = millis();                                // nouvelle enregistrement du point de départ modification en cours pour la nutrition programmée
  //}


  switch (varmen) {                                   // détermination de menu dans lequel on se trouve
    case (date) :
     if (lcd_key)  {
 DateTime now = RTC.now();
  RTC.adjust(DateTime(__DATE__, __TIME__));
  Wire.beginTransmission(0x68); // Accède au RTC I2C d'adresse 0x68.
  Wire.write(0x03); // Pointe le registre du dayOfWeek (0x03).
  Wire.requestFrom(0x68, 1); // Demande de reception d'un octet depuis registre (0x03).
  byte dayOfWeek = Wire.read(); // Stocke la valeur reçue.
  Wire.endTransmission();
  lcd.home();
  lcd.setCursor(0, 0);

  String msg_to_print = String(tableauDesJours[dayOfWeek]);
  msg_to_print += " ";
  msg_to_print += String(now.day() / 10, DEC) + String(now.day() % 10, DEC);
  msg_to_print += "/";
  msg_to_print += String(now.month() / 10, DEC) + String(now.month() % 10, DEC);
  msg_to_print += " ";
  msg_to_print += String(now.hour() / 10, DEC) + String(now.hour() % 10, DEC);
  msg_to_print += ":";
  msg_to_print += String(now.minute() / 10, DEC) + String(now.minute() % 10, DEC);

  lcd.print(msg_to_print);
}

      switch (lcd_key) {
        case (BUTTON_UP):                          // dans le cas du bouton haut
          varmen = miam;                           // passer au menu repas
          break;

        case (BUTTON_DOWN):                           // dans le cas du bouton bas
          varmen = reprep;                   // passer au menu ration
          // fin du switch/case lcd_key pour varmen == date
          break;
      }
      // fin du switch/case lcd_key pour varmen == ratrat
      break;
    case (miam) :
      if (lcd_key)  {
        lcd.clear() ;
        lcd.setCursor(0, 1);
        lcd.print ("miam miam select");
      }
      switch (lcd_key) {
        case (BUTTON_UP):
          varmen = niagara;
          break;

        case (BUTTON_DOWN):
          varmen =  date;
          break;

        case (BUTTON_SELECT):
          lcd.setCursor(0, 1);
          lcd.print("     MIAM !!!! !");

          moteurCroq->setSpeed(200); //On définit la vitesse de rotation
          moteurCroq->run(FORWARD); //On fait tourner les moteurs
          delay(1000); // pendant 1 seconde
          moteurCroq->run(RELEASE); //Puis on les arrête
          delay(500);
          moteurCroq->run(FORWARD); //On fait tourner les moteurs
          delay(1000); // pendant 1 seconde
          moteurCroq->run(RELEASE); //Puis on les arrête
          break;    // fin du switch/case lcd_key pour varmen == ratrat
      }

      break;
    case (niagara) :
      if (lcd_key)  {
        lcd.setCursor(0, 1);
        lcd.print ("  Niagara select  ");
      }
      switch (lcd_key) {
        case (BUTTON_UP):
          varmen = ratrat;
          break;

        case (BUTTON_DOWN):
          varmen = miam;
          break;

        case (BUTTON_SELECT):
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print("NIAGARA !!!");
          
          moteurPompe->setSpeed(200); //On définit la vitesse de rotation
          moteurPompe->run(FORWARD); //On fait tourner les moteurs
          delay(5000);
          moteurPompe->run(RELEASE); //Puis on les arrête
          break;
      } // fin du switch/case lcd_key pour varmen == niagara

      break;
    case (reprep) :
      if (lcd_key)  {
        lcd.setCursor(0, 1);
        lcd.print ("+1rep   -1rep");
      }
      switch (lcd_key) {
        case (BUTTON_UP):
          varmen = date;
          break;

        case (BUTTON_DOWN):
          varmen = ratrat;
          break;

        case (BUTTON_RIGHT):
          x = x - 1;
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print (x);
          lcd.print ("repas / J");
          break;

        case (BUTTON_LEFT):
          x = x + 1;
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print (x);
          lcd.print ("repas / J");
          break;
      }   // fin du switch/case lcd_key pour varmen == reprep

      break;
    case (ratrat) :
      if (lcd_key)  {
        lcd.setCursor(0, 1);
        lcd.print ("+5 Gr    -5 Gr");
      }
      switch (lcd_key) {
        case (BUTTON_UP):
          varmen = reprep;
          break;

        case (BUTTON_DOWN):
          varmen = niagara;
          break;

        case (BUTTON_RIGHT):
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print("FAIT - 5Gr !");
          nour = nour - 1000;
          break;

        case (BUTTON_LEFT):
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print("FAIT + 5Gr !");
          nour = nour + 1000;
          break;
      }      // fin du switch/case lcd_key pour varmen == ratrat

      break;
  } // fin du switch/case varmen
} // fin de loop()

Apparently you found the French section and got help, so this thread could be marked as solved?

rpt007:
Apparently you found the French section and got help, so this thread could be marked as solved?

hi rpt007!

yes, i've found the french section, znd asked them some help or explanation about my bugs.
but, you know,less users ..then i posted here until i found a solution.

so, not solved.
I understand that two post for a same problem could be useless, same if i think it could be seful.
if you think it's beter to close this one, i will.

"It does not work" does not mean much to us :wink: Please describe what you expect and what actually happens.

By the looks of things, I liked your first version a little better. loop() is a lot smaller and hence the code is easier to comprehend.

sterretje:
“It does not work” does not mean much to us :wink: Please describe what you expect and what actually happens.

By the looks of things, I liked your first version a little better. loop() is a lot smaller and hence the code is easier to comprehend.

yes i’ve made a version with more void (for the two motors and the date)

i’d like to explaibn butafetr a reset one press up, “miam miam select” and press select it launch motor_niag

with de +5 Gr and -5gr , the repas increase or decrease,
with +1 -1 rep it goes to “miam miam selet”

i thought there is a mistake in varmen, or some trouble vith the enum list but not clear to me :

#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>
#include <Adafruit_MotorShield.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

// initialisation des moteurs
Adafruit_MotorShield monShield = Adafruit_MotorShield();      // création de l'objet shield motor V3
Adafruit_DCMotor *moteurMiam = monShield.getMotor(1);         // création de l'objet moteurGauche par pointeur et repérage du numéro
Adafruit_DCMotor *moteurPompe = monShield.getMotor(4);        // création de l'objet moteurDroite par pointeur et repérage du numéro

// les différents états du menu
enum {
  date,
  miam,
  niagara,
  diner,
  repas1,
  repas2,
  rationner,
  ration1,
  ration2,
}
varmen = date; //
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();      // création de l'objet LCD shield adafruit 772
int     x = 8;                                            // nombre moyen de repas par jour

const char *tableauDesJours[] = {
  "Sam",
  "Dim",
  "Lun",
  "Mar",
  "Merc",
  "Jeu",
  "Vend"
};

int nour = 5000;                                     // temps en millis pour  5Gr
unsigned long rep = 86400000;                         // pour calcul de la distri auto
unsigned long Depart;

//--------------------------------------------------------------------------------
// INITIALISATION
//--------------------------------------------------------------------------------

void setup() {
  Wire.begin();                                       // On lance la communication i2c
  Serial.begin(9600);                                 // On lance la communication série

  lcd.begin(0x20, 16, 2);                             // On lance la communication avec l'écran
  lcd.setCursor(0, 0);                                // régle le curseur sur la première ligne première colonne

  RTC.begin();                                        //On lance la communication avec l'horloge
  monShield.begin();                                  //On lance la communication avec le shield

  Depart = millis();                                  // Enregistrement de mon point de départ

  uint8_t i = 0;
}
void print_date()
{ DateTime now = RTC.now();
  RTC.adjust(DateTime(__DATE__, __TIME__));
  Wire.beginTransmission(0x68); // Accède au RTC I2C d'adresse 0x68.
  Wire.write(0x03); // Pointe le registre du dayOfWeek (0x03).
  Wire.requestFrom(0x68, 1); // Demande de reception d'un octet depuis registre (0x03).
  byte dayOfWeek = Wire.read(); // Stocke la valeur reçue.
  Wire.endTransmission();
  lcd.home();
  lcd.setCursor(0, 0);

  String msg_to_print = String(tableauDesJours[dayOfWeek]);
  msg_to_print += " ";
  msg_to_print += String(now.day() / 10, DEC) + String(now.day() % 10, DEC);
  msg_to_print += "/";
  msg_to_print += String(now.month() / 10, DEC) + String(now.month() % 10, DEC);
  msg_to_print += " ";
  msg_to_print += String(now.hour() / 10, DEC) + String(now.hour() % 10, DEC);
  msg_to_print += ":";
  msg_to_print += String(now.minute() / 10, DEC) + String(now.minute() % 10, DEC);

  lcd.print(msg_to_print);
}
void motor_miam()
{
  lcd.setCursor(0, 1);
  lcd.print("     MIAM !!!! !");

  moteurMiam->setSpeed(200); //On définit la vitesse de rotation
  moteurMiam->run(FORWARD); //On fait tourner les moteurs
  delay(1000); // pendant 1 seconde
  moteurMiam->run(RELEASE); //Puis on les arrête
  delay(500);
  moteurMiam->run(FORWARD); //On fait tourner les moteurs
  delay(1000); // pendant 1 seconde
  moteurMiam->run(RELEASE); //Puis on les arrête

}
void motor_niag()
{
  lcd.clear() ;
  lcd.setCursor(0, 1);
  lcd.print("NIAGARA !!!");
  moteurPompe->setSpeed(200); //On définit la vitesse de rotation
  moteurPompe->run(FORWARD); //On fait tourner les moteurs
  delay(5000);
  moteurPompe->run(RELEASE); //Puis on les arrête

}
void loop()
{
  uint8_t lcd_key = lcd.readButtons();

  //   if ((millis() - Depart) >= rep) {                   // si rep ms se sont écoulées
  //   Depart = millis();                                // nouvelle enregistrement du point de départ modification en cours pour la nutrition programmée
  //}

  switch (varmen) {                                   // détermination de menu dans lequel on se trouve
    case (date) :
      if (lcd_key)  {
        print_date();
      }
      // fin du switch/case lcd_key pour varmen == date

      switch (lcd_key) {
        case (BUTTON_UP):                          // dans le cas du bouton haut
          varmen = miam;                           // passer au menu repas
          break;

        case (BUTTON_DOWN):                           // dans le cas du bouton bas
          varmen = diner;                   // passer au menu ration
          break;
      }
      // fin du switch/case lcd_key pour varmen == date
      break;
    case (miam) :
      if (lcd_key)  {
        lcd.clear() ;
        lcd.setCursor(0, 1);
        lcd.print ("miam miam select");
      }
      switch (lcd_key) {
        case (BUTTON_UP):
          varmen = niagara;
          break;

        case (BUTTON_DOWN):
          varmen =  date;
          break;

        case (BUTTON_SELECT):
          motor_miam();
          break;
      }   // fin du switch/case lcd_key pour varmen == rationner

      break;
    case (niagara) :
      if (lcd_key)  {
        lcd.setCursor(0, 1);
        lcd.print ("  Niagara select  ");
      }
      switch (lcd_key) {
        case (BUTTON_UP):
          varmen = rationner;
          break;

        case (BUTTON_DOWN):
          varmen = miam;
          break;

        case (BUTTON_SELECT):
          motor_niag();
          break;
      } // fin du switch/case lcd_key pour varmen == niagara

      break;
    case (diner) :
      if (lcd_key)  {
        lcd.setCursor(0, 1);
        lcd.print ("+1rep   -1rep");
      }
      switch (lcd_key) {
        case (BUTTON_UP):
          varmen = date;
          break;

        case (BUTTON_DOWN):
          varmen = rationner;
          break;

        case (BUTTON_RIGHT):
          x = x - 1;
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print (x);
          lcd.print ("repas / J");
          break;

        case (BUTTON_LEFT):
          x = x + 1;
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print (x);
          lcd.print ("repas / J");
          break;
      }   // fin du switch/case lcd_key pour varmen == diner

      break;
    case (rationner) :
      if (lcd_key)  {
        lcd.setCursor(0, 1);
        lcd.print ("+5 Gr    -5 Gr");
      }
      switch (lcd_key) {
        case (BUTTON_UP):
          varmen = diner;
          break;

        case (BUTTON_DOWN):
          varmen = niagara;
          break;

        case (BUTTON_RIGHT):
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print("FAIT - 5Gr !");
          nour = nour - 1000;
          break;

        case (BUTTON_LEFT):
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print("FAIT + 5Gr !");
          nour = nour + 1000;
          break;
      }      // fin du switch/case lcd_key pour varmen == rationner

      break;
  } // fin du switch/case varmen
} // fin de loop()

Can't really help you, but I suspect memory issues as I can't immediately find anything wrong that would explain the behaviour that you describe.

Get rid of String (capital S) in the print_date() function.

void print_date()
{ DateTime now = RTC.now();
  RTC.adjust(DateTime(__DATE__, __TIME__));
  Wire.beginTransmission(0x68); // Accède au RTC I2C d'adresse 0x68.
  Wire.write(0x03); // Pointe le registre du dayOfWeek (0x03).
  Wire.requestFrom(0x68, 1); // Demande de reception d'un octet depuis registre (0x03).
  byte dayOfWeek = Wire.read(); // Stocke la valeur reçue.
  Wire.endTransmission();
  lcd.home();
  lcd.setCursor(0, 0);


  char msg_to_print[20];
  sprintf("%s %02d/%02d %02d:%02d", tableauDesJours[dayOfWeek], now.day(), now.month(), now.hour(), now.minute());
  lcd.print(msg_to_print);
}

Not compiled, not tested.

When you compile, how much memory (code and sram) is reported to be used?

35% with your advice, 41 without

edit 1 : code not workin and too complex for my little brain !!

thank’s for all, found what’s gone wrong so i share the code :slight_smile:

#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>
#include <Adafruit_MotorShield.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

// initialisation des moteurs
Adafruit_MotorShield monShield = Adafruit_MotorShield();      // création de l'objet shield motor V3
Adafruit_DCMotor *moteurMiam = monShield.getMotor(1);         // création de l'objet moteurGauche par pointeur et repérage du numéro
Adafruit_DCMotor *moteurPompe = monShield.getMotor(4);        // création de l'objet moteurDroite par pointeur et repérage du numéro

// les différents états du menu
enum {
  date,
  miam,
  niagara,
  diner,
  repas1,
  repas2,
  rationner,
  ration1,
  ration2,
}
varmen = date; //
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();      // création de l'objet LCD shield adafruit 772
int     x = 8;                                            // nombre moyen de repas par jour

const char *tableauDesJours[] = {
  "Sam",
  "Dim",
  "Lun",
  "Mar",
  "Merc",
  "Jeu",
  "Vend"
};

int nour = 5000;                                     // temps en millis pour  5Gr
unsigned long rep = 86400000;                         // pour calcul de la distri auto
unsigned long Depart;

//--------------------------------------------------------------------------------
// INITIALISATION
//--------------------------------------------------------------------------------

void setup() {
  Wire.begin();                                       // On lance la communication i2c
  Serial.begin(9600);                                 // On lance la communication série

  lcd.begin(0x20, 16, 2);                             // On lance la communication avec l'écran
  lcd.setCursor(0, 0);                                // régle le curseur sur la première ligne première colonne

  RTC.begin();                                        //On lance la communication avec l'horloge
  monShield.begin();                                  //On lance la communication avec le shield

  Depart = millis();                                  // Enregistrement de mon point de départ

  uint8_t i = 0;
}
void print_date()
{ DateTime now = RTC.now();
  //  RTC.adjust(DateTime(__DATE__, __TIME__));
  Wire.beginTransmission(0x68); // Accède au RTC I2C d'adresse 0x68.
  Wire.write(0x03); // Pointe le registre du dayOfWeek (0x03).
  Wire.requestFrom(0x68, 1); // Demande de reception d'un octet depuis registre (0x03).
  byte dayOfWeek = Wire.read(); // Stocke la valeur reçue.
  Wire.endTransmission();
  lcd.home();
  lcd.setCursor(0, 0);

  String msg_to_print = String(tableauDesJours[dayOfWeek]);
  msg_to_print += " ";
  msg_to_print += String(now.day() / 10, DEC) + String(now.day() % 10, DEC);
  msg_to_print += "/";
  msg_to_print += String(now.month() / 10, DEC) + String(now.month() % 10, DEC);
  msg_to_print += " ";
  msg_to_print += String(now.hour() / 10, DEC) + String(now.hour() % 10, DEC);
  msg_to_print += ":";
  msg_to_print += String(now.minute() / 10, DEC) + String(now.minute() % 10, DEC);

  lcd.print(msg_to_print);
}
void motor_miam()
{
  lcd.setCursor(0, 1);
  lcd.print("     MIAM !!!! !");
  Serial.print("     MIAM !!!! !");
  moteurMiam->setSpeed(200); //On définit la vitesse de rotation
  moteurMiam->run(FORWARD); //On fait tourner les moteurs
  delay(1000); // pendant 1 seconde
  moteurMiam->run(RELEASE); //Puis on les arrête
  delay(500);
  moteurMiam->run(FORWARD); //On fait tourner les moteurs
  delay(1000); // pendant 1 seconde
  moteurMiam->run(RELEASE); //Puis on les arrête

}
void motor_niag()
{
  lcd.clear() ;
  lcd.setCursor(0, 1);
  lcd.print("NIAGARA !!!");
  Serial.print("NIAGARA !!!");
  moteurPompe->setSpeed(200); //On définit la vitesse de rotation
  moteurPompe->run(FORWARD); //On fait tourner les moteurs
  delay(5000);
  moteurPompe->run(RELEASE); //Puis on les arrête

}
void loop()
{
  uint8_t lcd_key = lcd.readButtons();

  //   if ((millis() - Depart) >= rep) {                   // si rep ms se sont écoulées
  //   Depart = millis();                                // nouvelle enregistrement du point de départ modification en cours pour la nutrition programmée
  //}

  switch (varmen) {                                   // détermination de menu dans lequel on se trouve
    case (date) :
      if (lcd_key)  {
        print_date();
      }
      // fin du switch/case lcd_key pour varmen == date

      switch (lcd_key) {
        case (BUTTON_UP):                          // dans le cas du bouton haut
          varmen = miam;   // passer au menu repas
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print ("miam miam select   ");
          break;
        case (BUTTON_DOWN):                           // dans le cas du bouton bas
          varmen = diner;                   // passer au menu ration
          lcd.setCursor(0, 1);
          lcd.print ("+1rep   -1rep   ");
          break;
      }
      // fin du switch/case lcd_key pour varmen == date
      break;
    case (miam) :
      if (lcd_key)  {
        lcd.clear() ;
        lcd.setCursor(0, 1);
        lcd.print ("miam miam select");
      }
      switch (lcd_key) {
        case (BUTTON_UP):
          varmen = niagara;
          lcd.setCursor(0, 1);
          lcd.print ("  Niagara select  ");
          break;

        case (BUTTON_DOWN):
          varmen =  date;
          print_date();
          break;

        case (BUTTON_SELECT):
          motor_miam();
          break;
      }   // fin du switch/case lcd_key pour varmen == rationner

      break;
    case (niagara) :
      if (lcd_key)  {
        lcd.setCursor(0, 1);
        lcd.print ("  Niagara select  ");
        Serial.print("    Niagara select ");
      }
      switch (lcd_key) {
        case (BUTTON_UP):
          varmen = rationner;
          lcd.setCursor(0, 1);
          break;

        case (BUTTON_DOWN):
          varmen = miam;
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print ("miam miam select");
          break;

        case (BUTTON_SELECT):
          motor_niag();
          break;
      } // fin du switch/case lcd_key pour varmen == niagara

      break;
    case (diner) :
      if (lcd_key)  {
        lcd.setCursor(0, 1);
        lcd.print ("+1rep   -1rep");
      }
      switch (lcd_key) {
        case (BUTTON_UP):
          varmen = date;
          print_date();
          break;

        case (BUTTON_DOWN):
          varmen = rationner;
          lcd.setCursor(0, 1);
          lcd.print ("+5 Gr    -5 Gr");
          break;

        case (BUTTON_RIGHT):
          x = x - 1;
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print (x);
          lcd.print ("repas / J");

          break;

        case (BUTTON_LEFT):
          x = x + 1;
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print (x);
           lcd.print ("repas / J");
          break;
      }   // fin du switch/case lcd_key pour varmen == diner

      break;
    case (rationner) :
      if (lcd_key)  {
        lcd.setCursor(0, 1);
        lcd.print ("+5 Gr    -5 Gr");
      }
      switch (lcd_key) {
        case (BUTTON_UP):
          varmen = diner;
          lcd.setCursor(0, 1);
          lcd.print ("+1rep   -1rep");
          break;

        case (BUTTON_DOWN):
          varmen = niagara;
          lcd.setCursor(0, 1);
          lcd.print ("  Niagara select  ");
          break;

        case (BUTTON_RIGHT):
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print("FAIT - 5Gr !");
          nour = nour - 1000;
          break;

        case (BUTTON_LEFT):
          lcd.clear() ;
          lcd.setCursor(0, 1);
          lcd.print("FAIT + 5Gr !");
          nour = nour + 1000;
          break;
      }      // fin du switch/case lcd_key pour varmen == rationner

      break;
  } // fin du switch/case varmen
} // fin de loop()