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 "Faire une barre de progression avec Arduino et LiquidCrystal"
Flux RSS des posts récents dans ce topic ( Flux Atom)
Dans ce tutoriel, nous allons réaliser une barre de progression à l'aide de la bibliothèque LiquidCrystal, d'un écran LCD alphanumérique et d'une carte Arduino / Genuino. Nous commencerons d'abord par faire une barre de progression extrêmement simple. Nous ferons ensuite deux autres itérations du code, un peu plus complexe cette fois, afin d'accéder au Saint Graal de la barre de progression.
Lire la suite de l'article sur le site
Derniére modification le
#42 |
Salut Skywodd!!
Super tuto, je me suis bien amusé!!
J' essais maintenant de faire une barre de progression verticale, c' est pas la même approch dans la fonction " draw_progressbar(byte percent) ", mais je trouverais bien comment faire.
Un grand merci!
#44 |
J' essais maintenant de faire une barre de progression verticale, c' est pas la même approche dans la fonction " draw_progressbar(byte percent) ", mais je trouverais bien comment faire.
par weetoz
Une barre verticale ? Sur un caractère de haut ?
Derniére modification le
#47 |
Une barre verticale ? Sur un caractère de haut ?
Sur deux et quatre caractères, ( je commence par quatre, j' ai câblé un LCD 20x4 pour le tuto ).
La fonction LCD.write() donne des résultats inattendu pour le moment, et comme je ne suis pas à mon aise avec le fonctionnement des variables static, je vais revoir la fonction "progressBar" a ma sauce.
Je vous tiens au jus!
#52 |
La fonction LCD.write() donne des résultats inattendu pour le moment, et comme je ne suis pas à mon aise avec le fonctionnement des variables static, je vais revoir la fonction "progressBar" a ma sauce.
par weetoz
Attention, après chaque utilisation de createChar()
(ou après une série de createChar()
), il faut faire une clear()
ou setCursor()
. Si ce n'est pas fait, les caractères personnalisés ne vont pas s'afficher ou vont afficher des caractères bizarres.
C'est un bug "à la con" dans LiquidCrystal dû à une mauvaise gestion des adresses mémoires.
#80 |
"à Maker vaillant rien d’impossible" juste mort de rire !
Je n'ai pas encore tout bien saisi de l'article (pour ne pas dire pas grand chose…) mais merci pour le fou rire ^^
Derniére modification le
#289 |
Salut,
pas certain d'avoir une réponse mais je tente ma chance. Comment dois je faire pour ralentir la vitesse de progression?
Merci d'avance et bravo pour cet article très bien expliqué.
#290 |
Comment dois je faire pour ralentir la vitesse de progression?
par rospclan
La vitesse de progression est liée à la vitesse de l'appel à draw_progressbar()
.
Dans mon exemple, il suffit de modifier la ligne :
1 2 | /* Petit temps d'attente */
delay(100);
|
Un délai de 500 millisecondes sera 5 fois plus lent par exemple.
#291 |
Merci pour cette réponse rapide. Une dernière question, je voudrais que la barre de progression puisse également diminuer lorsqu'une condition est présente, une piste à me donner ?
#292 |
Bonsoir rospclan,
c'est dans cette partie de code que cela va ce passer:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | for (byte i = 0; i < LCD_NB_COLUMNS; ++i) {
/* En fonction du nombre de colonnes restant à afficher */
if (nb_columns == 0) { // Case vide
lcd.write((byte) 0);
} else if (nb_columns >= 5) { // Case pleine
lcd.write(5);
nb_columns -= 5;
} else { // Derniére case non vide
lcd.write(nb_columns);
nb_columns = 0;
}
}
|
Tu peux par exemple créer ta condition en dessous de la boucle for qui aiguillera vers ta boucle for .
1 2 3 4 5 6 |
if(macondition){
for (intj=LCD_NB_COLUMNS;i=0;i--){
// réadapter ici les conditions d'écriture et de changement de case
}
}
|
#293 |
J'essaye de faire fonctionner ça, un très grand merci pour cette aide précieuse.
#296 |
La fonction draw_progressbar()
prend en argument le pourcentage à afficher.
Il suffit de faire diminuer le pourcentage (voir boucle for
dans la fonction loop()
du code d'exemple) pour faire diminuer la barre de progression.
Pas besoin de modifier le code de la fonction draw_progressbar()
.
Bouton appuyé == augmentation du pourcentage :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | void loop(){
/* Valeur en pourcentage de la barre de progression */
static byte percent = 0;
/* Affiche la valeur */
draw_progressbar(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(100);
}
|
Bouton appuyé == diminution du pourcentage :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | void loop(){
/* Valeur en pourcentage de la barre de progression */
static int percent = 100;
/* Affiche la valeur */
draw_progressbar(percent);
/* Décrémente le pourcentage */
if (--percent == -1) {
// Revient à 100% si le pourcentage dépasse 0%
percent = 100;
delay(1000);
}
/* Petit temps d'attente */
delay(100);
}
|
Bouton appuyé == augmentation puis diminution du pourcentage :
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 | void loop(){
/* Valeur en pourcentage de la barre de progression */
static int percent = 0;
static byte augmente_valeur = true;
/* Affiche la valeur */
draw_progressbar(percent);
/* Incrémente le pourcentage */
if (augmente_valeur) {
if (++percent == 101) {
percent = 100;
augmente_valeur = false;
delay(1000);
}
/* Décrémente le pourcentage */
} else {
if (--percent == -1) {
percent = 0;
augmente_valeur = true;
delay(1000);
}
}
/* Petit temps d'attente */
delay(100);
}
|
#384 |
Juste énorme !
J'avais déjà fait la même chose que la v1 qui convenait au besoin, mais n'était effectivement pas très esthétique… là, c'est top !
Bravo
#389 |
Encore moi
Je me demandais s'il n'était pas possible d'optimiser l'affichage pour qu'il prenne moins de temps.
Ici, on redessine à chaque fois toute la barre. Normalement, on ne redescend pas en nombre (sauf à faire une jauge). Donc pour optimiser la progressbar sans trop pénaliser la jauge, il serait possible de mémoriser la valeur précédente. Si on augmente, il suffit de redessiner uniquement les caractères supplémentaires. Si on diminue, alors on peut tout redessiner. Voire même de faire la même chose dans le cas d'une diminution, calculer d'abord les caractères différents. Ca ajoute un peu de calcul, mais ça économise un paquet de print et setCursor qui sont plutôt couteux.
Si j'ai l'occasion de le faire, je posterai le code ici.
#390 |
Je me demandais s'il n'était pas possible d'optimiser l'affichage pour qu'il prenne moins de temps.
par Wile
On peut optimiser l'affichage, mais quel intérêt ?
Ajouter du code, de la complexité, des bugs et une variable globale pour économiser quelques print()
sur une ligne de 16 caractères …
Au mieux ça fera gagner quelques millisecondes sur la routine affichage, mais est-ce que ça vaut la peine ?
Franchement, je ne pense pas. Autant garder le code le plus simple possible.
Les micro-optimisations sont généralement une fausse bonne idée
#394 |
Ca prend pas mal de temps l'affichage LCD. Je fais de la HSP (High Speed Photography), donc les ms sont importantes. Bon, après, il me suffit de ne pas mettre à jour l'affichage pendant la phase critique en même temps hein
Perso, les micro-optimisations, j'y suis obligé, mais surtout pour la mémoire en ce moment… 28K de programme (pas mal de constantes en PROG_MEM) et 2,3K de RAM utilisée. Mais j'peux pas passer au méga à cause du volume restreint disponible, et du besoin de connectivité. Du coup, c'est sur un Yun (une merveille ce truc ! ). Mais je confirme que dans le cas général, les optimisations comme ça apportent plus d'emmerdes qu'elles n'en résolvent
Derniére modification le
#397 |
Ca prend pas mal de temps l'affichage LCD. Je fais de la HSP (High Speed Photography), donc les ms sont importantes. Bon, après, il me suffit de ne pas mettre à jour l'affichage pendant la phase critique en même temps hein
par Wile![]()
Section critique = pas de refresh de l'écran.
Du coup l'optimisation d'affichage ne sert à rien
Mais je confirme que dans le cas général, les optimisations comme ça apportent plus d'emmerdes qu'elles n'en résolvent
par Wile![]()
Le pire c'est les micro optimisations pendant le dév (quand on sait pas encore quoi optimiser). En général ça cache un manque de réflexion sur la structure même du programme et un gros soucis de performance ailleurs.
Exemple : micro-optimiser une boucle, quand on utilise à côté une liste chaînée au lieu d'une liste avec des accès à des index aléatoires.
#1033 |
Bonjour à tous;
j'aimerais intégrer la barre de chargement dans un de mes programmes qui fonctionne déjà bien.
le souci c'est que lorsque mon programme arrive à la barre de chargement tout son passe bien jusqu'au 100% le chargement se fait en boucle au lieu de continuer normalement une idée ?
Merci d'avance
#1035 |
c'est tellement vrai DSL par contre c'est coder très très moche ^.^
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 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 | #include <Keypad.h>
#include <LiquidCrystal.h>
#define buzzer 8
const byte ROWS = 4;
const byte COLS = 4;
const int ledV=42;
const int ledR=40;
int delay1=3000;
int c=0;
int i=0;
int error=0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// pin 12 RW pin
char keys[ROWS][COLS] =
{{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};
char pass[]={'7','1','1','9'};
char newpass[4];
byte rowPins[ROWS] = {14,15,16,17};
byte colPins[COLS] = {18,19,20,21};
int count=0;
int f=0;
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup()
{
Serial.begin(9600);
pinMode(buzzer, OUTPUT);
pinMode(ledR,OUTPUT);
pinMode(ledV,OUTPUT);
digitalWrite(ledR,HIGH);
digitalWrite(ledV,LOW);
lcd.clear();
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0,0);
lcd.println("----- Tube -----");
lcd.setCursor(0,1);
lcd.println("---Verouiller---");
digitalWrite(ledR,HIGH);
digitalWrite(ledV,LOW);
delay(delay1);
}
void print1()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.println("----- Tube -----");
lcd.setCursor(0,1);
lcd.println("---Verouiller---");
digitalWrite(ledR,HIGH);
digitalWrite(ledV,LOW);
delay(delay1);
}
void loop()
{
digitalWrite (ledV, LOW);
digitalWrite (ledR, HIGH);
char key = keypad.getKey();
if(key != NO_KEY&&i<4)
{
if(f==0)
{
lcd.clear();
f=1;
}
tone(buzzer, 700,100);
delay(300);
lcd.setCursor(0,0);
lcd.print("**Mot de passe**");
lcd.setCursor(i,1);
lcd.print("*");
digitalWrite(ledR,HIGH);
newpass[i]=key;
if(newpass[i]==pass[i])c++;
i++;
}
if(c==4)
{
delay(500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Deverouillage "); //remplacer Deverouillage et en cours par la barre de chargement
lcd.setCursor(0 ,1);
lcd.print("-- En cours --");
delay (5000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("***** Tube *****");
lcd.setCursor(0 ,1);
lcd.print("*****Ouvert*****");
digitalWrite(ledV,HIGH);
digitalWrite(ledR,LOW);
delay (500);
digitalWrite(ledV,LOW);
digitalWrite(ledR,HIGH);
delay (500);
digitalWrite(ledV,HIGH);
digitalWrite(ledR,LOW);
delay(100000);
char newpass[]={'0','0','0','0','0','0'};
print1();
c=0;
i=0;
f=0;
}else if(c<4&&i==4)
{
tone(buzzer, 500, 200);
delay(500);
lcd.clear();
lcd.setCursor(1,0);
lcd.print(" >< ERREUR >< ");
lcd.setCursor(0,1);
lcd.print("DANGER");
delay(delay1);
digitalWrite(ledV,HIGH);
digitalWrite(ledR,HIGH);
delay(500);
digitalWrite(ledV,LOW);
digitalWrite(ledR,LOW);
delay(500);
digitalWrite(ledV,HIGH);
digitalWrite(ledR,HIGH);
delay(500);
digitalWrite(ledV,LOW);
digitalWrite(ledR,LOW);
delay(500);
digitalWrite(ledV,LOW);
digitalWrite(ledR,HIGH);
delay(1000);
i=0;
c=0;
error++;
if(error<3)
{
print1();
}
f=0;
}
if(error==3)
{
delay(500);
digitalWrite(ledV,HIGH);
digitalWrite(ledR,HIGH);
delay(500);
digitalWrite(ledV,LOW);
digitalWrite(ledR,LOW);
delay(500);
digitalWrite(ledV,HIGH);
digitalWrite(ledR,HIGH);
delay(500);
digitalWrite(ledV,LOW);
digitalWrite(ledR,LOW);
lcd.clear();
tone(buzzer, 500, 200);
delay(500);
tone(buzzer, 500, 200);
delay(500);
tone(buzzer, 500, 200);
delay(500);
lcd.setCursor(0,0);
lcd.print("> 3 tentatives <");
lcd.setCursor(0,1);
lcd.print(">Desactivation 1 mn<");
delay(3000);
digitalWrite(ledV,HIGH);
digitalWrite(ledR,HIGH);
delay(500);
digitalWrite(ledV,LOW);
digitalWrite(ledR,LOW);
delay(500);
digitalWrite(ledV,HIGH);
digitalWrite(ledR,HIGH);
delay(500);
digitalWrite(ledR,LOW);
digitalWrite(ledV,LOW);
delay(500);
digitalWrite(ledV,LOW);
digitalWrite(ledR,HIGH);
delay(60000);
error=0;
print1();
f=0;
}
}
|
voilà voilà
que fait le code afficher tube verrouiller Mot de passe ok déverrouillage en cours <---- remplacer "déverrouillage en cours" par la barre de chargement v3 tube déverrouiller Mot de passe faux erreur danger
reviens au tube verrouiller au bout de 3 tentative 3 tentative désactivation 1 mn
Derniére modification le
#1047 |
Bonsoir, merci pour ce tuto. Je suis sur un lcd 20*4 et je souhaite afficher mon logo en écran de démarrage. J’ai donc créé 80 tableaux de custom char. J’ai aussi commencé un sketch avec un tableau regroupant les 80 autres pour les enregistrer dans l’ EEPROM de l’arduino. Mais je bloque pour tout afficher sur le lcd. Pouvez-vous me donner un coup de main?
Derniére modification le