Ecran LCD avec boutons (LCD keypad shield)

Bonjour la communauté de l'Arduino ! (oui oui je sors :sweat_smile:)

J'ai acheté un écran LCD Keypad Shield il y a peu. Pour l'essayer, je veux faire deux trois petits trucs un peu inutiles mais qui permettent de tenter de grandes choses par la suite !

Alors tout d'abord voilà ce que je veux faire : augmenter ou diminuer unité par unité le chiffre se trouvant au dessus du curseur avec les boutons UP et DOWN et pouvoir me déplacer sur le chiffre que je veux (en affichant le curseur) avec les boutons LEFT et RIGHT.
Sur la première ligne à partir du premier caractère, j'affiche dès le début 0000. Et ce sont ces chiffres que je peux modifier, mais on choisit toujours le chiffre entre 0 et 9, il n'y a pas de "retenues"

Alors voilà mon programme et juste après je vous met mon PROBLÈME :

//Sample using LiquidCrystal library
#include <LiquidCrystal.h>

// 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
int u = 0 ;
int d = 0 ;
int c = 0 ;
int m = 0 ;
int x = 0 ;

// 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
// For V1.1 us this threshold
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 250) return btnUP;
if (adc_key_in < 450) return btnDOWN;
if (adc_key_in < 650) return btnLEFT;
if (adc_key_in < 850) return btnSELECT;

// For V1.0 comment the other threshold and use the one below:
/*
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;
*/
}

void setup()
{
lcd.begin(16, 2); // start the library
//lcd.setCursor(0,0);
//lcd.print("Push the buttons"); // print a simple message
lcd.setCursor(x,0); // move to the begining of the second line
}

void loop()
{
// Turn off the cursor:
/lcd.noCursor();/
/delay(500);/

lcd.cursor();
delay(200);
lcd.noCursor();
delay(200);

lcd.setCursor(3,0); // move cursor to second line "1" and 9 spaces over
lcd.print(u);
lcd.setCursor(2,0); // move cursor to second line "1" and 9 spaces over
lcd.print(d);
lcd.setCursor(1,0); // move cursor to second line "1" and 9 spaces over
lcd.print(c);
lcd.setCursor(0,0); // move cursor to second line "1" and 9 spaces over
lcd.print(m);

lcd.setCursor(x,0);

lcd_key = read_LCD_buttons(); // read the buttons

switch (lcd_key) // depending on which button was pushed, we perform an action
{
case btnRIGHT:
{
x = x+1;
if(x>3)
x = 0;
lcd.setCursor(x,0);
break;
}
case btnLEFT:
{
x = x-1;
if(x<0)
x = 3;
lcd.setCursor(x,0);
break;
}

case btnUP:
{
if(x=0){
m = m + 1;
if(m>9)
m = 0;
lcd.print(m);
break;
}
if(x=1){
c = c + 1;
if(c>9)
c = 0;
lcd.print(c);
break;
}
if(x=2){
d = d + 1;
if(d>9)
d = 0;
lcd.print(d);
break;
}
if(x=3){
u = u + 1;
if(u>9)
u = 0;
lcd.print(u);
break;
}

}

case btnDOWN:
{
if(x=0){
m = m - 1;
if(m<0)
m = 9;
lcd.print(m);
break;
}
if(x=1){
c = c - 1;
if(c<0)
c = 9;
lcd.print(c);
break;
}
if(x=2){
d = d - 1;
if(d<0)
d = 9;
lcd.print(d);
break;
}
if(x=3){
u = u - 1;
if(u<0)
u = 9;
lcd.print(u);
break;
}

}

case btnSELECT:
{
// lcd.print("SELECT");
break;
}
break;
}

}

Alors le fameux problème : peut importe ou je place mon curseur au début, j'incrémente de 1 et le chiffre va se placer avec le curseur au niveau des centaines... Je voudrais qu'il reste là où je lui ai demandé d'être moi...

ILLUSTRATION : 0000 -> 1000 -> 0100 (le trait qui souligne est le curseur, la deuxième étape l’incrémentation et ensuite le résultat final)

Je suis perdu... Quelqu'un peut m'aider ?

Salut,

Sauf erreur le fait de faire un print déplace le curseur automatiquement à droite. Ajoute simplement un lcd.setCursor(x,0); après les print et ça devrait replacer le curseur au bon endroit.

Non ça ne fonctionne pas. :~ mais merci :wink:

J'ai toujours le même problème, ça n'a rien changé du tout ...

Je comprends pas du tout d'où ça peut venir, c'est assez énervant je dois dire.

bonjour,
la solution serait de mettre en tableau les nombres.
en fonction du déplacement du curseur, on change de "colonne" dans le tableau.
j'avais fait un truc dans ce genre, faudrait que je fouille dans mes hd pour retrouver le code.

OK :slight_smile:

Par contre je ne maîtrise pas du tout les tableaux de valeur, je m'en suis encore jamais servis..

Je vais chercher sur le site, mais si tu peux me donner rien qu'un exemple de code ce serait vraiment sympa :smiley:

vraiment un bon jour de ma part,
bon le code est pas entier, à toi de chercher aussi, il est un peu cracra

char* num[0];
char* num1="0";
char* num2="0";
char* num3="0";
char* num4="0";
char* num5="0";
char* num6="0";
char* num7="0";
char* num8="0";
char* num9="0";

char number[10];
char nombre;

.....
.....
.....
//deplacement vers la droite
if(get_key(adc_key_in)==0){
if(deplacement > 12){deplacement=-1;}
deplacement++;
lcd.cursorTo(2, deplacement);
Serial.print(deplacement);
lcd.commandWrite(0b00001111);
}
//deplacement vers la gauche
if(get_key(adc_key_in)==3){
if(deplacement <1){deplacement=+1;}
deplacement--;
lcd.cursorTo(2, deplacement);
Serial.print(deplacement);
lcd.commandWrite(0b00001111);
}
//augmentation du nombre
if(get_key(adc_key_in)==1){
if(nombre>9){nombre=-1;}
nombre++;
lcd.cursorTo(2, deplacement);
//Serial.println(deplacement);
Serial.println(nombre);
num[0]=nombre;
//Serial.println(num[deplacement]);
lcd.printIn(num[0]);
//lcd.commandWrite(0b00001111);
}

Ok merci.

Et je vois cette commande : lcd.commandWrite(0b00001111);

C'est pour écrire un caractère spécial ? Si c'est ça ça tombe bien car je cherchais aussi ^^

La je suis en train de regarder un cours du site du zero sur les pointeurs et les tableaux... c'est vraiment complexe :astonished:

Je vais essayer de comprendre comment fonctionne ton programme :slight_smile:

Euh... je comprends pas ton programme :~

Je vois pas où tu utilise ton tableau "num" dedans ?

Salut !

Est-ce que tu pourrais m'expliquer à quoi correspond ton test : if(get_key(adc_key_in)==0)
Le zéro correspond à une touche ?

Et moi quand j'essaye avec cette commande ça me dit que get_key n'a pas été déclaré. Voici le message d'erreur :

test_ecran.ino: In function 'void loop()':
test_ecran:73: error: 'get_key' was not declared in this scope
test_ecran:76: error: 'class LiquidCrystal' has no member named 'cursorTo'
test_ecran:78: error: 'class LiquidCrystal' has no member named 'commandWrite'
test_ecran:81: error: 'get_key' was not declared in this scope
test_ecran:84: error: 'class LiquidCrystal' has no member named 'cursorTo'
test_ecran:86: error: 'class LiquidCrystal' has no member named 'commandWrite'

Ou si quelqu'un d'autre peux m'aider à avancer un peu ?

Car là je sèche complètement, ça fait 4 jours que je suis bloqué là-dessus :confused:

Merci pour le temps que vous voudrez bien m'accorder

la il ce sert du tableau : Serial.println(num[deplacement]);

déclaration : char num[10]; ( la char tu peut utiliser les tableau avec tout int float etc.. )
int x=0;

utilisation:

num[1]=2; // on rempli la case 1
num[x]=18; // on rempli la case x

x = num[8]; on récupère le contenu de la case 8

voila...

Tout simple le tableau ! :slight_smile:

Ok,

Là je comprends bien le tableau qu'il utilise. (j'ai cherché avant sur le site du zéro, il y a un très bon cours là dessus :wink: )

Mais je n'ai toujours pas réussis à résoudre mon problème initial... J'ai réduit l'application à seulement deux chiffres pour tester sur un truc plus simple et ça ne fonctionne pas non plus...

En fait quand j'incrémente je modifie le premier chiffre et quand je veux baisser sa valeur, ça modifie le deuxième chiffre... peut importe l'endroit où je me trouve. :cold_sweat:

bas envoie la partie de ton code qui déconne on va voire ça :slight_smile:

Voilà la partie du programme où ça ne fait pas ce que je veux ...

switch (lcd_key) // depending on which button was pushed, we perform an action
{

case btnRIGHT:
{
x=x+1;
break;
}

case btnLEFT:
{
x=x-1;
break;
}

case btnUP:
{
if(x=0){
tableau[0] = tableau[0] + 1;
if(tableau[0]>9)
tableau[0] = 0;
break;
}

if(x=1){
tableau[1] = tableau[1] + 1;
if(tableau[1]>9)
tableau[1] = 0;
break;
}
}

case btnDOWN:
{
if(x=0){
tableau[0] = tableau[0] - 1;
if(tableau[0]<0)
tableau[0] = 9;
break;
}

if(x=1){
tableau[1] = tableau[1] - 1;
if(tableau[1]<0)
tableau[1] = 9;
break;
}
}

Là ça me modifie que le deuxième chiffre. C'est assez énervant de passer tant de temps sur un petit truc comme ça ^^

Si tu veux mon avis tu ne passe pas dans tes if :

 if(x=0){ <=================================== if ( x == 0 ){  le == est important ! 
      tableau[0] = tableau[0] + 1;
      if(tableau[0]>9)
             tableau[0] = 0;
 break;
 }

Sinon

   case btnUP:
     {
       if(x=0){
       tableau[0] = tableau[0] + 1;
       if(tableau[0]>9)
         tableau[0] = 0;
       break;
       }
       
       if(x=1){
        tableau[1] = tableau[1] + 1;
       if(tableau[1]>9)
         tableau[1] = 0;
       break;
       }
       break; // <=============================== sinon tu ne sort jamais de ta case et ça peut pauser problème. 
     }

Mise à part ces deux erreurs , vérifie que ton tableau est bien initialisé et surtout initialisé en int c'est préférable pour ce que tu fait.

Skizo !

C'était ça !!!!!!!

Mille fois merci pour cette correction ! :smiley:

De rien :slight_smile: oubli jamais les == c'est vitale :slight_smile: ( en plus c'est sournois car le compilo ne te dit jamais que c'est pas bon ^^ )

Skizo !

Oui,

J'y penserais là prochaine fois :slight_smile:

hum, si tu n'à plus de problème ajoute [résolu] dans le titre de ton topic ça feras un de moins à allé voir pour les autres :wink:

Skizo !

J'ai encore un "problème" que tu sauras peut être résoudre rapidement.

Si tu veux, là je peux choisir les chiffres que je veux. et chaque chiffre est stocké dans une case de mon tableau.
Quand j'appuis sur SELECT, je veux enregistrer le nombre dans une variable integer. Regarde ce que j'ai écris et qui ne fonctionne pas, tu comprendras peut-être ce que je veux faire :

case btnSELECT:
{
nombre = chiffre[3]chiffre[2]chiffre[1]chiffre[0];
lcd.setCursor(0,0);
lcd.print(nombre);
break;
}

Chiffre[0]=unités Chiffre[1]=dizaines Chiffre[2]=centaines Chiffre[3]=milliers

nombre = chiffre[3]*1000 + chiffre[2]*100+ chiffre[1]*10 + chiffre[0];