Yahoo refuse tous les emails du site. Si vous avez une adresse chez un autre prestataire, c'est le moment de l'utiliser
En cas de soucis, n'hésitez pas à aller faire un tour sur la page de contact en bas de page.
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)
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
#54 |
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;
}
}
|
#55 |
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!
#65 |
La solution la plus simple est souvent la meilleure