LCD KeyPad Shield For Arduino

Re: LCD KeyPad Shield For Arduino

Messagede Fredlab » 23 Déc 2011 20:40

Bon... je progresse... en allant sur ce thread, j'ai réussi à lui faire afficher "Hello world !" plus un compteur de temps qui défile.

Voilà le code

Code: Tout sélectionner
// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  // adjust this to suit your pins.

void setup() {
  // set up the LCD's number of rows and columns:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);
}


Il a fallu réassigner des "pin" pour que la bibliothèque "LiquidCrystal.h" se substitue à celle du LCD4bit...
par contre, il va falloir retrouver les codes pour les différents boutons :?

(le bouton "reset" fonctionne)
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar de l’utilisateur
Fredlab
membre
membre
 
Messages: 9616
Inscription: 27 Juin 2010 13:42
Localisation: Auxonne (21)
Prénom: Frederic

Re: LCD KeyPad Shield For Arduino

Messagede Fredlab » 23 Déc 2011 20:45

Fredlab a écrit:(...)par contre, il va falloir retrouver les codes pour les différents boutons :?


Sur ce wiki, j'ai trouvé ce code (puisque la librairie chargée avec le LCD est moisie, j'utilise celle de "LiquidCrystal")

Code: Tout sélectionner
//Sample using LiquidCrystal library
#include <LiquidCrystal.h>

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

This program will test the LCD panel and the buttons
Mark Bramwell, July 2010

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

// 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;
#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
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...
}

void setup()
{
lcd.begin(16, 2);              // start the library
lcd.setCursor(0,0);
lcd.print("Push the buttons"); // print a simple message
}

void loop()
{
lcd.setCursor(9,1);            // move cursor to second line "1" and 9 spaces over
lcd.print(millis()/1000);      // display seconds elapsed since power-up


lcd.setCursor(0,1);            // move to the begining of the second line
lcd_key = read_LCD_buttons();  // read the buttons

switch (lcd_key)               // depending on which button was pushed, we perform an action
{
   case btnRIGHT:
     {
     lcd.print("RIGHT ");
     break;
     }
   case btnLEFT:
     {
     lcd.print("LEFT   ");
     break;
     }
   case btnUP:
     {
     lcd.print("UP    ");
     break;
     }
   case btnDOWN:
     {
     lcd.print("DOWN  ");
     break;
     }
   case btnSELECT:
     {
     lcd.print("SELECT");
     break;
     }
     case btnNONE:
     {
     lcd.print("NONE  ");
     break;
     }
}

}


et ça marche
bon... il ne me reste plus qu'à comprendre les différentes lignes
(mais avec ces deux codes, j'ai les moyens de repérer les "pin" pour le LCD et pour les boutons.)
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar de l’utilisateur
Fredlab
membre
membre
 
Messages: 9616
Inscription: 27 Juin 2010 13:42
Localisation: Auxonne (21)
Prénom: Frederic

Re: LCD KeyPad Shield For Arduino

Messagede Christian » 24 Déc 2011 00:05

Hello,
Il n'y a qu'un seul "vrai" bouton, il est sur pin A0 (analog 0) ... le reset n'est pas programmable, il est simplement repris de la carte Arduino.
cf viewtopic.php?f=283&t=10242#p51733

Attention, comme cette unique entrée utilise une série de résistances pour simuler 5 boutons , ces résistances doivent être calibrées correctement. Essayer déjà les paramètres par défaut, puis si problèmes ajuster, en lisant si possible la vrai valeur analogique->numérique de celles-ci. Les "centrer" ou placer des limites. (je préfère la seconde méthode, mais chacun aura la sienne)
On voit apparaitre ces valeurs dans les codes exemples ci-dessous :

- Extrait d'exemple avec Libraire 4 bit (de DFRobot)
Ici c'est des valeurs centrées 30, 150, 360, 535, 760

Code: Tout sélectionner
//Key message
char msgs[5][15] = {"Right Key OK ",
                    "Up Key OK    ",
                    "Down Key OK  ",
                    "Left Key OK  ",
                    "Select Key OK" };
int  adc_key_val[5] ={30, 150, 360, 535, 760 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;


- Ou dans cet extrait avec librairie LiquidCrystal (de DFRobot)
Ici c'est des valeurs plus petites que : <50, <195, <380, <555, <790 (avec une limite if >1000)

Code: Tout sélectionner
// 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
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...
}


Voir aussi page 84 et 85 du Ch.Tavernier.

Pour un exemple de programmation de menu, voir
http://www.dfrobot.com/wiki/index.php?t ... DFR0009%29 (exemple avec librairie LiquidCrystal)
C'est une façon parmi d'autres de créer un menu. Je ne suis pas certain d'utiliser celle-ci à terme.

Je monte demain à Viuz, j'espère trouver le solde de ma commande ... (entre autre cet écran)
NB : Il est toujours préférable d'installer la ou les librairies proposées par le fournisseur, au moins dans un premier temps ! Pour le modèle commandé c'est DFRobot. (le Wiki proposé par Fred ramène d'ailleurs à leur site de vente)
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar de l’utilisateur
Christian
Coadmin
Coadmin
 
Messages: 4790
Inscription: 28 Aoû 2007 20:54
Localisation: Entre Alpes et Jura
Prénom: Christian

Re: LCD KeyPad Shield For Arduino

Messagede Christian » 25 Déc 2011 04:37

Fred et ceux qui suivez ce projet, testez et lisez les commentaires (surtout vers la fin) de ce code que j'ai modifié, surtout pour l'ajout de la valeur des boutons à la place du truc inutile qui donne le temps que l'on a passé depuis le lancement du programme ...
La librairie LiquidCrystal utilisée est celle fournie avec l'installation par défaut du soft Arduino ver. 1.0 (il n'y a donc rien à installer en supplément !)
Au niveau matériel il suffit d'empiler ce LCD (DFRobot) sur l'Arduino.

Code: Tout sélectionner
/*******************************************************
*
* This program will test the LCD panel and the buttons
* Mark Bramwell, July 2010
* Modif Ch.Aubert, Dec. 2011 - Ajout valeur analogique->numérique (AN) boutons et divers remaniements (entre autre de variables)
********************************************************/

///////////////  Librairie(s) à inclure //////////////////
#include <LiquidCrystal.h>


////////// Définir les broches du LCD (pins)  /////////////////////////
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

////////////////// Définition des E/S  ////////////////
int PinBouton = 0; // broche analogique (A0) utilisée pour les 5 boutons



////////////////// CONSTANTES  /////////////////////

// define some values used by the panel and buttons
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5


////////// VARIABLES ///////////////////////////
byte  lcd_key = 0;
int  adc_key_in = 0;

///////// SETUP ////////////////
void setup()
{
  lcd.begin(16, 2);        // initialiser la LCD library, 16 caractères, 2 lignes
}



/////////// Boucle principale ///////////////////

void loop()
{
  lcd.setCursor(0,0);      // placer le curseur à la première ligne, première position
  lcd.print("Test boutons"); // texte d'accueil
  lcd.setCursor(0,1);            // placer le curseur au début de la seconde ligne
  lcd_key = read_LCD_buttons();  // lire la valeur du bouton (->fonction)

  switch (lcd_key)               // selon le bouton appuyé ...
  {
  case btnRIGHT:
    {
      lcd.print("DROITE = ");
      lcd.print(adc_key_in); // Lire la valeur du "bouton" et l'afficher
      delay(500); // permet de repérer les éventuelles variations de la mesure analogique. Appuyer sur le bouton au moins 2-3 secondes
      break;
    }
  case btnLEFT:
    {
      lcd.print("GAUCHE = ");
      lcd.print(adc_key_in);
      delay(500);
      break;
    }
  case btnUP:
    {
      lcd.print("HAUT = ");
      lcd.print(adc_key_in);
      delay(500);
      break;
    }
  case btnDOWN:
    {
      lcd.print("BAS = ");
      lcd.print(adc_key_in);
      delay(500);
      break;
    }
  case btnSELECT:
    {
      lcd.print("SELECT = ");
      lcd.print(adc_key_in);
      delay(500);
      break;
    }
  case btnNONE:
    {
      lcd.print("NUL             ");
      break;
    }
  }

}


///////////////// FONCTIONS ////////////////////

//  Lire la valeur A/D retournée selon le bouton choisi
int read_LCD_buttons()
{
  adc_key_in = analogRead(PinBouton);   
  // Mes boutons me donnent ces résultats :
  // Gauche = 500
  // Droite = 0
  // Haut = 140-141
  // Bas = 323-324
  // Select = 736-737
  // ** Code source : 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; // On commence par la valeur la plus probable : Aucun appui sur bouton !
  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;  // si aucun appui sur bouton, on retoune la constante btnNONE ...
}
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar de l’utilisateur
Christian
Coadmin
Coadmin
 
Messages: 4790
Inscription: 28 Aoû 2007 20:54
Localisation: Entre Alpes et Jura
Prénom: Christian

Re: LCD KeyPad Shield For Arduino

Messagede Fredlab » 25 Déc 2011 12:31

Hello

Merci Christian pour ce bout de code.
Tu prends un peu d'avance...

Je ne suis pas sûr d'avoir beaucoup de temps dans la semaine qui vient.
En fait, je vais essayer de faire fonctionner l'écran en-dehors de son clipsage sur l'Arduino, histoire de libérer certaines sorties/entrées pour voir les effets sur certaines programmations.
Ou alors je me lance dans la construction du shield de prototypage - je suppose que les borniers qu'on ajoute sur les côté sont justement là pour libérer les entrées/sorties (qui ne seraient pas prises par l'écran)

Il faut aussi que j'affine ces histoires de boucles pour programmer (via des menus sur l'écran) le nombre de pas, la taille du pas, les délais entre chaque déclenchements...

Bonne journée à vous.
Chez nous, en enchaine les repas (deux familles obligent)
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar de l’utilisateur
Fredlab
membre
membre
 
Messages: 9616
Inscription: 27 Juin 2010 13:42
Localisation: Auxonne (21)
Prénom: Frederic

Re: LCD KeyPad Shield For Arduino

Messagede Fredlab » 27 Déc 2011 14:44

Hello

En avançant dans le projet stepduino (et à partir du programme du "Photoduino"), je me penche sur le retroéclairage (oui, il y a plein d'autres choses à voir). Simplement pour essayer de comprendre comment passer d'un menu à une action.

J'ai présenté un organigramme du fonctionnement du Stepduino (le mien ?) ICI. Le boitier s'allumerait sur une invite (première ligne) "MENU CONFIG" avec deux sous-menus : "RETROECLAIRAGE" et "BIP" (deux trucs pas très utiles)
Pour ces deux sous menus, après validation, on se retrouve en ligne 1 avec le nom du paramétrage (retroeclairage ou bip) et en deuxième ligne "OUI" par défaut (du moins pour le retroéclairage). Avec les boutons "R" et "L" on passe à "NON". En validant le NON, le retroéclairage doit disparaitre (pour avoir vaguement réussi à faire ça, je signale... ça devient difficile à lire).
On retourne alors au menu précédent (choix des sous-menus).
Avec la touche "U" on retourne au menu de départ (MENU CONFIG) ce qui permet de passer au menu suivant "STEP1" avec le bouton "R" ou "RESET" avec le bouton "L".

J'ai pris le code de Christian pour le contrôle d'un boitier reflex et j'ai ajouté une ou deux choses pour le retroéclairage (gérer par le "pin 10")


Code: Tout sélectionner
/*******************************************************
*
* This program will test the LCD panel and the buttons
* Mark Bramwell, July 2010
* Modif Ch.Aubert, Dec. 2011 - Ajout valeur analogique->numérique (AN) boutons et divers remaniements (entre autre de variables)
* Modif Fred, Dec. 2011 - ajout d'un menu pour mettre ou enlever le retroeclairage (pin 10)
********************************************************/

///////////////  Librairie(s) à inclure //////////////////
#include <LiquidCrystal.h>


////////// Définir les broches du LCD (pins)  /////////////////////////
LiquidCrystal lcd(8, 9, 4, 5, 6, 7, 10);

////////////////// Définition des E/S  ////////////////
int PinBouton = 0; // broche analogique (A0) utilisée pour les 5 boutons
int PinLedArduino = 13; // Led de controle sur circuit Arduino

////////////////// CONSTANTES  /////////////////////

// define some values used by the panel and buttons
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// Default system config
#define DEFAULT_system_useBacklight  true

////////// VARIABLES ///////////////////////////
byte  lcd_key = 0;
int  adc_key_in = 0;

///////// SETUP ////////////////
void setup()
{
  lcd.begin(16, 2);        // initialiser la LCD library, 16 caractères, 2 lignes
  digitalWrite(10, HIGH);     // Init backlight
  pinMode(PinLedArduino, OUTPUT); //led de controle - pin 13
}

/////////// Boucle principale ///////////////////

void loop()
{
  lcd.setCursor(0,0);      // placer le curseur à la première ligne, première position
  lcd.print("BACK-LIGHT");    // texte d'accueil du menu
  lcd.setCursor(0,1);            // placer le curseur au début de la seconde ligne
  lcd_key = read_LCD_buttons();  // lire la valeur du bouton (->fonction)

  switch (lcd_key)               // selon le bouton appuyé ...
  {
  case btnRIGHT:
    {
      lcd.print("<OUI>");
      lcd.print(adc_key_in); // Lire la valeur du "bouton" et l'afficher
    }
  case btnLEFT:
    {
      lcd.print("<NON>");
      lcd.print(adc_key_in);
    }
  case btnUP:
    {
            break;
    }
  case btnDOWN:
    {
      break;
    }
  case btnSELECT:
    {
      lcd.print("                "); //efface ce qui est à l'écran
      digitalWrite(PinLedArduino, HIGH);   // LED ligne 13 on
      lcd.print(adc_key_in);
      system_useBacklight(); // change le retroeclairage
      digitalWrite(PinLedArduino, LOW);    // LED ligne 13 off
    }
  case btnNONE:
    {
      lcd.print("<OUI>");
      break;
    }
  }

}
/************* Sous programmes ****************/

// change le retroeclairage
void system_useBacklight() {
  //enleve le retroeclairage
  digitalWrite(10, LOW);
}

///////////////// FONCTIONS ////////////////////

//  Lire la valeur A/D retournée selon le bouton choisi
int read_LCD_buttons()
{
  adc_key_in = analogRead(PinBouton);   
  // Mes boutons me donnent ces résultats :
  // Gauche = 500
  // Droite = 0
  // Haut = 140-141
  // Bas = 323-324
  // Select = 736-737
  // ** Code source : 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; // On commence par la valeur la plus probable : Aucun appui sur bouton !
  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;  // si aucun appui sur bouton, on retoune la constante btnNONE ...
}


Bon... vous vous en doutez, ça ne marche pas.
J'ai juste réussi à baisser l'intensité de l'écran au chargement du programme.
La touche OK permet d'éteindre le retroéclairage, tant qu'on appuie.
Les autres touches ne servent à rien.
J'ai encore l'invite "Shoot = Select" alors qu'il me semble avoir modifié le texte
:?
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar de l’utilisateur
Fredlab
membre
membre
 
Messages: 9616
Inscription: 27 Juin 2010 13:42
Localisation: Auxonne (21)
Prénom: Frederic

Re: LCD KeyPad Shield For Arduino

Messagede Christian » 27 Déc 2011 15:15

Re Fred,
Je viens de regarder la librairie LiquidCrystal fournie avec le soft Arduino, je ne vois rien qui concerne la gestion du Backlight ?! (voir s'il n'existe pas d'autres librairies qui en tient compte, ou alors gérer cela directement dans le prog principal, et ne pas la déclarer avec cette librairie !)
Il faudrait aussi vérifier sur la doc DFRobot que cette broche backlight est bien utilisable !
Je ferai quelques recherches ce soir. (je vérifierai aussi ton code menu, pour l'affichge LCD il faut bien comprendre que c'est une boucle, qui donc se répète. Ne pas oublier aussi d'éteindre et rallumer le montage en cas de doute car le LCD peut garder un affichage ancien s'il est mal géré)
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar de l’utilisateur
Christian
Coadmin
Coadmin
 
Messages: 4790
Inscription: 28 Aoû 2007 20:54
Localisation: Entre Alpes et Jura
Prénom: Christian

Re: LCD KeyPad Shield For Arduino

Messagede Keyz » 28 Déc 2011 04:44

@ fredlab
Sinon, en explorant les librairies, celle du LCD4bit n'a pas les mêmes extensions à "example"

[translator]de l' Aleoute traduit en Patagon[/translator]
The file extension for sketches has changed from .pde to .ino, to avoid
conflicts with the Processing software ("ino" are the last three letters
in "Arduino")
L' extension de fichiers pour les sketchs a changé de .pde à .ino pour empêcher
les conflits avec le logiciel Processing ("ino sont les trois dernières lettres
dans "Arduino")

juste un renommage d'extension de fichier...
(processing, logiciel graphique qui permet également d'être interfacé avec la carte Arduino, les sketchs sont enregistrées en .pde)

Mais au moment d'uploader le sketch d'exemple, je me retrouve avec plein de messages dans le "compilateur"

J'ai résolu ce "bogue"("bug") en downgradant avec la version du logiciel arduino v22
http://arduino.cc/en/Main/Software
Dernière édition par Keyz le 28 Déc 2011 08:15, édité 3 fois.
Keyz
membre
membre
 
Messages: 4
Inscription: 22 Déc 2011 00:21
Prénom: Matthieu

Re: LCD KeyPad Shield For Arduino

Messagede Keyz » 28 Déc 2011 05:30

les broches numériques sont "codées en dur" ("hard coded") dans la librairie LCD4bits_mod.ccp: à utiliser en se référant au schéma(datasheet) du constructeur.
En occurence http://www.nuelectronics.com/download/projects/LCDshield_v1_1.pdf, pour mon shield nuelectronics clipsé sur le module arduino.
Code: Tout sélectionner
//Register Select > broche 8, Enable > broche 9, data > broches 4,5,6,7
//RS, RW and Enable can be set to whatever you like
int RS = 8;
int RW = 11;
int Enable = 9;
//DB should be an unseparated group of pins  - because of lazy coding in pushNibble()
int DB[] = {4, 5, 6, 7};  //wire these to DB4~7 on LCD.

cette librairie est dépréciée

NB : Il est toujours préférable d'installer la ou les librairies proposées par le fournisseur, au moins dans un premier temps ! Pour le modèle commandé c'est DFRobot. (le Wiki proposé par Fred ramène d'ailleurs à leur site de vente)

LCD4bit_mod est mot pour mot la même librairie du constructeur nuelectronics donc === datasheet

Il vaut mieux utiliser l'import de la librairie <LiquidCrystal.h>(sketch>import libraire)
la configuration des broches est éditable grâce à la méthode LiquidCrystal lcd(RS, Enable, D4, D5, D6, D7); de la libraire <LiquidCrystal.h>

Tout ceci réalisable en prototypage par le simulateur http://www.virtualbreadboard.com/ dédié aux modules arduinos.
Dernière édition par Keyz le 29 Déc 2011 00:56, édité 6 fois.
Keyz
membre
membre
 
Messages: 4
Inscription: 22 Déc 2011 00:21
Prénom: Matthieu

Re: LCD KeyPad Shield For Arduino

Messagede Christian » 28 Déc 2011 06:05

Re Fred,
Bon j'ai écris hier soir un petit code test qui utilise la broche "backlight" du LCD.
Bouton gauche = activer, Bouton droit=désactiver
Cela fonctionne sans problème chez moi. Comme cette fonction utilisateur rétro-éclairage n'est pas déclarée par défaut dans la librairie LiquidCrystal officiel (du moins je ne l'ai pas trouvée *), j'ai simplement déclaré cette broche comme une simple LED directement dans le prog. Après il suffit de la placer en HIGH (allumé) ou LOW(éteint). Attention de ne pas oublier de déclarer cette broche (10) en OUTPOUT (sortie) !

* Il y a bien une fonction "lcd.noDisplay()" et "lcd.display()" mais cela ne concerne que l'affichage alphanumérique (que le texte)
Si on garde cette option dans le projet Stepduino (monopoliser une E/S en plus) je pense qu'une simple mise en veille après xx minutes serait suffisante (on pourrait aussi y ajouter le moteur PAP). Je ne sais pas s'il est nécessaire d'inclure ceci dans un menu ... on peut toujours modifier le code manuellement si besoin ...

Le code test

Code: Tout sélectionner
/*******************************************************
* Test activation/désactivation retro-éclairage LCD 5 boutons DFRobot
* Code de base : Mark Bramwell, July 2010
* Modif Ch.Aubert, Dec. 2011
*
********************************************************/


/************* Librairie(s) à inclure ****************/
#include <LiquidCrystal.h>


/************* Définir les broches du LCD (pins) ****************/
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int PinLCDBacklight = 10; // broche LCD Backlight
int PinBouton = 0; // broche analogique (A0) utisée pour les 5 boutons


/************* Définition des E/S ****************/
//int PinLedArduino = 13; // Led sur circuit Arduino


/************* Constantes ****************/
#define btnRIGHT  0 // define some values used by the panel and buttons
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5


/************* Variables ****************/
// Réglables
//

// NON Réglables
byte  lcd_key = 0;
int  adc_key_in = 0;



/************* Setup ****************/
void setup()
{
  lcd.begin(16, 2);        // initialiser la LCD library, 16 caractères, 2 lignes
  //pinMode(PinLedArduino, OUTPUT);

  pinMode(PinLCDBacklight, OUTPUT); // Broche LCD backlight en sortie
  digitalWrite(PinLCDBacklight, HIGH); // Retro-éclairage actif (par défaut il est déjà mais je le justifie ici)
}


/************* Boucle principale ****************/
void loop()
{
  lcd.setCursor(0,0);      // placer le curseur à la première ligne, première position
  lcd.print("LCD backlight"); // texte d'accueil
  lcd.setCursor(0,1);            // placer le curseur au début de la seconde ligne
  lcd.print("   <-On  ->Off"); // boutons à utiliser
  lcd_key = read_LCD_buttons();  // lire la valeur du bouton (->fonction)

  switch (lcd_key)               // selon le bouton appuyé ...
  {
  case btnRIGHT:
    {
      digitalWrite(PinLCDBacklight, LOW); // Retro-éclairage éteint
      //lcd.noDisplay(); // désactive l'affichage texte
      break;
    }
  case btnLEFT:
    {
      digitalWrite(PinLCDBacklight, HIGH); // Retro-éclairage actif
      //lcd.display(); // active l'affichage texte
      break;
    }
  case btnUP:
    {
      break;
    }
  case btnDOWN:
    {
      break;
    }
  case btnSELECT:
    {
      break;
    }
  case btnNONE:
    {
      break;
    }
  }

}

/************* Sous programmes ****************/




/************* Fonctions ****************/

//  Lire la valeur A/D retournée selon le bouton choisi
int read_LCD_buttons()
{
  adc_key_in = analogRead(PinBouton);   
  if (adc_key_in > 1000) return btnNONE; // On commence par la valeur la plus probable : Aucun appui sur bouton !
  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;  // si aucun appui sur bouton, on retoune la constante btnNONE ...
}



Et un extrait du schéma de ce LCD DFRobot, partie rétro-éclairage. J'ai annoté la broche backlight.
On remarque aussi que la ou les Led du rétroéclaige sont pilotées à travers un transistor, ceci j'imagine pour protéger l'Arduino d'une trop forte puissance sur l'E/S no.10
(schéma complet voir > http://www.dfrobot.com/image/data/DFR00 ... %20SCH.pdf)

LCD_DFRobot_backlight.jpg
Exif et Meta MicroCartouche LCD_DFRobot_backlight.jpg (83.32 Kio) Vu 21229 fois



Edit: Je n'ai pas eu le temps de lire le message de Mathieu (KeyZ) ! (merci pour les détails extension de fichier !)
Je vais creuser cette histoire d'assignation de pin dans la librairie ... mais en attendant ça fonctionne bien comme ça, quoi que, comme c'est une sortie PWM il est certainement possible de gérer en plus le niveau de luminosité ! (je vais voir ça)
Merci aussi pour le lien vers le simulateur !!
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar de l’utilisateur
Christian
Coadmin
Coadmin
 
Messages: 4790
Inscription: 28 Aoû 2007 20:54
Localisation: Entre Alpes et Jura
Prénom: Christian

PrécédenteSuivante

Retourner vers Afficheurs LCD et modules de saisie (boutons, joystick, ..)

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron