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.