Aide sur un menu de fonction cooling system Astronomie

Problème de menu de commande de mise en marche de mon cooling system.
la fonction cooling system ne reste pas en marche retour au menu general

voici mon code source

onglet: astro system

#include <LiquidCrystal.h> 
#include "Menu.h" 
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include "Wire.h"

static LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

/* Menu principal */
static const char* MAIN_MENU_ITEMS[] = {
  "VOLTMETRE",
  "KWh MOYENNE",
  "TEMPERATURE BOX",
  "COOLING CCD",
  "DEW POINT",
  
};
static const Menu_t MAIN_MENU = {
  "Votre choix ?",
  MAIN_MENU_ITEMS,
  5,
  &doMainMenuAction
};

/* Sous menu pour Cooling system */
static const char* COOLING_SYSTEM_MENU_ITEMS[] = {
  "PARAMETRE",

};
static const Menu_t COOLING_SYSTEM_MENU = {
  "Votre choix ?",
  COOLING_SYSTEM_MENU_ITEMS,
  1,
  &doCoolingSystemMenuAction
};

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

 //Message de bienvenue
 lcd.setCursor(0,00); 
 lcd.print("  ASTRO SYSTEM"); 
 lcd.setCursor(0,01); 
 lcd.print("________________"); 
 lcd.setCursor(0,02);   
 lcd.print("Mogenot Denis");   
 lcd.setCursor(0,003);  
 lcd.print("version: 3  2015");  
 
  delay(5000); 
 
 lcd.setCursor(0,00);   
 lcd.print("                 ");  
 lcd.setCursor(0,01);   
 lcd.print("                 ");   //Effacer cette ligne
 lcd.setCursor(0,02);            
 lcd.print("                 ");  
 lcd.print("                 ");  
 delay(5000); 
}
  
  
void loop() {

  /* Affiche le menu principal */
  displayMenu(MAIN_MENU);
  
  lcd.clear();
  lcd.print(F("Menu ferme"));
  delay(1000);
}

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("Kwh Moyenne");
 // Kwh_Moyenne ();
  break;
  case 2:
  Serial.print("aiguillage =  ");Serial.println("Temperature Box");
  // Temperature_Box ();
  break;
  case 3:
  Serial.print("aiguillage =  ");Serial.println("Cooling Ccd");
  Cooling_Cdd ();
  break;
  case 4:
  Serial.print("aiguillage =  ");Serial.println("Dew Point");
  //Dew_Point ();
  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 Cooling system */
  if (selectedMenuItem == 2) {

    /* Affiche le sous-menu pour Cooling system */
    displayMenu(COOLING_SYSTEM_MENU);

  } else {

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

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

  /* Affiche le choix de l'utilisateur */
  displayChoice(selectedMenuItem, COOLING_SYSTEM_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("Valider :"));
  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);
}

onglet: cooling ccd

/*
 Regulation de température 
  Relai broche 13
  Sondes broche 7
  
 */


int lcd_key     = 0;
int adc_key_in  = 0;
#define btnPlus5    0
#define btnPlus1    1
#define btnMoins1   2
#define btnMoins5   3


int Pel = 13;// sortie relais

#define ONE_WIRE_BUS 3 // sonde raccordée sur la broche 2

OneWire oneWire(ONE_WIRE_BUS);  
DallasTemperature sensors(&oneWire);
DeviceAddress Probe01 = { 0x28, 0xDA, 0x72, 0x50, 0x05, 0x00, 0x00, 0x16 }; // adresse a remplacer - sonde exterieur
DeviceAddress Probe02 = { 0x28, 0x71, 0x17, 0xA8, 0x04, 0x00, 0x00, 0xB7 }; // sonde peltier
 



float settemp;
float compt;
float compt2;
int read_LCD_buttons()

{
 adc_key_in = analogRead(0);
 if (adc_key_in < 50)   return btnPlus5;
 if (adc_key_in < 195)  return btnPlus1;
 if (adc_key_in < 380)  return btnMoins1;
 if (adc_key_in < 555)  return btnMoins5;

{
  pinMode (Pel,OUTPUT);
  sensors.begin();
  sensors.setResolution(Probe01, 10);
  sensors.setResolution(Probe02, 10);
  
  lcd.begin(16, 4); 
  lcd.setCursor(0,0);
  lcd.print(" COOLING SYSTEM");
  lcd.setCursor(3,1);
  lcd.print("CAMERA CCD");
  lcd.setCursor(0,3);
  lcd.print("Version:2.0 2015");
  delay(4000);
  lcd.clear(); 
 
}
 }
 void Cooling_Cdd()
{
   int temp1 = sensors.getTempC(Probe01);
   sensors.requestTemperatures(); 
    
   lcd.begin(16, 4);
   
   lcd.setCursor(0,00);
   lcd.print("Tp. Local:");  
   printTemperature(Probe01);
    
   lcd.setCursor(0,01);
   lcd.print("Tp. CCD  :");  
   printTemperature(Probe02);

   lcd.setCursor(0,02);
   lcd.print("Index    : ");
   lcd.print(settemp);
     
   if (settemp < temp1 )
   {
     digitalWrite(Pel,LOW);
     lcd.setCursor(0,03);
     lcd.print("Fonction :");
     lcd.print ("  On");
   }
   
   else
   {
     digitalWrite(Pel,HIGH);
     lcd.print ("  Off");
   } 
    
  delay (100); 
  settemp = (compt*1)+(compt2*5);
  
  // possibilité d'augmenter la précision de la consigne incrément 0.5 
  //settemp = (compt*0.5);
  
 lcd_key = read_LCD_buttons();
 switch (lcd_key) 
 {
   case btnPlus1:
     {
     (compt ++);
      break;
     }
   case btnMoins1:
     {
     (compt --);
     break;
     }
     
     case btnPlus5:
     {
     (compt2 ++);
     break;
     }
   case btnMoins5:
     {
     (compt2 --);
     break;
     }
   }
   
}

void printTemperature(DeviceAddress deviceAddress)
{

float tempC = sensors.getTempC(deviceAddress);

   if (tempC == -127.00)
   {
    lcd.print("Erreur");
   } 
   
   else
   {
 
   lcd.print(tempC);
   
   }
   }

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

La fonction cooling CCD ne veux pas
tourner en boucle
Besoins d'un coup de main
Merci

faut il créer un fichier ccp et h pour la commande de la fonction cooling ccd

merci

c'est quoi ton prb ?
ton prg: dans ton menu, tu sélectionne "coolingccd"
tu y entres, tu affiches tes températures
puis" fonction on "ou "fonction off"
on va dire que là tu es au point "A"
puis tu vas lire tes touches
comme tu n'es pas plus rapide que le micro, tu n'a jamais le temps d'appuyer sur une touche.
donc le prg continue et t'affiche cooling systeme canera ccd version 2.0.2015
et revient en point "A"
et ton prg scrute ce que tu aurais du retourner dans la lecture de tes touches
(return btnPlus5; etc...)
comme tu n'avais pas été plus rapide que le micro, le prg n'a pas "retourné" de valeur et il ne fait rien si ce n'est que de retourner à l'appelant, autrement dit le menu des choix.
ton prg fait bien ce que tu lui demande de faire.

pour résumer, il y a un semblant de je me mords la queue dans ton prg de scrutation des touches, mais toi seul sais ce que tu veux faire dans ton prg.