Faire défiler des nombres LCD shield

Bonjour,

Je cherche à faire saisir à l'utilisateur une valeur entre 00,0 et 99,9 : une valeur par défaut s'afficherait et il pourrait à l'aides des boutons Up et Down faire défiler les valeurs jusqu'à la valeur voulue et "valider" avec le bouton Right (ce qui enregistrerait cette valeur pour l'étape suivante).

Ma question est la suivante : par où commencer?

bonsoir,

1 : apprendre à gérer des BP
ça veut dire détecter les appuis/relâchements, mais aussi les bugs de capture (faux appuis) et les rebonds

2 : orienter le code en fonction du BP appuyé
autrement dit construire une stratégie de traitement qui exécutera la bonne action en fonction du BP détecté

(c'est déjà pas mal pour un début)

Il manque une info : quel est l’organe de saisie ?
Des boutons ou un clavier matriciel ?

Bonjour,

Il s'agit de boutons (c'est un shield LCD basique avec 5 boutons), et j'ai compris qu'ils se partageaient le port A0 et qu'en fonction du bouton la tension envoyée n'était pas la même.

Pour la construction du programme, j'ai pensé à un truc de ce genre :
Je met une valeur par défaut dans une variable
Si l'utilisateur appui sur le bouton Haut, variable = variable + 0,1
Si l'utilisateur appui sur le bouton Bas, variable = variable - 0,1
Si l'utilisateur appui sur le bouton Droite, on passe à la suite

Mais je ne sais pas si ça marche vraiment comme ça, ça me parait un peu trop simple (au niveau du curseur et de l'allocation des "rectangles" d'affichage).

Il s'agit de boutons (c'est un shield LCD basique avec 5 boutons), et j'ai compris qu'ils se partageaient le port A0 et qu'en fonction du bouton la tension envoyée n'était pas la même.

Il suffit de lire cette tension avec analogRead(), ensuite en fonction de la valeur lue prendre une décision.

Tant que le bouton haut est maintenu appuyé

  • ne pas se préoccuper de l'appui éventuel et simultané d'un autre bouton (la valeur lue sur A0 peut changer, ça dépend comment le shield gère les appuis simultanés, il faut arriver à savoir si le bouton initial est toujours appuyé, ou pas)
  • incrémenter la variable de 0.1
  • afficher la nouvelle valeur
  • attendre un peu (sinon ça va défiler trop vite)
    faire ces 4 tâches en boucle, jusqu'à détection du lâcher du bouton.

Pareil avec le bouton bas, incrément de -0.1

J'ai l'impression qu'il n'y a pas trop besoin de gérer les rebonds du bouton ?

Un fois que ça marche, amélioration : faire diminuer progressivement l'attente dans la boucle pour accelérer le défilement.

Bonjour,

ça fonctionne merci beaucoup, trois petites questions :

  • Vous m’indiquez “tant que” dans votre précédent message, or j’ai utilisé un simple If, est-ce gênant?

  • J’ai mis une valeur par défaut avec un seul chiffre après la virgule (10,0), pourtant le programme m’affiche 10,00 (et pareil quand j’augmente ou diminue la valeur), est-ce à cause du type de variable que j’utilise (float)? ou d’autre chose?

  • Le bouton Droite déclenche parfois (pas tout le temps) l’incrémentation, mes intervalles de tension sont-ils corrects :
    <50 => Right
    [50;250] => Up
    ]250;450] => Down
    ]450;650] => Left
    ]650;850] => Select

Si non, comment les définir?

Bonjour,

Tu affiches la analogRead(A0) sur le moniteur série et tu regardes la valeur affichée quand tu appuies sur les boutons.

Bonjour,

J'obtiens :
Bouton droit => 0
Bouton haut => 206
Bouton bas => 405
Bouton gauche => 623
Select => 823

avec de très faibles variations (sur 20 relevés le bouton haut va donner 205 peut-être une fois). Comment expliquer que j'ai autant d'erreurs avec mes intervalles?

J'ai essayé de resserrer mes intervalles autour de ces valeurs avec une petite marge (+/-25) mais je ne vois pas d'amélioration

Et si tu faisait péter ton code ?

void loop() {
  int x;
  x = analogRead (0);

  if ((x > 50)&&(x<250)) {
    var = var + 0.1;
    lcd.setCursor(0,0);
    lcd.print(var);
    delay(250);
    }

  if ((x > 250)&&(x<450)) {
    var = var - 0.1;
    lcd.setCursor(0,0);
    lcd.print(var);
    delay(250);
    }

   if ((x > 650)&&(x<850)) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Etape2");    
    }
}

Bonobodu24:
J'obtiens :
Bouton droit => 0
Bouton haut => 206
Bouton bas => 405
Bouton gauche => 623
Select => 823

Et si tu n'appuies sur aucun bouton, tu mesures combien ?
Ca a l'air mal foutu ce système, ça paraitrait logique qu'il y ait 0.0 si aucun bouton n'est appuyé, or 0.0 correspond à un appui sur le bouton de droite.
Comment distinguer appui / pas appui ?

peut-être que "pas d'appui" = le max = 1023 ?

ça semble vachement plus logique que 0 en tout cas : si le pont diviseur est en l'air, on récupère la tension d'alim

Bonobodu24:

  • J'ai mis une valeur par défaut avec un seul chiffre après la virgule (10,0), pourtant le programme m'affiche 10,00 (et pareil quand j'augmente ou diminue la valeur), est-ce à cause du type de variable que j'utilise (float)? ou d'autre chose?

si vous faites une print() d'un float par défaut il met 2 chiffres après la virgule. si vous en voulez plus ou moins, il faut le préciser lors de l'appel de la fonction.

float temperature = 12.345;
Serial.print(temperature); // par défaut 2 décimales => 12.34
Serial.print(temperature, 1); // 1 seule décimale => 12.3

un truc comme ça :

Bonjour,

  • @biggil/5_cylindres : C'est bien 1023 quand aucun bouton n'est appuyé

  • @J-M-L : J'avais fini par trouver pour les chiffres après la virgule. En fait je l'avais déjà fait sur un autre projet... mémoire de poisson rouge.

  • @jfs : C'est exactement le même principe!

Il me reste le problème des boutons : le bouton de droite déclenche parfois (souvent) l'incrémentation, alors qu'il ne devrait rien déclencher dans cette partie (pas de code associé)... comme si il envoyait une tension dans l'intervalle du bouton haut. Pourtant quand j'ai affiché les valeurs de sorties pour chaque bouton j'avais très peu de variations.

Affiche en permanence la tension mesurée.
Si la tension est celle attendue, et que ton programme ne réagit pas comme il faut, c'est qu'il y a une erreur dans ton programme.
Mets des Serial.print() aux bons endroits pour suivre ce qui se passe.

Oui c'est bien ça...

Parfois quand j'appuie sur le bouton de droite il m'affiche des valeurs aberrantes (5626, 9023, 4023, 5523...) mais le truc c'est que ces valeurs correspondraient plutôt à "aucun bouton" qu'à "bouton haut", donc je suis un peu perplexe.

bonjour,

as-tu bien mis (comme demandé par biggil) des envois à la console de tes valeurs lues sur l'entrée ana du clavier ?

référence de ton module (ou schéma si tu l'as) ?

ton code complet (avec l'affichage des valeurs clavier) ?

  • Oui c'est ce que j'indiquais dans mon précédent post : mon bouton droit envoie parfois des valeurs bizarres mais tellement élevées que je ne comprend pas quelles puissent être interprétées comme bouton haut...

  • C'est un shield LCD basique avec 5 boutons

  • J'ai mis les valeurs clavier plus haut