Go Down

Topic: Affichage sur LCD qui "scintille" (Read 216 times) previous topic - next topic

EGT59

Bonjour,

Je modifie actuellement mon code afin de supprimer les instructions delay(), cela fonctionne mais avec un petit bémol.

Mon code initial:
Code: [Select]
AffichDate();
  delay(1500);
 
  AffichHeure();


Ce qui me donne un affichage stable sur mon lcd de la date pendant le delay puis de l'heure pendant le reste de la boucle.

Mon code modifié:
Code: [Select]
while (millis() - DureeAffich < 3000)
      {
        AffichDate(); Serial.print("Date ");
        AffichEclLed(); Serial.print("EclLed ");
        AffichTempRTC();Serial.println("TempRTC");
        E=1;
      }
 
 
    // Affichage de l'heure
 
    while ((millis() - DureeAffich >= 2000) && (millis() - DureeAffich <= 10000))
      {
        AffichHeure(); Serial.print("Heure ");
        AffichEclPPSec();Serial.println("EclPPSec");
        F=1;
      }
  }
    if (E==1 && F==1)
    {
      DureeAffich=millis(); E=0 ; F=0;
    }


Ce qui me donne un affichage stable de la date mais un affichage qui scintille pour l'heure (assez inesthétique).
Est ce du à l'exécution de la boucle ?
Peut on supprimer cet effet?

Petite précision : les instructions serial sont là pour les essais sur le moniteur série

Merci de votre aide.

bricoleau

Bonjour

Cela provient probablement du fait que les mêmes ordres d'affichage sont envoyés un paquet de fois par seconde au LCD, ce qui ne sert à rien.

On peut avoir le code de AffichDate() et AffichHeure() ?

EGT59

Bonjour

Voici les codes demandés :

Code: [Select]
void AffichHeure()
      {
        lcd.setCursor(0,0); lcd.print("                    ");
        lcd.setCursor(8,0);
        lcd.print(t.hour);
        lcd.print("H");
        if ((t.min) < 10)
          {
            lcd.print("0");
          }
        lcd.print(t.min);
      }

       
  // Affichage de la date
   
  void AffichDate()
      {
        lcd.setCursor(0,0);
        lcd.print(JdlS); lcd.print(" "); lcd.print(t.mday); lcd.print(" ");
        lcd.print(Mois); lcd.print(" "); lcd.print(t.year); lcd.print(" ");
      } 


C'est peut être l'instruction d'effacement de ligne qui crée le scintillement?
Mais si je l'efface pas avant d'écrire autre chose les caractères des deux instructions se mélangent.

landid

Salut,

 Effectivement ce doit être l'effacement de la ligne puis son ré-affichage qui provoque le scintillement. Il n'est pas nécessaire d'afficher les minutes au niveau de millis(). Dans ta fonction AffichHeure(), tu peux sans doute stocker la valeur de la minute précédente et seulement si la valeur est différente alors tu affiches cette nouvelle valeur.

Si le seul outil que vous avez est un marteau, vous verrez tout problème comme un clou.
      Abraham Maslow

bricoleau

Ben oui

Tu passes ton temps à effacer et réécrire la même valeur au même endroit, normal que ça scintille.

Essaye donc ceci :
Code: [Select]
void AffichHeure()
      {
        static byte saved_hour = 24;
        static byte saved_min = 60;
        if (t.hour == saved_hour && t.min == saved_min) return;
        saved_hour = t.hour;
        saved_min = t.min;

        lcd.setCursor(0,0); lcd.print("                    ");
        lcd.setCursor(8,0);
        lcd.print(t.hour);
        lcd.print("H");
        if ((t.min) < 10)
          {
            lcd.print("0");
          }
        lcd.print(t.min);
      }

EGT59


EGT59

Bonjour,

ça ne fonctionne pas, l'affichage reste bloqué sur l'heure stockée à la relance du programme.

En tous cas merci pour l'aide.

EGT59

Bonjour,

J'ai potassé le truc car je suis novice en la matière,  je ne connaissais pas static.

j'arrive à quelque chose mais qui ne me convient pas.

Si j'utilise la solution "static" je n'ai l'affichage de l'heure qu'au changement de minute pour la durée souhaitée  mais je dois attendre 1 mn pour avoir de nouveau l'heure alors que je souhaite le contraire : la date pendant une période courte et l'heure pendant beaucoup plus longtemps.

Je continue mes recherches

Merci


Go Up