En cours Truc bizarre avec écran LCD-keypad

  • Auteur de la discussion gégé62
  • Date de début
gégé62

gégé62

Compagnon
Bonjour,
pour une fois je ne viens pas ici pour de l'aide, mais juste pour votre info, et éventuellement votre avis sur un truc que je viens de constater.

J'ai un arduino UNO et un écran LCD keypad, c'est celui avec 6 boutons-poussoirs sur le module, c'est assez pratique ça peut simplifier le montage.
Librairie : LiquidCrystal

Dans les exemples que j'ai vus, on déclare " lcd(16,2); " dans le setup. Cela me donne un affichage correct pendant le setup, mais dans la boucle loop, l'accès à 2ème ligne ne se fait plus, même si je demande lec.setCursor(0,1); par exemple.
Par contre ça marche si je re-déclare " lcd(16,2); " au début de loop. Visiblement la commande " lcd.begin(16,2); " ne fonctionne que dans la fonction où elle est appelée (mais ça refuse de compiler si je le fais avant le setup).
 
jpbbricole

jpbbricole

Compagnon
Bonsoir gégé62

Vous avez dit bizarre!
lcd.begin(16,2); doit se trouver dans setup()?

Mets ton code en ligne.

Cordialement
jpbbricole
 
albatros_del_sur

albatros_del_sur

Compagnon
Bonjour
J’ai récupéré un écran LCD une seule ligne pour le faire fonctionner correctement j’ai dû le déclarer 16;2.
La librairie coupe la ligne en 2 et considère que la première moitié est la ligne 0 et la seconde la ligne 1.
A voir si ce n’est pas pareil pour ton écran.
 
L

laidfroid

Apprenti
bonjour.
j'ai remarqué que lcd.begin() ne fonctionnait pas toujours dans la setup, par contre pour qu'il soit bien reconnu
il faut mètre lcd.init() et là, plus de problème.
si cela à pu être utile.
bonne journée, J.P.
 
petit_lulu

petit_lulu

Compagnon
Bonjour
J’ai récupéré un écran LCD une seule ligne pour le faire fonctionner correctement j’ai dû le déclarer 16;2.
La librairie coupe la ligne en 2 et considère que la première moitié est la ligne 0 et la seconde la ligne 1.
A voir si ce n’est pas pareil pour ton écran.
tous les ecrans 1 ligne de 16 que j'ai utilise sont en 2 lignes, 1ligne pour la premiere moitier et 1 ligne pour la seconde, c'est comme ca.:mrbrelle:
 
gégé62

gégé62

Compagnon
Mets ton code en ligne
merci JPB, je tente la manip :???:....je n'ai jamais fait. Les lignes concernées sont 80 et 104

J’ai récupéré un écran LCD une seule ligne
non non, j'ai bien 2 lignes et j'arrive à les utiliser, simplement ça ne fonctionne que si j'ai mis lcd.init() dans la fonction où je veux l'utiliser (setup ou loop ou les deux)

j'ai remarqué que lcd.begin() ne fonctionnait pas toujours dans la setup, par contre pour qu'il soit bien reconnu
il faut mètre lcd.init() et là, plus de problème.
Malheureusement, il "circule" 2 version de la bibliothèque LiquidCrystal.c, une avec init et l'autre avec begin, "l'officielle" c'est begin.
je n'avais pas pensé à ça, mais platformIO me propose les deux (en auto-complétion).

mon code (pas terminé mais ça compile)

 
gégé62

gégé62

Compagnon
une erreur (il y en a sûrement d'autres...), les données stockées en eeprom sont des int, sur 2 octets, donc les adresses sont à incrémenter de 2 unités, et non pas de 1. De même j'ajoute les fonctions "allumer" et "eteindre" le lcd, inutile de consommer des W quand le système est en veille, c'est à dire 99.9 % du temps....Pour ceux qui ne sauraient pas, le rétroéclairage est obtenu par PWM depuis la pin 10 arduino, et mis par défaut au maxi (ou près de maxi, pas vérifié). Il est donc facile de régler l'intensité lumineuse.
Cette info est rarement donnée dans les tutos qui parlent du LCD-keypad.....

inutile d'alourdir le fil avec le scketch corrigé, ça n'est pas le sujet.....:wink:
 
mvt

mvt

Compagnon
Bonjour,

Je viens de revérifier dans le programme d'Andoche (vis mère), il n'y a qu'un seul lcd.begin, dans le setup...
 
gégé62

gégé62

Compagnon
Je viens de revérifier dans le programme d'Andoche (vis mère), il n'y a qu'un seul lcd.begin, dans le setup...
oui, c'est bien ce qui me surprend, partout c'est initialisé dans le setup une fois pour toutes. Mon pb n'est pas très gênant, c'est juste pour comprendre... Demain j'essaierai de recharger la librairie, la mienne est peut-être corrompue.
La corruption est partout....:roll:
 
mvt

mvt

Compagnon
En dehors de l'écran et de l'arduino, il y a d'autres trucs à câbler ? J'ai bien un LCD (comme celui d'Andoche) et un arduino, éventuellement je peux essayer ici et regarder la version de la librairie par la même occasion.
 
albatros_del_sur

albatros_del_sur

Compagnon
De même j'ajoute les fonctions "allumer" et "eteindre" le lcd, inutile de consommer des W quand le système est en veille, c'est à dire 99.9 % du temps....Pour ceux qui ne sauraient pas, le rétroéclairage est obtenu par PWM depuis la pin 10 arduino, et mis par défaut au maxi (ou près de maxi, pas vérifié). Il est donc facile de régler l'intensité lumineuse.
Cette info est rarement donnée dans les tutos qui parlent du LCD-keypad.....
Il y a aussi la solution de commander par un interrupteur, J'ai un écran qui fonctionne comme ça. Il ne sert que lorsque je vais changer le réglage ou voir le niveau en mémoire. Le reste du temps personne ne le regarde donc il est éteint ça fait des économies.
 
S

speedjf37

Compagnon
Bonjour,

Utilisation de la bibliothèque LiquidCrystal version 1.0.7 dans le dossier: C:\Users\USERXX\Documents\Arduino\libraries\LiquidCrystal


C'est bien un problème de prog !!!

Avec cette simple modif on voit bien l'affichage fait pendant le Setup !!!!


Par contre l'affichage en boucle dans le Loop est à revoir.

Il ne sert à rien de faire un lcd.clear et un lcd.setcurseur à chaque tour de boucle.
ces 2 commandes sont "lentes" et provoquent un scintillement désagréable de l'écran;

Solution:
Faire un lcd.clear sur changement de menu.
Faire un affichage sur changement de valeur

Cordialement JF
 
Dernière édition:
D

didierh

Ouvrier
Hello

le lcd.begin(...) appelé une seule fois doit se trouver au niveau du "setup()" -
Quand tu regardes le code dans liquidcrystal.cpp pour la méthode "begin" il y a tout une flopée d'initialisations et autres sleep et à la fin tu as un appel à "clear" - raison pour laquelle ton code fonctionne avec un "lcd.begin" dans la loop().

A chaque changement d'affichage tu dois faire un
lcd.clear();
qui prends 2000 µs

Si on regarde le code derrière, on voit que le curseur est bien positionné à 0,0 donc inutile de le faire au niveau du code (si .clear appelé)


Idéalement dans un code bien structuré, tu dois concentrer le code lié à l'affichage dans une seule zone de ton code (via une fonction avec paramètres) et ne l'appeler qu'en cas de changement d'affichage.
De cette façon tu es certain que le "lcd.clear();" est appelé une seule fois par demande d'affichage.

Pour ce qui est du code qui gère l'appui sur les bouttons, je te conseille d'utiliser une librairie
comme celle-ci par exemple: https://www.arduino.cc/reference/en/libraries/button/
Il en existe d'autres qui gèrent des appui long ou double-click (comme avec sur une souris).

Perso ma préférence va à cette librairie: http://www.mathertel.de/Arduino/OneButtonLibrary.aspx
Mais comme disait ma grand mère : tout le monde voit midi à sa porte :smt003

A+D
 
gégé62

gégé62

Compagnon
En dehors de l'écran et de l'arduino, il y a d'autres trucs à câbler
je ne sais pas ce que tu veux dire. Pour moi, j'ai choisi le LCDkeypad (au lieu du LCD seul) car il comporte 5 BP, qu'on utilise comme on veut pour le projet, et il se monte "en shield" sur l'arduino UNO, donc presque pas de cablage à faire pour moi. Par contre bien entendu, pas mal de pin sont utilisées, et si on veut utiliser celles qui sont libres (sauf erreur 2,3,11,12,13, A 1....A5) il faut venir souder des fils en direct.
Il y a aussi la solution de commander par un interrupteur
il me semble que pour le LCD Keypad c'est moins simple que pour LCD nu, on n'a pas accès facile aux bornes concernées. Mais de toutes façons, puisqu'on peut le faire en soft, je préfère. Même pas d'interrupteur à basculer, il s'allume dès l'instant où on appuie sur le BP de défilement (bien entendu l'un des BP du shield) et s'éteint quand on revient en mode "veille". Et le PWM permet de choisir la luminosité qu'on veut, je n'ai pas poussé le bouchon jusqu'à l'asservir à la lumière ambiante, mais ça ne serait pas compliqué....:).

@didierh
j'ai ouvert la lib avec Notepad, mais pour moi c'est de l'hébreu.....
je vois des fonctions
ligne 53: void LiquidCrystal::init(uint8....etc qui occupe une vingtaine de lignes
ligne 78: void LiquidCrystal::begin(uint8_t cols,....etc qui occupe env 80 lignes, et je vois " clear(); " vers la fin

mais je ne pige rien à tout ça, je n'ai pas les bases nécessaires, alors ça bouffe beaucoup de temps...pour pas grand chose. Il faudrait que je me trouve un tuto sur les lib, qui parte de la base, comme on trouve facilement pour écrire un sketch.

En attendant je vais essayer de mettre à profit ce que tu as écrit, avec @speedjf37 . Si j'ai bien compris, je peux faire clear() pour repartir d'un écran vierge, mais inutile de replacer le curseur à (0,0) il y est déjà.

Je vais aussi regarder pour la reconnaissance des boutons, c'est bon à savoir. Mais pour l'instant ça marche, un peu plus lourd sans doute....

Merci.
 
mvt

mvt

Compagnon
Bonjour,

C'était juste pour savoir s'il y avait d'autres composants (en dehors de l'arduino et du lcd à boutons) pour faire l'essai chez moi.
 
gégé62

gégé62

Compagnon
pour savoir s'il y avait d'autres composants

non, rien d'autre pour l'instant, je n'ai pas fini le soft, moi il me faut du temps....Après sur la chaudière j'aurai à mettre une alim 220/5 VCC pour la UNO et je dois détecter la tension (220) sur l'EV, je pense utiliser un relais en // .
Et bien sûr trouver une place ad hoc pour tout cela.....
 

Sujets similaires

Moi33
Réponses
3
Affichages
4 091
speedjf37
S
gégé62
Réponses
34
Affichages
1 337
gégé62
gégé62
G
Réponses
123
Affichages
3 626
gaston83
G
fauxjetons
Réponses
91
Affichages
53 663
hercule.toto
hercule.toto
V
Réponses
4
Affichages
2 019
wika58
wika58
JCS
Réponses
54
Affichages
10 798
jpbbricole
jpbbricole
V
Réponses
62
Affichages
36 800
Dardar88
Dardar88
S
Réponses
112
Affichages
18 785
manum01
M
V
Réponses
7
Affichages
1 468
vibram
V
Haut