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