Topic "[resolu] P'tit souci d' affichage ( en rapport avec le tuto "Barre de progression")"

Flux RSS des posts récents dans ce topic ( Flux Atom)


Pas de photo de profil

weetoz

Membre

#48 | Signaler ce message


Salut les Makers!!

suite à l' article de Skywodd, j' essais de faire une barre de progression vertical sur un LCD 20x4.

L' intérêt est plus celui d' une barre témoin qui, par exemple, puisse servir à voir la course d' un potentiomètre, ou encore, visualiser approximativement la valeur d' une variable, pourquoi? pourquoi pas pour un p'tit contrôleur midi!

Bref, j' en viens à mon souci: Lorsque la première case se remplit, cela fonctionne bien, puis lorsque cette dernière est remplit et qu'il faut passer à celle d' au dessus, la case qui vient d' être remplit s' efface,(ce qui n' est pas normal), et la deuxième case commence son remplissage, puis la troisième et quatrième, et ce sans que les précédentes ne s' efface. (donc correctement).

Voici le code: ( quasi le même que celui du tuto, mais adapté pour la verticale).

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/* Constantes pour la taille de l'écran LCD */
const int LCD_NB_ROWS = 4;
const int LCD_NB_COLUMNS = 20;

//on défini ici la position de la barre de progression
const int BAR_POS =0;  
const int NB_CHAR = 4;
byte DIV_0_OF_3[8] = {
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000
}; // 0 / 3

byte DIV_1_OF_3[8] = {
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
    B11111,
    B11111
}; // 1 / 3

byte DIV_2_OF_3[8] = {
    B00000,
    B00000,
    B00000,
    B11111,
    B11111,
    B00000,
    B11111,
    B11111
}; // 2 / 3

byte DIV_3_OF_3[8] = {
    B11111,
    B11111,
    B00000,
    B11111,
    B11111,
    B00000,
    B11111,
    B11111
}; // 3 / 3
void setup_progressbar() {

    /* Enregistre les caractères personnalisés dans la mémoire de l'écran LCD */
    lcd.createChar(0, DIV_0_OF_3);
    lcd.createChar(1, DIV_1_OF_3);
    lcd.createChar(2, DIV_2_OF_3);
    lcd.createChar(3, DIV_3_OF_3);
}
void setup() {
  // put your setup code here, to run once:
      lcd.setBacklight ( HIGH );
    lcd.begin(LCD_NB_COLUMNS, LCD_NB_ROWS); // initialize the lcd
        setup_progressbar();
    lcd.home ();                   // go home
    lcd.print("Salut les makers!!");
    lcd.setCursor ( 0, 1 );        // go to the next line
    lcd.print ("Tuto de la barre de");
    lcd.setCursor ( 0, 2 );        // go to the next line
    lcd.print ("progression");
    lcd.setCursor ( 0, 3 );        // go to the next line
    delay(2000);
    lcd.clear();
    lcd.setCursor ( 2, 0 );                   // go home
    lcd.print("Salut les makers!!");
    lcd.setCursor ( 2, 1 );
    lcd.print ("progression:");
}

void loop() {
  // put your main code here, to run repeatedly:
  static byte percent=0;
    /* Affiche la valeur */
    //draw_progressbar(percent);
    draw_progressbar(percent);
    //deplaceIcon(percent);
    /* Incrémente le pourcentage */
    if (++percent == 101) {
        // Revient à zéro si le pourcentage dépasse 100%
        percent = 0;
        delay(1000);
    }
    /* Petit temps d'attente */
    delay(200);
}

void draw_progressbar(byte percent) {

    /* Affiche la nouvelle valeur sous forme numérique sur la première ligne */
    lcd.setCursor(15, 1);
    lcd.print(percent);
    lcd.print(F(" %  "));
    // N.B. Les deux espaces en fin de ligne permettent d'effacer les chiffres du pourcentage
    // précédent quand on passe d'une valeur à deux ou trois chiffres à une valeur à deux ou un chiffres.

    /* Map la plage (0 ~ 100) vers la plage (0 ~ LCD_NB_ROWS * 3) */
    byte nb_rows = map(percent, 0, 100, 0, LCD_NB_ROWS * 3);
        lcd.setCursor(5, 2);
        lcd.print("nb_rows:");
        lcd.setCursor(13, 2);
        lcd.print(nb_rows);
        // permet d' effacer les caractères résiduels lorsque le compteur repasse à zéro
        lcd.print(F("  "));  
        
    /* Dessine chaque caractère de la ligne */  
            for(int i = 0; i< NB_CHAR; i++)
              { 
                if(i==0){                            // première ligne, ligne du bas
                //lcd.setCursor(BAR_POS,LCD_NB_ROWS);
                  lcd.setCursor(0,3);
                  if(nb_rows == 1){
                    lcd.write((byte)1);
                    }
                  else if(nb_rows == 2){
                    lcd.write((byte)2);
                    }  
                  else if(nb_rows == 3){
                    lcd.write((byte)3);
                    }  
                  
               }
               else if(i==1){                               // deuxième ligne
                //lcd.setCursor(BAR_POS,LCD_NB_ROWS-1);
                  lcd.setCursor(0,2);
                  if(nb_rows==4){
                     lcd.write((byte)1);
                    }
                  else if(nb_rows == 5){
                    lcd.write((byte)2);
                    }
                  else if(nb_rows == 6){
                    lcd.write((byte)3);
                    }  
               }
               else if(i==2){                               // troisième ligne
                //lcd.setCursor(BAR_POS,LCD_NB_ROWS-1);
                  lcd.setCursor(0,1);
                  if(nb_rows==7){
                     lcd.write((byte)1);
                    }
                  else if(nb_rows == 8){
                    lcd.write((byte)2);
                    }
                  else if(nb_rows == 9){
                    lcd.write((byte)3);
                    }  
               }
               else if(i==3){                               // quatrieme ligne
                //lcd.setCursor(BAR_POS,LCD_NB_ROWS-1);
                  lcd.setCursor(0,0);
                  if(nb_rows==10){
                     lcd.write((byte)1);
                    }
                  else if(nb_rows == 11){
                    lcd.write((byte)2);
                    }
                  else if(nb_rows == 12){
                    lcd.write((byte)3);
                    }  
               }
                // On  efface toute la colonne
               if(nb_rows==0){
                     lcd.write((byte)0);
                    }
             }
           
               
}

J' ai beau le relire, je ne vois pas où j' ai merdé, j' ai donc besoin d' un regard extérieur.

Merci d' avance.

Derniére modification le par weetoz


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#54 | Signaler ce message


Salut,

Je pense que ta boucle for est inutilement compliqué et que le problème vient de là.

J'ai bidouillé deux extraits de code qui devrait fonctionner, à tester ;)

Progression vers le bas :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
for (int i = 0; i < LCD_NB_ROWS; i++)
{
  lcd.setCursor(BAR_POS, i);
  
  if (nb_rows > 3) {
    lcd.write(3);
    nb_rows -= 3;
  } else {
    lcd.write(nb_rows);
    nb_rows = 0;
  }
}

Progression vers le haut :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
for (int i = LCD_NB_ROWS - 1; i >= 0; i--)
{
  lcd.setCursor(BAR_POS, i);
  
  if (nb_rows > 3) {
    lcd.write(3);
    nb_rows -= 3;
  } else {
    lcd.write(nb_rows);
    nb_rows = 0;
  }
}

Pas de photo de profil

weetoz

Membre

#55 | Signaler ce message


Salut Skywodd!

Tout à fait, ma boucle for étant alambiqué, il m' est difficile de comprendre ce qui ce passe dedans. J' ai encore bien des progrès à faire avec les structures de contrôles… La deuxième boucle que tu m' as proposé fonctionne exactement comme je l' espérais, merci Skywodd!


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#65 | Signaler ce message


La solution la plus simple est souvent la meilleure ;)