Arduino, gestion de menu avec LCD Keypad Shield + EEPROM

Bien le bonsoir,

Le programme que je vous propose ce soir est une amélioration du programme de gestion de menu que j’ai posté il y a un bout de temps.

J’ai réalisé ce programme de suite après avoir fini l’article précédant, ai posté une vidéo, mais ce n’est que maintenant que je poste le code… Désolé.

Sans plus attendre, voici donc le code de : Gestion de menu arduino, avec gestion de la mémoire EEPROM.

Voici donc la vidéo :  http://www.youtube.com/watch?v=vOGaD9suAj0

Il y a très peu de rajout dans le code, comparé au précédent, juste l’appel de la librairie pour l’EEPROM.

Pour rappel, l’EEPROM (Electrically-Erasable Programmable Read-Only Memory ou mémoire morte effaçable électriquement et programmable), est de type mémoire morte. Elle n’a donc pas besoin d’être sous tension pour garder des informations. Par exemple, un disque dur est de type mémoire morte, votre mémoire ram est de la mémoire flash (le pc hors tension, il n’y a plus d’informations stockées dedans). Pour un peux plus d’information sur les mémoires morte existante cf : wiki.

Un tableau à deux dimension de la même taille que celui de votre menu est créer, contenant l’adresse de la mémoire EEPROM à sélectionner. Ce tableau est indispensable, sinon, l’enregistrement en EEPROM ne pourrait avoir lieu.

Je laisse place au code :

#include <EEPROM.h>
#include <LiquidCrystal.h>

/*******************************************************

Gestion de menu – v1
Par Yersinia Programs
https://yersiniaprograms.wordpress.com/

Note : la v0.9 permet de sortir du tableau
du menu pour les valeur < 0. Sera corrigé pour
la v1.

********************************************************/

// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// define some values used by the panel and buttons
int lcd_key     = 0;
int adc_key_in  = 0;

bool choix;
int up;
int ancien_boutton;
int droit;
int select;
int valeur;
int ancienne_valeur;

char intro [1][9] = {« Bienvenu »};

// initialisation du menu
char menu_text [4][4][15] = {
{
{« Son        => »}, {« intensite »},      {« null »},   {« null »}
},
{
{« RAZ EEPROM « },        {« null »},          {« arriere »}, {« null »}
},
{
{« lumiere    => »}, {« intensite  => »}, {« avant »},   {« null »}
},
{
{«  »}, {« null »}, {« null »}, {« null »}
}
};

// Il faut mettre l’adresse de l’enregistrement des valeurs de l’EEPROM à la place des 0
// Faire une fonction de parcours de tableau et de chargement des valeurs
// Puis faire un enregistrement directement dans l’EEPROM grace au tableau qui donnera
// l’adresse de la case mémoire utilisé
int menu_valeur [4][4][3] = {
{
{-1}, {0}, {-1}, {-1}
},
{
{-1}, {-1}, {2}, {-1}
},
{
{-1}, {-1}, {3}, {-1}
},
{
{-1}, {-1}, {-1}, {-1}
}
};
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// read the buttons
int read_LCD_buttons()
{
adc_key_in = analogRead(0);      // read the value from the sensor
// my buttons when read are centered at these valies: 0, 144, 329, 504, 741
// we add approx 50 to those values and check to see if we are close
if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
lcd.setCursor(0,0);
//lcd.print(adc_key_in);
// For V1.0 us this threshold
if (adc_key_in < 50)   return btnRIGHT;
if (adc_key_in < 195)  return btnUP;
if (adc_key_in < 380)  return btnDOWN;
if (adc_key_in < 555)  return btnLEFT;
if (adc_key_in < 790)  return btnSELECT;

return btnNONE;  // when all others fail, return this…
}

bool gestion_valeur()
{
if (bouton (read_LCD_buttons()) == true)
{
if (ancien_boutton != btnSELECT)
{
choix = true;
lcd.setCursor(6,1);
lcd.print(valeur);
lcd.print( »   « );
return false;
}
else
{
choix = false;
return true;
}
}
}

bool bouton (int btn_appuye)
{
lcd_key = read_LCD_buttons();
if (ancien_boutton != lcd_key) // permet d’in/décrémenter que de 1 lors de l’appuie d’un bouton
{
switch (lcd_key)
{
case btnRIGHT:
{
if (choix == false) droit++;
else valeur++;
break;
}
case btnLEFT:
{
if (choix == false)
{
if (droit > 0) droit–;
}
else
{
if (valeur > 0) valeur–;
}
break;
}
case btnUP:
{
if (choix == false && up < (sizeof(menu_text)/sizeof(menu_text[0]) – 1)) up++;
break;
}
case btnDOWN:
{
if (choix == false)
{
if (up > 0) up–;
}
break;
}
case btnSELECT:
{
select++;
break;
}
case btnNONE:
{
break;
}
}
ancien_boutton = lcd_key;
return true;
}
return false;
}

void setup()
{
Serial.begin(9600);
Serial.print(sizeof(intro[0]));
lcd.begin(16, 2);              // start the library
lcd.setCursor(0,0);
lcd.blink();
for (int i; i<(sizeof(intro[0])-1); i++) {
lcd.print(intro[0][i]);
delay(500);
}
lcd.noBlink();
lcd.setCursor(0,0);
lcd.print(« menu »); // print a simple message
lcd.setCursor(4,0);
lcd.print( »             « );
choix = false;
}

void loop()
{

lcd.setCursor(0,1);
if (bouton (read_LCD_buttons()) == true)
{
lcd.setCursor(0,1);
lcd.print( »                   « );
lcd.setCursor(0,1);
if (strcmp(menu_text[up][droit], « null ») == 0) // le test pour savoir si il y a un sous menu
{
droit = 0;
}
if (select != 0)
{
valeur = EEPROM.read(*menu_valeur[up][droit]);
lcd.setCursor(0,0); lcd.print(« menu – « ); lcd.print(menu_text[up][droit]);
lcd.setCursor(0,1); lcd.print(« <=            => »);
if (*menu_valeur[up][droit] != -1) // Savoir si il y a une valeur à modifier
{
while (gestion_valeur() != true) {} // tant qu’on est dans la gestion de la valeur (modification)
}
else if (strcmp(menu_text[up][droit], « RAZ EEPROM « ) == 0)
{
// RAZ de l’EEPROM — Fonction spécial !!!!
lcd.setCursor(0,0); lcd.print(« effmnt EEPROM   « );
int i;
for (int i = 0; i < 512; i++)
{
EEPROM.write(i , 0);
lcd.setCursor(6,1);
lcd.print(i);
lcd.print( »   « );
delay(50);
}
lcd.setCursor(0,0); lcd.print(« menu – « );
}
lcd.setCursor(5,0);
lcd.print( »             « ); // on efface ce qu’il y a après menu sur la première ligne du LCD
EEPROM.write(*menu_valeur[up][droit], valeur);
select = 0;
}
else
{
lcd.print(menu_text[up][droit]);
}
}
}

Cette entrée a été publiée dans Arduino.

Laisser un commentaire