Go Down

Topic: Faire clignoter le : sur un lcd (Read 2119 times) previous topic - next topic

toufous35

Salut à tous!

Voila, j'utilise comme beaucoup je pense, la LiquidCrystal.h

J'ai fait un affichage d'une horloge comme ça : 00:00

Maintenant, je voudrais savoir si on peut faire clignoter les : ?

Merci d'avance!

Brisebee

Je ne sais pas s'il existe une fonction directement implantée dans la puce de l'afficheur qui fait clignoter un caractère, pas à ma connaissance.
Mais il suffit de faire une boucle, avec un indicateur (par exemple du type booléen) qui s'il est "vrai" affiche ":" puis tu changes l'indicateur en "faux" et lors du passage suivant dans la boucle, lorsque l'indicateur est "faux" tu fais afficher " " et tu changes l'indicateur en "vrai" etc, etc..
Je ne sais pas si j'ai été très clair.
Sinon je peux soit te dessiner un petit algorythme, soit t'envoyer un bout code.

skywodd

Bonjour,

Il existe une fonction blink() mais elle n'est valable que pour le curseur et non pour un caractère.
Pour faire clignoter un caractère il faut faire soit même un fonction blink()

Exemple :
Code: [Select]

void blink() {
  static uint8_t state = 0; // état du char - static -> initialisation une seul fois lors du 1er appel de la fonction
  lcd.setcursor(3,0); // on sélectionne le char (exemple: ici colonne 3, ligne 0)
  lcd.write(state ? ':' : ' '); // on affiche le char
  state = !state; // on inverse l'état du char
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Jean-François

Il faut rajouter un temporisateur dans ton blink.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

skywodd


Il faut rajouter un temporisateur dans ton blink.

of course :smiley-mr-green: mais bon rajouter un delay(xxx) devrait être à la porté de n'importe qui :smiley-mr-green:
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Jean-François

Justement pas un delay(), mais je pensais à un truc avec millis() dont le paramètre serait passé en faisant blinkPoint(1000)....  XD
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

skywodd

un truc comme ça :smiley-mr-green:
Code: [Select]
void blinkPoint(unsigned long interval) {
   static unsigned char state = 0;
   static unsigned long prevMillis = 0;
   unsigned long curMillis = millis();
   if(curMillis - prevMillis > interval) {
      prevMillis = curMillis;   
      lcd.setcursor(3,0);
      lcd.write(state ? ':' : ' ');
      state = !state;
   }
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Jean-François

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

toufous35

Salut!

Merci à vous!

Je vais essayer ça de suite!

Question bête, mais il clignote à quelle vitesse?

Car pour moi, l'idéal serait 1 clignotement à la seconde!

Bon je vais déja essayer ça!

toufous35

Ah !

J'avais pas vu un truc!

C'est que je peux pas choisir la position du :

Car il est déjà intégrer dans un VOID :

Code: [Select]
void printHMS () {
    if (hour() < 10){lcd.print("0");}
    lcd.print(hour());
    lcd.print(":");
    if (minute() < 10){lcd.print("0");}
    lcd.print(minute());
      }


qui en fonction des demande, se position à différent endroit du LCD!

skywodd


C'est que je peux pas choisir la position du :
Car il est déjà intégrer dans un VOID :

qui en fonction des demande, se position à différent endroit du LCD!


No problem ;)

// Retourne un char (: ou espace) suivant un delay de 1s
Code: [Select]
char blinkPoint1s() {
   static unsigned char state = 0;
   static unsigned long prevMillis = 0;
   unsigned long curMillis = millis();
   if(curMillis - prevMillis > 1000) {
      prevMillis = curMillis;   
      state = !state;
   }
   return state ? ':' : ' ';
}


Appel :
Code: [Select]
void printHMS () {
   if (hour() < 10)
      lcd.print("0");
   lcd.print(hour());
   lcd.print(blinkPoint1s());
  if (minute() < 10)
      lcd.print("0");
   lcd.print(minute());
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Brisebee

Génial !
Merci beaucoup skywodd, c'est bien plus propre que ce que j'avais fait avec delay et un flag.
Je viens d'apprendre à utiliser la fonction millis qui est très interessante !

skywodd


Génial !
Merci beaucoup skywodd, c'est bien plus propre que ce que j'avais fait avec delay et un flag.
Je viens d'apprendre à utiliser la fonction millis qui est très interessante !

Ya pas de quoi ;)

Dans le même genre il y a micros(), une petite fonction bien pratique dans certain cas.
http://www.arduino.cc/en/Reference/Micros
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up