Bonjour,
Je voulais utiliser la fonction autoscroll pour un LCD 20x4 pour faire apparaître au fur et à mesure un texte beaucoup plus long que la capacité du LCD. J'ai essayé plusieurs exemples trouvés sur le net sans résultat.
Ce que j'observe est que lorsque la première ligne est remplie, la suite du texte vient bien sur la ligne suivante, mais,
la première ligne se vide et le texte de la première ligne est dupliqué progressivement sur une ligne suivante (c'est un peu compliqué à expliquer et le résultat dépend de l'endroit où l'on commence à écrire, mais ce n'est jamais ce que je voudrais).
Je vois bien la solution d'écrire dans la dernière puis, lorsqu'elle est remplie de copier lesla ligne 3 vers la 2, etc. Mais l'écriture d'une ligne demande environ 31ms. Il faut donc 120ms avant de repasser dans la boucle (ce qui est énorme pour mon application.
Toute idée/ exemple est la bienvenue ...
Il faudrait que tu précises quel afficheur tu utilises (référence ou photo), quelle carte Arduino, et surtout quelle bibliothèque pour le LCD.
Voir un exemple de scroll ici : la bibliothèque est adaptée à un écran avec connecteur parallèle 8 fils, pas un I2C.
Grand merci pour la réponse.
Il s'agit d'un afficheur que j'ai depuis longtemps. A l'arrière est marqué 2004A-V1.1 avec une interface i2C portant juste la mention MH. Visuellement cela ressemble à tous ceux qu'on voit sur le net. L'Arduino est un Arduino Nano.
J'ai essayé d'exécuter le code en remplaçant :
#include <LiquidCrystal.h> // par Frank Brabander
LiquidCrystal lcd(11, 12, 2, 3, 4, 5);
par :
void setup() {#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4);
Comme il ne se passait rien, j'ai ajouté :
lcd.init();
lcd.backlight();
dans le Setup. Alors j'ai "hello, world" qui défile de gauche à droite et de droite à gauche dans les lignes 0 et 2 (!) de manière décalé.
Ok, d'abord il faut que tu apprennes à poster du code formaté : lis les règles du forum pour savoir comment faire.
Puis mets à jour le code du message précédent
Il existe de nombreuses bibliothèques pour ces écrans LCD, certaines sont très mauvaises. Celle que tu as choisie est bien faite. Il reste à apprendre à s'en servir.
Poste ton code en entier, pas juste de petits morceaux, ce sera plus facile de t'aider.
Bonjour,
Voici mon code actuel, toutefois, je pense que je n'ai pas bien expliqué mon problème :
- je souhaite faire une sorte de "prompteur" où le texte défile vers le haut soit caractère par caractère (le premier caractère de la dernière ligne devient le dernier caractère de l'avant dernière ligne, etc) soit ligne par ligne (la 3 devient la 2, la 2 devient la 1, etc.)
- Les exemples que j'ai trouvé permettent de faire défiler le texte vers la gauche (ou la droite), mais le texte est sensé disparaître (scroll 15 positions (string length) to the left to move it offscreen left:) mais chez moi, il réapparait 2 lignes plus haut, ce qui me semble anormal ou pour le moins bizarre. (voir photo).
- j'ai essayé d'utiliser AutoScroll, mais cela ne fait pas non plus ce que je souhaite.
Toute idée/exemple est la bienvenue.
#include <LiquidCrystal_I2C.h>
#define LCDcol 20 // Nombre de colonnes LCD
#define LCDrow 4 // Nombre de lignes LCD
LiquidCrystal_I2C lcd(0x27, LCDcol, LCDrow);
void setup() {
lcd.init();
lcd.clear();
lcd.backlight(); // Make sure backlight is on
// lcd.autoscroll();
lcd.setCursor(0, 3);
lcd.print("hello, world! 123456"); // print a message to the LCD
delay(4000);
lcd.print("7890 ABCDEFGHIJKLMNO"); // print a message to the LCD
// while (1) {}
}
void loop() {
// scroll 15 positions (string length) to the left to move it offscreen left:
for (int positionCounter = 0; positionCounter < 15; positionCounter++) {
lcd.scrollDisplayLeft(); // scroll one position left:
delay(150); // wait a bit
}
delay(4000);
while (1) {}
}
Un exemple de scrolling est donné ici :
Je ne sais pas si c'est la même bibliothèque, car on en trouve plusieurs qui ont le même nom. Celle qui est utilisée ici est celle-ci :
https://github.com/arduino/Arduino/tree/master/libraries/LiquidCrystal
Si cette bibli ne marche pas, tu peux faire ta fonction de scrolling toi-même. Un exemple ici :
Bonjour et merci pour la réponse.
. L'exemple de scrolling donné est celui dont je suis parti.
. Toutes les descriptions de scrolling que j'ai trouvé, permettent de déplacer du texte latéralement, mais le texte disparaît en arrivant au bord du LCD, alors que mon souhait est qu'il revienne/continue sur la ligne au dessus.
. Aussi, je pense que la fonction dont j'aurais besoin n'existe pas.
. Il me faudrait donc créer la fonction par du code en réécrivant le texte (pour chaque caractère ou ligne de caractères). Or comme je le disais dans l'énoncé de mon sujet, l'écriture d'une ligne prend un trentaine de ms, soit dans les 120 ms pour 4 lignes, ce qui n'est pas compatible avec mon application, à moins d'écrire un seul caractère à chaque passage dans la boucle du code. Mais l'écriture d'un caractère prend déjà 1,5 ms, ce qui est déjà énorme.
. La solution va sans doute être d'utiliser le Serial.print vers un PC où il n'y a pas de limite de la taille du texte, et l'envoi d'un caractère prend 0,1 ms à 115200 bauds.
OK, je comprends. La limite des 30ms vient-elle du display ou de l'Arduino ? Ou même du protocole I2C ?
Il peut y avoir des solutions pour chaque cas :
- Arduino : passer à un composant plus rapide (ESP8266 ou ESP32)
- Protocole : voir s'il est possible de changer le baudrate, sinon passer sur un écran à communication parallèle plutôt que série
- Display : essayer un écran TFT
EDIT: pour la vitesse, il est possible de la changer :
void TwoWire::setClock(uint32_t clock)
{
twi_setFrequency(clock);
}
Les valeurs sont en Hz, entre 50000 et 400000. Je pense que la valeur par défaut est 100 kHz, donc il y a de la marge (200 et 400).
La bibliothèque du LCD initie la com I2C avec Wire.begin();
appelée dans le lcd.begin()
, donc tu pourrais ajouter Wire.setClock(400000);
et regarder si ça accélère.
MAIS : dans ton code tu as lcd.init();
(et pas begin) ! Donc, je suppose que ce n'est pas cette bibliothèque que tu utilises :
Comme je l'ai dit (je crois) il existe plusieurs bibliothèques avec le même nom. C'est ch**nt, et c'est pour ça que je n'utilise plus ces afficheurs.
Donc, quelle est la bibliothèque que tu utilises ?
EDIT2 : il est possible qu'augmenter la vitesse de com entraîne une distorsion des signaux et donc des erreurs de communication. Il est possible qu'il faille changer les résistances de pullup pour réparer ça. Mais là, il faudrait un vrai électronicien pour répondre, pas un de pacotille comme moi...
hello
de mon expérience, sur ces afficheurs, il faut voir:
la ligne 2 comme la continuité de la ligne 0
et la ligne 3 comme la continuité de la ligne 1
Je ne savais pas ça. C'est un peu ce qu'on voit sur la photo du post 5.
Bonjour,
. Merci dfgh. Je ne suis donc pas le seul à constater cette bizarrerie. Ce n'est donc à priori ni un problème de mauvaise utilisation, ni de matériel défectueux (je me demandais s'il existe 2 versions d'adaptateurs LCD-I2C : un pour 2 lignes et un pour 4 lignes ?).
. Merci aussi à lesept pour les pistes permettant d'augmenter la vitesse. Le gain max de 4 étant de toute façon insuffisant, je ne me lancerais pas dans cette voie. Ni d'ailleurs sur celles de changement de µC ou d'afficheur.
. D'autres facteurs entrant en ligne de compte, ma décision est prise : j'abandonne le LCD.
Merci pour les échanges.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.