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)


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#33 | Signaler ce message


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 par skywodd


Pas de photo de profil

weetoz

Membre

#42 | Signaler ce message


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!


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#44 | Signaler ce message


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 par skywodd


Pas de photo de profil

weetoz

Membre

#47 | Signaler ce message


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!


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#52 | Signaler ce message


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.


Photo de profil de Ecua

Ecua

Membre

#80 | Signaler ce message


"à 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 par Ecua


Pas de photo de profil

rospclan

Membre

#289 | Signaler ce message


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é.


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#290 | Signaler ce message


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.


Pas de photo de profil

rospclan

Membre

#291 | Signaler ce message


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 ?


Pas de photo de profil

weetoz

Membre

#292 | Signaler ce message


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

Pas de photo de profil

rospclan

Membre

#293 | Signaler ce message


J'essaye de faire fonctionner ça, un très grand merci pour cette aide précieuse.


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#296 | Signaler ce message


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

Pas de photo de profil

Wile

Membre

#384 | Signaler ce message


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


Pas de photo de profil

Wile

Membre

#389 | Signaler ce message


Encore moi :D

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.


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#390 | Signaler ce message


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


Pas de photo de profil

Wile

Membre

#394 | Signaler ce message


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

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 par Wile


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#397 | Signaler ce message


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

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.


Pas de photo de profil

Obones

Membre

#1033 | Signaler ce message


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


Pas de photo de profil

weetoz

Membre

#1034 | Signaler ce message


Bonjour,

Avec le code, c'est mieux.

Merci.


Pas de photo de profil

Obones

Membre

#1035 | Signaler ce message


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 par Obones


Pas de photo de profil

Obones

Membre

#1036 | Signaler ce message


Up toujours personne pour m'aider ?