Taux de rafraîchissement d'un LCD problématique ?

Hey !

J'ai un problème avec un LCD, celui livré dans le Starter Kit Arduino. Je l'ai branché comme il faut, d'après le "Livre De Projets".
Petit test rapide : Si je demande d'afficher "Hello World" dans le setup, aucun problème il affiche ce qu'il faut.
Je rencontre un problème avec l'application que j'en fait :

Je doit faire varier la vitesse d'un moteur, la solution est la MLI. Pour ne pas avoir à rebrancher l'Arduino au PC toutes les 5 minutes, j'ai décidé de faire la MLI à partir d'un potentiomètre. Pour contrôler ce que je fait, je veux afficher le pourcentage de la MLI sur le LCD.
Voici l'extrait de code concerné :

#include <LiquidCrystal.h> //Appel de la bibliothèque
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); //J'ai choisi ces broches et pas celles du bouquin pour éviter les conflits avec le Motor Shield
int const potPin = A2; //Entrée du potentiomètre
int potVal; //Variable du potentiomètre
int PWM; //Variable de la PWM pour le Shield
int pourcentage; // Variable du pourcentage de la PWM pour l'affichage

void setup() {
  //Initialisation du LCD
  lcd.begin(16,2); //16 colonnes, 2 lignes
  lcd.print("Hello World"); //Test : OK !
  
  Serial.begin(9600); //Démarage du moniteur série
}

void loop(){
  //Réglage PWM
  potVal = analogRead(potPin); //On récupère la valeur du potentiomètre
  Serial.print("\npotVal : ");
  Serial.print(potVal);//Affichage dans le moniteur série, au cas où. Me permet de savoir que la variation est entre O et 1023
  PWM = map(potVal, 0, 1023, 0, 254); //Modification de la PWM, à envoyer aux broches 3 et 11
  pourcentage = map(potVal, 0, 1023, 0, 100); //Modification du pourcentage, à afficher sur le LCD

  //Affichage sur le LCD
  lcd.clear(); //Je nettoie l'écran
  lcd.setCursor(0,0);//Je place le curseur à la première case de l'écran
  lcd.print(pourcentage);//j'affiche
}

Le reste du code est pour faire ce que j'ai à faire avec les moteurs, et ne me pose aucun problème.

Non, mon problème, c'est que le LCD m'affiche absolument n'importe quoi dès que je veux écrire depuis le loop. J'ai essayé plein de chose pour y remédier :

  • supprimer le "Hello World" du setup;
  • Effacer le lcd.clearet/ou le lcd.print du loop;
  • Afficher un message permanent, sans me baser sur le potentiomètre dans le loop, du genre lcd.print("Bonjour");
  • Imposer un délai entre chaque changement d'affichage, jusqu'à 2 secondes, via delay(2000) toujours dans le loop;
  • Différentes combinaisons de ces propositions...

Rien à faire, il m'affiche toujours des choses étranges et variées. J'ai eu le droit à du Mandarin, des carrés blancs, des kana... Là, j'ai actuellement "qΘ" suivi d'un carré blanc...

Je ne vois pas ce que je fait de travers, pouvez-vous m'éclairer ?

J'ai aussi 1 autre question sûrement plus simple...
J'ai suivi bêtement les instructions pour que ça marche, mais pourquoi dans la déclaration de mes variables, pour le potentiomètre, j'ai écrit :

int const potPin = A2; //Entrée du potentiomètre
int potVal; //Variable du potentiomètre

et pas directement :

int potVal = A2

Je suis sûr que la réponse est toute bête. :frowning:

Merci d'avance :wink:

Vous passez sur le LCD avec un module I2C ? Car sur mon projet actuel, j'ai des fois eu ce genre de soucis mais sur des caractères que j'ai créé, bon pour ma part ce n'est pas un arduino du kit mais un ESP8266, à voir s'il n'y a pas eu un problème avec la librairie du LCD ou alors le problème se situe dans la variable pourcentage

Salut ! Merci de la réponse

Non je n'utilise pas ce genre de module, j'en apprend l'existence, mais je pense que je vais bientôt en acheter un, ça peut être pratique. :smiley:

Je suis sûr que mon problème ne vient pas de la variable : quand j'écrit lcd.print("Bonjour") dans le loop, j'ai toujours le même problème. :frowning:
Ça ne fonctionne que quand j'écrit depuis le setup, donc c'est pas forcément très utile... ^^"

Si c'est un problème de librairie... Je fait comment pour le résoudre ? Je doit sûrement la mettre à jour mais j'ignore comment. Et même dans ce cas, ça n'explique pas pourquoi ça ne marche que dans le setup. :frowning:

Bonjour,

Tu fais un lcd.clear() à chaque boucle. Donc tu effaces l'affichage avant que tu ais eu le temps de le lire.
Essaies de supprimer le lcd.clear();

Un autre problème est que tu utilises la pin 1 qui est la pin TX.
Si tu utilises la pin TX, il ne faut pas utiliser Serial. Supprimes tous les appels à Serial (Serial.begin(), Serial.print()...)

le problème vient surement de là:

LiquidCrystal lcd(1, 2, 4, 5, 6, 7)

Le 1 est relié à la ligne du moniteur série.

oups grillé par Kamill

FAIT !
le lcd.clear() a été effacé, et je suis allé plus loin pour la broche TX, j'ai déplacé mon câble à la broche 10 (en mettant le code à jour). Je n'ai pas besoin de Serial mais autant prendre l'habitude de ne pas utiliser cette broche sans raisons.

Ça fonctionne !

Bon, maintenant, quand je suis par exemple à 20%, il m'affiche :

2020202020202020
2020202020202020

Je pense avoir besoin du clear, tout compte fait. J'ai modifié le code pour quand même éviter qu'il pose problème, voici ce qui a été mis à jour :

//INITIALISATION
#include <LiquidCrystal.h> //Appel de la bibliothèque
LiquidCrystal lcd(10, 2, 4, 5, 6, 7); //J'ai choisi ces broches et pas celles du bouquin pour éviter les conflits avec le Motor Shield
int const potPin = A2; //Entrée du potentiomètre
int potVal; //Variable du potentiomètre
int PWM; //Variable de la PWM pour le Shield
int pourcentageNew; // Variable de calcul du pourcentage de la PWM pour l'affichage
int pourcentage; //Variable d'affichage du pourcentage de la PWM

void setup() {
  //Initialisation du LCD
  pinMode(A3, OUTPUT); //Sortie du contraste, je n'ai pas besoin d'un potentiomètre pour cela
  analogWrite(A3, 0); //Le contraste est réglé directement à 100%
  lcd.begin(16,2); //16 colonnes, 2 lignes
  lcd.print("PWM : "); //On affiche la PWM au démarrage du système, permet de vérifier qu'elle est à 0
  pourcentage = map(potVal, 0, 1023, 0, 100); //récupération de la PWM
  lcd.print(pourcentage); //Affichage
  lcd.print("%"); //Unité
  
  Serial.begin(9600); //Démarrage du moniteur série
}

void loop(){
  //Réglage PWM
  potVal = analogRead(potPin); //On récupère la valeur du potentiomètre
  Serial.print("\npotVal : ");
  Serial.print(potVal);//Affichage dans le moniteur série, au cas où. Me permet de savoir que la variation est entre O et 1023
  PWM = map(potVal, 0, 1023, 0, 254); //Modification de la PWM, à envoyer aux broches 3 et 11
  pourcentageNew = map(potVal, 0, 1023, 0, 100); //Modification du pourcentage, à afficher sur le LCD

  //Mise à jour de l'affichage

  if(pourcentageNew != pourcentage) //On change l'affichage uniquement si la PWM change, pour éviter de rafraîchir en permanance
  {
    pourcentage = pourcentageNew;
    lcd.clear(); //On nettoie l'écran pour éviter la supperposition
    lcd.print("PWM : "); //Esthétique
    lcd.print(pourcentage); //Affichage
    lcd.print("%"); //Unité
  }

}

Et ça fonctionne exactement comme je veux !

Ce qui me reste à faire :

Ajouter un bouton marche/arrêt pour bloquer les moteurs sans toucher à la PWM. Je vais relier un bouton à A5, et ça commandera les freins (broches 8 et 9 du Motor Shield).

Changer mon potentiomètre car celui du Starter Kit est nul, il tient même pas sur la planche de développement rapide. :frowning:

Merci beaucoup à tous !

Avec lcd.clear() ton affichage doit avoir du flicker.

Justement, non, je me suis débarassé de ce problème avec ma condition. Je ne suis pas en train de changer de PWM en permanence, donc l'affichage ne change pas tout le temps, et le clear n'est appelé qu'une seule fois.

C'est mieux, il y a du flicker uniquement quand tu tournes le potentiomètre.

Correction, j'en ai un peu quand même, mais je pense que c'est à cause du potentiomètre : Quand je l'affiche dans le moniteur série, je vois qu'il change de valeur tout seul en permanence. Donc ça rafraîchit. :frowning:

J'essaierai quand j'aurai acheté un nouveau potentiomètre.

Il y a la méthode setCursor() qui permet de définir la position d'écriture dans l'écran

Utilises setCursor() comme dit fdufnews

  if (pourcentageNew != pourcentage) //On change l'affichage uniquement si la PWM change, pour éviter de rafraîchir en permanance
  {
    pourcentage = pourcentageNew;
    lcd.setCursor(0,0);
    lcd.print("PWM : "); //Esthétique
    lcd.print(pourcentage); //Affichage
    lcd.print("%  "); //Unité
  }

J'ai essayé, le problème, c'est quand je change d'ordre de grandeur :

quand j'affiche 100%, j'ai à l'écran :

PWM : 100%

Mais dès que je redescend, à 90% par exemple, ça réécrit à partir de la 1ere case, par dessus ce qu'il y avait, et donc la 10eme case n'est pas modifiée, cela m'affiche :

PWM : 90%%

Ce qui est chiant

Il faut formater.
Soit utiliser sprintf(buffer, "%3d", pourcentage), soit ajouter un ou deux blancs devant si la longueur de pourcentage est < 3.

Oh oui, génial comme ça, ça fait plaisir aux yeux :smiley:

PCMRF:
J'ai essayé, le problème, c'est quand je change d'ordre de grandeur :
Mais dès que je redescend, à 90% par exemple, ça réécrit à partir de la 1ere case, par dessus ce qu'il y avait, et donc la 10eme case n'est pas modifiée, cela m'affiche :

PWM : 90%%

Ce qui est chiant

Tu as remarqué que dans le code que je t'ai donné il y a deux espaces après le % dans lcd.print("% ");?
Ce sont ces espaces qui vont effacer le %.