Besoin d'aide sur un menu de commande

Bonjour

besoin d'aide sur un menu de commande je ne trouve pas la solution pour la mettre en oeuvre

demarrage de la fonction voltmetre
voici mon code

Onglet A_MAIN

/*--------------------------------------------------------------
  ALIMENTATION ASTRO V3
  
  Programe:    
  Description:   5 canaux voltmètre DC avec des tensions affichées 
                 sur l'écran LCD à 1a décimale avec des diviseurs de tension sur A1 à A5.
                 Une sonde DHT22 calcul le point de rosée qui piloter un relais 
                 pour commuter un regulateur de la resistance chaufante.
                 Capteurs à effet Hall Allegro ACS712 calcul l'autonomie de la batteri 
                 ainsi que la consommation en Ah; Wh; mA;
                 
   Matériel: Arduino 2560 Atmel128
             LCD 4 x 16 DEM16481
             ACS712 30A
             DHT22
             Relais 5v
             Bouton de commande Select; Left; Down; Up; Right
            
  Raccordements:
  Relais PIN 13
  Sondes broche DS18B20 PIN 3         
  Diviseurs de tension sur PIN A1 à A5.
  Lcd 4X16 PIN (8, 9, 4, 5, 6, 7)
  Boutons de commnandes PIN A0
  DTH22 PIN PIN A6
  ACS712 PIN A7
  Bouton de commande PIN A0
  
  Logiciel: Développé en utilisant le logiciel Arduino 1.6.1 
  
  Date: 07/04/2015
  
  /* Inclut la librairie LiquidCrystal pour le LCD */
#include <LiquidCrystal.h>
#include "Menu.h" // Fichier d'entête avec les types pour le menu

/* Objet LCD sur les broches utilisées lcddem16481 */
static LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

/* Menu principal */
static const char* MAIN_MENU_ITEMS[] = {
  "VOLTMETRE",
  "CONS ELECTRIQUE",
  "TEMP BOITIER",
  "POINT DE ROSEE",
};
static const Menu_t MAIN_MENU = {
  "Votre choix ?",
  MAIN_MENU_ITEMS,
  4,
  &doMainMenuAction
};

/* Sous menu pour Point de rosée */
static const char* POINT_DE_ROSEE_MENU_ITEMS[] = {
  "POINT DE ROSEE",
  "PARAMETRE"

};
static const Menu_t POINT_DE_ROSEE_MENU = {
  "Votre choix ?",
  POINT_DE_ROSEE_MENU_ITEMS,
  1,
  &doPointDeRoseeMenuAction
};

/** Setup */
void setup() 
{

  /* Configuration du LCD */
  lcd.begin(16, 4); // Démarrer la librairie

 //Message de bienvenue
 lcd.setCursor(0,00); //En haut à gauche (numéroté depuis 0)
 lcd.print("Alim Astronomie"); // Afficher un petit message
 lcd.setCursor(0,01);   //Ligne du bas
 lcd.print("Mogenot D. V3");   // Afficher un petit message
 lcd.setCursor(0,02);   //Ligne du bas
 lcd.print("10/04/2015");   // Afficher un petit message
 
  delay(5000);  //intro de 5 secondes-
 
 lcd.setCursor(0,1);   //Ligne du bas
 lcd.print("               ");   //Effacer cette ligne
 lcd.setCursor(0,0);            
 lcd.print("               ");   //Effacer cette ligne
 lcd.setCursor(0,02);                      
 lcd.print("               ");   //Effacer cette ligne
 delay(5000);  //intro de 5 secondes-
}

/** Programme principal */
void loop() {

  /* Affiche le menu principal */
  displayMenu(MAIN_MENU);

  /* Démo pour montrer la sortie du menu */
  lcd.clear();
  lcd.print(F("Menu ferme"));
  delay(2000);
}

/** Fonction retournant le bouton appuyé (s'il y en a un). */
Button_t readPushButton(void) {

  /* Lecture de l'entrée A0 */
  unsigned int val = analogRead(A0);

  /* Test suivant les fourchettes de valeurs */
  if (val > 1000) return BP_NONE;
  if (val < 50) return BP_RIGTH;
  if (val < 195) return BP_UP;
  if (val < 380) return BP_DOWN;
  if (val < 555) return BP_LEFT;
  if (val < 790) return BP_SELECT;

  /* Par défaut aucun bouton n'est appuyé */
  return BP_NONE;
}

/** Affiche le menu passé en argument */
void displayMenu(const Menu_t &menu) {

  /* Variable pour le menu */
  byte selectedMenuItem = 0;   // Choix selectionné
  byte shouldExitMenu = false; // Devient true quand l'utilisateur veut quitter le menu
  Button_t buttonPressed;      // Contient le bouton appuyé

  /* Tant que l'utilisateur ne veut pas quitter pas le menu */
  while (!shouldExitMenu) {

    /* Affiche le menu */
    lcd.clear();
    lcd.print(menu.prompt);
    lcd.setCursor(0, 1);
    lcd.print(menu.items[selectedMenuItem]);

    /* Attend le relâchement du bouton */
    while (readPushButton() != BP_NONE);

    /* Attend l'appui sur un bouton */
    while ((buttonPressed = readPushButton()) == BP_NONE);

    /* Anti rebond pour le bouton */
    delay(30);

    /* Attend le relâchement du bouton */
    while (readPushButton() != BP_NONE);

    /* Gére l'appui sur le bouton */
    switch (buttonPressed) {
      case BP_UP: // Bouton haut = choix précédent

        /* Si il existe un choix précédent */
        if (selectedMenuItem > 0) {

          /* Passe au choix précédent */
          selectedMenuItem--;
        }
        break;

      case BP_DOWN: // Bouton bas = choix suivant

        /* Si il existe un choix suivant */
        if (selectedMenuItem < (menu.nbItems - 1)) {

          /* Passe au choix suivant */
          selectedMenuItem++;
        }
        break;

      case BP_LEFT: // Bouton gauche = sorti du menu
        shouldExitMenu = true;
        break;

      case BP_SELECT: //
      case BP_RIGTH:  // Bouton droit ou SELECT = validation du choix
        menu.callbackFnct(selectedMenuItem);
        break;
    }
  }
}

/** Affiche le choix de l'utilisateur */
void doMainMenuAction(byte selectedMenuItem) {

  /* Cas spécial pour Dr Freeman */
  if (selectedMenuItem == 2) {

    /* Affiche le sous-menu pour Point de rosée */
    displayMenu(POINT_DE_ROSEE_MENU);

  } else {

    /* Affiche le choix de l'utilisateur */
    displayChoice(selectedMenuItem, MAIN_MENU_ITEMS);
  }
}

/** Affiche le choix de l'utilisateur */
void doPointDeRoseeMenuAction(byte selectedMenuItem) {

  /* Affiche le choix de l'utilisateur */
  displayChoice(selectedMenuItem, POINT_DE_ROSEE_MENU_ITEMS);
}

/** Affiche le choix de l'utilisateur */
void displayChoice(byte selectedMenuItem, const char** items) {

  /* Affiche le choix de l'utilisateur */
  lcd.clear();
  lcd.print(F("Z'avez choisi :"));
  lcd.setCursor(0, 1);
  lcd.print(items[selectedMenuItem]);

  /* Attend l'appui sur le bouton gauche ou SELECT */
  byte buttonPressed;
  do {
    buttonPressed = readPushButton();
  }
  while (buttonPressed != BP_LEFT && buttonPressed != BP_SELECT);
}

Onglet Menu.h

#ifndef _Menu_h_
#define _Menu_h_

/* Structure d'un menu */typedef struct {  
const char* prompt;     // Titre du menu  
const char** items;     // Tableau de choix du menu  
 const uint8_t nbItems;  // Nombre de choix possibles  
void (*callbackFnct)(uint8_t menuItemSelected); // Pointeur sur fonction pour gérer le choix de l'utilisateur
} Menu_t; 

/* Listes des touches de la shield lcd DFrobots */
typedef enum {  
BP_NONE,   // Aucun bouton appuyé  
BP_SELECT, // Bouton SELECT  
BP_LEFT,   // Bouton gauche  
BP_RIGTH,  // Bouton droite  
BP_UP,     // Bouton haut  
BP_DOWN    // Bouton bas
} Button_t; 

#endif

Onglet VOLTMETRE

/*--------------------------------------------------------------

Description: 5 canaux voltmètre DC avec des tensions affichées 
                 sur l'écran LCD à 1a décimale 
  
  Matériel: diviseurs de tension sur A1 à A4. 
              
--------------------------------------------------------------*/

#define NUM_SAMPLES 10 // nombre d'échantillons analogiques à prendre par la lecture, par canal

// valeurs d'étalonnage de diviseur de tension
#define DIV_1    8.785
#define DIV_2    8.785
#define DIV_3    8.785
#define DIV_4    8.785

// Valeur de tension de référence ADC / calibration
#define V_REF    4.95

int sum[4] = {0};                // sommes d'échantillons prélevés
unsigned char sample_count = 0;  // taille de l'échantillon
float voltage[5] = {0.0};        // tensions calculées
char l_cnt = 0;                  // utilisé dans »pour« boucles
 
void Voltmetre ()    // Initialisation
{
   
  Serial.begin(9600);     // initialiser une communication série à 9600 bps :
     
  // prendre un certain nombre d'échantillons analogiques et de les additionner
    while (sample_count < NUM_SAMPLES) {
        // sample each channel A1 to A4
        for (l_cnt = 0; l_cnt < 4; l_cnt++) {
            sum[l_cnt] += analogRead(A1 + l_cnt);
        }
        sample_count++;
        delay(10);
    }
    // calculer la tension de chaque canal
    for (l_cnt = 0; l_cnt < 4; l_cnt++) {
        voltage[l_cnt] = ((float)sum[l_cnt] / (float)NUM_SAMPLES * V_REF) / 1024.0;
    }
    
    // tensions d'affichage sur l'écran LCD
    // chaque tension est multipliée par le réseau de résistances
    // facteur de division pour calculer la tension réelle
   // tension 1 - A (pin A1)
    lcd.setCursor(0, 1);
    lcd.print("A ");
    lcd.print(voltage[0] * DIV_1, 1);
    lcd.print("V ");
    
    // tension 2 - B (pin A2)
    lcd.setCursor(8, 1);
    lcd.print("B ");
    lcd.print(voltage[1] * DIV_2, 1);
    lcd.print("V ");
    
    // tension 3 - C (pin A3)
    lcd.setCursor(-4, 2);
    lcd.print("C ");
    lcd.print(voltage[2] * DIV_3, 1);
    lcd.print("V ");
    
    // tension 4 - D (pin A4)
    lcd.setCursor(4, 2);
    lcd.print("D ");
    lcd.print(voltage[3] * DIV_4, 1);
    lcd.print("V ");
     
    // réinitialiser le nombre et les montants
    sample_count = 0;
    for (l_cnt = 0; l_cnt < 4; l_cnt++) {
        sum[l_cnt] = 0;
    }
}

Merci

Je galère je rame je veux dire
Merci

hello
après avoir affiché le choix de l'utilisateur et attendu que la touche "select" ou "left" soit relachée,
il faut aller dans une fonction "d'aiguillage" ( switch..case 0, case 1, case 2, case 3).
case 0 doit appeler la fonction voltmetre.
regarde les modifs sur ton code

/*--------------------------------------------------------------
  ALIMENTATION ASTRO V3
  
  Programe:    
  Description:   5 canaux voltmètre DC avec des tensions affichées 
                 sur l'écran LCD à 1a décimale avec des diviseurs de tension sur A1 à A5.
                 Une sonde DHT22 calcul le point de rosée qui piloter un relais 
                 pour commuter un regulateur de la resistance chaufante.
                 Capteurs à effet Hall Allegro ACS712 calcul l'autonomie de la batteri 
                 ainsi que la consommation en Ah; Wh; mA;
                 
   Matériel: Arduino 2560 Atmel128
             LCD 4 x 16 DEM16481
             ACS712 30A
             DHT22
             Relais 5v
             Bouton de commande Select; Left; Down; Up; Right
            
  Raccordements:
  Relais PIN 13
  Sondes broche DS18B20 PIN 3         
  Diviseurs de tension sur PIN A1 à A5.
  Lcd 4X16 PIN (8, 9, 4, 5, 6, 7)
  Boutons de commnandes PIN A0
  DTH22 PIN PIN A6
  ACS712 PIN A7
  Bouton de commande PIN A0
  
  Logiciel: Développé en utilisant le logiciel Arduino 1.6.1 
  
  Date: 07/04/2015
  
  /* Inclut la librairie LiquidCrystal pour le LCD */
#include <LiquidCrystal.h>
#include "Menu.h" // Fichier d'entête avec les types pour le menu

/* Objet LCD sur les broches utilisées lcddem16481 */
static LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

/* Menu principal */
static const char* MAIN_MENU_ITEMS[] = {
  "VOLTMETRE",
  "CONS ELECTRIQUE",
  "TEMP BOITIER",
  "POINT DE ROSEE",
};
static const Menu_t MAIN_MENU = {
  "Votre choix ?",
  MAIN_MENU_ITEMS,
  4,
  &doMainMenuAction
};

/* Sous menu pour Point de rosée */
static const char* POINT_DE_ROSEE_MENU_ITEMS[] = {
  "POINT DE ROSEE",
  "PARAMETRE"

};
static const Menu_t POINT_DE_ROSEE_MENU = {
  "Votre choix ?",
  POINT_DE_ROSEE_MENU_ITEMS,
  1,
  &doPointDeRoseeMenuAction
};

/** Setup */
void setup() 
{
Serial.begin(57600);  
  /* Configuration du LCD */
  lcd.begin(16, 4); // Démarrer la librairie

 //Message de bienvenue
 lcd.setCursor(0,00); //En haut à gauche (numéroté depuis 0)
 lcd.print("Alim Astronomie"); // Afficher un petit message
 lcd.setCursor(0,01);   //Ligne du bas
 lcd.print("Mogenot D. V3");   // Afficher un petit message
 lcd.setCursor(0,02);   //Ligne du bas
 lcd.print("10/04/2015");   // Afficher un petit message
 
  delay(5000);  //intro de 5 secondes-
 
 lcd.setCursor(0,1);   //Ligne du bas
 lcd.print("               ");   //Effacer cette ligne
 lcd.setCursor(0,0);            
 lcd.print("               ");   //Effacer cette ligne
 lcd.setCursor(0,02);                      
 lcd.print("               ");   //Effacer cette ligne
 delay(5000);  //intro de 5 secondes-
}

/** Programme principal */
void loop() {

  /* Affiche le menu principal */
  displayMenu(MAIN_MENU);
  
  
  
  /* Démo pour montrer la sortie du menu */
  lcd.clear();
  lcd.print(F("Menu ferme"));
  delay(2000);
}

void aiguillage(int choix_utilisateur)
{
  switch (choix_utilisateur)
  {
  case 0:
  Serial.print("aiguillage =  ");Serial.println("voltmetre");
  Voltmetre ();
  break;
  case 1:
  Serial.print("aiguillage =  ");Serial.println("cons electrique");
 // Cons_Electrique ();
  break;
  case 2:
  Serial.print("aiguillage =  ");Serial.println("Temperature");
 // Temperature ();
  break;
  case 3:
  Serial.print("aiguillage =  ");Serial.println("Point de rosee");
 // Point_de_rosee ();
  break;
  
  }
}

/** Fonction retournant le bouton appuyé (s'il y en a un). */
Button_t readPushButton(void) {

  /* Lecture de l'entrée A0 */
  unsigned int val = analogRead(A0);

  /* Test suivant les fourchettes de valeurs */
  if (val > 1000) return BP_NONE;
  if (val < 50) return BP_RIGTH;
  if (val < 195) return BP_UP;
  if (val < 380) return BP_DOWN;
  if (val < 555) return BP_LEFT;
  if (val < 790) return BP_SELECT;

  /* Par défaut aucun bouton n'est appuyé */
  return BP_NONE;
}

/** Affiche le menu passé en argument */
void displayMenu(const Menu_t &menu) {

  /* Variable pour le menu */
  byte selectedMenuItem = 0;   // Choix selectionné
  byte shouldExitMenu = false; // Devient true quand l'utilisateur veut quitter le menu
  Button_t buttonPressed;      // Contient le bouton appuyé

  /* Tant que l'utilisateur ne veut pas quitter pas le menu */
  while (!shouldExitMenu) {

    /* Affiche le menu */
    lcd.clear();
    lcd.print(menu.prompt);
    lcd.setCursor(0, 1);
    lcd.print(menu.items[selectedMenuItem]);

    /* Attend le relâchement du bouton */
    while (readPushButton() != BP_NONE);

    /* Attend l'appui sur un bouton */
    while ((buttonPressed = readPushButton()) == BP_NONE);

    /* Anti rebond pour le bouton */
    delay(30);

    /* Attend le relâchement du bouton */
    while (readPushButton() != BP_NONE);

    /* Gére l'appui sur le bouton */
    switch (buttonPressed) {
      case BP_UP: // Bouton haut = choix précédent

        /* Si il existe un choix précédent */
        if (selectedMenuItem > 0) {

          /* Passe au choix précédent */
          selectedMenuItem--;
        }
        break;

      case BP_DOWN: // Bouton bas = choix suivant

        /* Si il existe un choix suivant */
        if (selectedMenuItem < (menu.nbItems - 1)) {

          /* Passe au choix suivant */
          selectedMenuItem++;
        }
        break;

      case BP_LEFT: // Bouton gauche = sorti du menu
        shouldExitMenu = true;
        break;

      case BP_SELECT: //
      case BP_RIGTH:  // Bouton droit ou SELECT = validation du choix
        menu.callbackFnct(selectedMenuItem);
        break;
    }
  }
}

/** Affiche le choix de l'utilisateur */
void doMainMenuAction(byte selectedMenuItem) {

  /* Cas spécial pour Dr Freeman */
  if (selectedMenuItem == 2) {

    /* Affiche le sous-menu pour Point de rosée */
    displayMenu(POINT_DE_ROSEE_MENU);

  } else {

    /* Affiche le choix de l'utilisateur */
    displayChoice(selectedMenuItem, MAIN_MENU_ITEMS);
  }
}

/** Affiche le choix de l'utilisateur */
void doPointDeRoseeMenuAction(byte selectedMenuItem) {

  /* Affiche le choix de l'utilisateur */
  displayChoice(selectedMenuItem, POINT_DE_ROSEE_MENU_ITEMS);
}

/** Affiche le choix de l'utilisateur */
void displayChoice(byte selectedMenuItem, const char** items) {

  /* Affiche le choix de l'utilisateur */
  lcd.clear();
  lcd.print(F("Z'avez choisi :"));
  lcd.setCursor(0, 1);
  lcd.print(items[selectedMenuItem]);
  Serial.print("selectedMenuItem =  ");Serial.println(selectedMenuItem);
  /* Attend l'appui sur le bouton gauche ou SELECT */
  byte buttonPressed;
  do {
    buttonPressed = readPushButton();
  }
  while (buttonPressed != BP_LEFT && buttonPressed != BP_SELECT);
  aiguillage(selectedMenuItem);
}

sans oublier le code de la fonction voltmetre (modifié lui aussi ).
j'espère que te voilà débloqué :grin:

/*--------------------------------------------------------------

Description: 5 canaux voltmètre DC avec des tensions affichées 
                 sur l'écran LCD à 1a décimale 
  
  Matériel: diviseurs de tension sur A1 à A4. 
              
--------------------------------------------------------------*/
void Voltmetre ()    // Initialisation
{
  
  lcd.clear();
  lcd.print(F("fonction volt:"));
  delay(2000);
  
#define NUM_SAMPLES 10 // nombre d'échantillons analogiques à prendre par la lecture, par canal

// valeurs d'étalonnage de diviseur de tension
#define DIV_1    8.785
#define DIV_2    8.785
#define DIV_3    8.785
#define DIV_4    8.785

// Valeur de tension de référence ADC / calibration
#define V_REF    4.95

int sum[4] = {0};                // sommes d'échantillons prélevés
unsigned char sample_count = 0;  // taille de l'échantillon
float voltage[5] = {0.0};        // tensions calculées
char l_cnt = 0;                  // utilisé dans »pour« boucles
 
//void Voltmetre ()    // Initialisation
//{
   
  //Serial.begin(57600);  
     
  // prendre un certain nombre d'échantillons analogiques et de les additionner
    while (sample_count < NUM_SAMPLES) {
        // sample each channel A1 to A4
        for (l_cnt = 0; l_cnt < 4; l_cnt++) {
            sum[l_cnt] += analogRead(A1 + l_cnt);
        }
        sample_count++;
        delay(10);
    }
    // calculer la tension de chaque canal
    for (l_cnt = 0; l_cnt < 4; l_cnt++) {
        voltage[l_cnt] = ((float)sum[l_cnt] / (float)NUM_SAMPLES * V_REF) / 1024.0;
    }
    
    // tensions d'affichage sur l'écran LCD
    // chaque tension est multipliée par le réseau de résistances
    // facteur de division pour calculer la tension réelle
   // tension 1 - A (pin A1)
    lcd.setCursor(0, 1);
    lcd.print("A ");
    lcd.print(voltage[0] * DIV_1, 1);
    lcd.print("V ");
    
    // tension 2 - B (pin A2)
    lcd.setCursor(8, 1);
    lcd.print("B ");
    lcd.print(voltage[1] * DIV_2, 1);
    lcd.print("V ");
    
    // tension 3 - C (pin A3)
    lcd.setCursor(-4, 2);
    lcd.print("C ");
    lcd.print(voltage[2] * DIV_3, 1);
    lcd.print("V ");
    
    // tension 4 - D (pin A4)
    lcd.setCursor(4, 2);
    lcd.print("D ");
    lcd.print(voltage[3] * DIV_4, 1);
    lcd.print("V ");
     
    // réinitialiser le nombre et les montants
    sample_count = 0;
    for (l_cnt = 0; l_cnt < 4; l_cnt++) {
        sum[l_cnt] = 0;
    }
    
    delay(5000);
}

attention, dans le code, j'ai changé la vitesse de liaison avec le moniteur

Merci pour cette modife je pousuit le code pour les autre aplications

le seul problème la fonction volt reste affiche 5s

oui, c'est le delay(5000); que j'ai placé en fin de la fonction voltmetre

tu peux remplacer par une scrutation clavier, un appui sur une touche quelconque.............pour quitter cette fonction.

Vue merci beaucoup du coup de main dfgh

Vous m'avez tiré là une grande épine du pied

merci encore