Go Down

Topic: Ecran LCD avec boutons (LCD keypad shield) (Read 8957 times) previous topic - next topic

Jordan-pDevices

Jun 13, 2013, 06:51 pm Last Edit: Jun 18, 2013, 09:48 pm by Maestro14000 Reason: 1
Bonjour la communauté de l'Arduino ! (oui oui je sors  :smiley-sweat:)

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 :

Quote

//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 ?

marcha

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.

Jordan-pDevices

Non ça ne fonctionne pas.  :~  mais merci   ;)

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.

infobarquee

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.
AUCUNE AIDE PAR MP

Jordan-pDevices

OK  :)

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  :D

infobarquee

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

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


AUCUNE AIDE PAR MP

Jordan-pDevices

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  :smiley-eek:

Je vais essayer de comprendre comment fonctionne ton programme  :)

Jordan-pDevices

Euh... je comprends pas ton programme  :~

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

Jordan-pDevices

#8
Jun 18, 2013, 02:59 pm Last Edit: Jun 18, 2013, 03:10 pm by Maestro14000 Reason: 1
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 :/


Merci pour le temps que vous voudrez bien m'accorder

skizoh

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
  • =18; // on rempli la case x

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

    voila...

    Tout simple le tableau ! :)

Jordan-pDevices

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

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.  :smiley-roll-sweat:

skizoh

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

Jordan-pDevices

#12
Jun 18, 2013, 04:00 pm Last Edit: Jun 18, 2013, 04:08 pm by Maestro14000 Reason: 1
Voilà la partie du programme où ça ne fait pas ce que je veux ...


Quote

 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 ^^

skizoh

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

Code: [Select]
     
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 !

Jordan-pDevices

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


Mille fois merci pour cette correction !  :D

Go Up