Plusieurs interrogations (LCD / interruption ect ect)

Bonsoir, j'essais de faire un menu interactif, mais je bute sur l'utilisation de la fonction lcd.clear()...

Où la placer efficacement pour effacer l'écran entre chaque menu ?

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
int contr = 3;
int bouton = 2;
int select = 0;

void setup()
{
  pinMode(contr, OUTPUT);
  pinMode(bouton, INPUT);
  digitalWrite(bouton, HIGH);
  attachInterrupt(0, selection, FALLING);
  Serial.begin(9600); // Communication serie
  lcd.begin(16, 2);
  lcd.setCursor(5,0);
  lcd.print("Bonjour");
  delay(500);
  lcd.clear();
}

void loop()
{
  switch(select)
  {
  case 0:
    lcd.setCursor (0,0);
    lcd.print("Mode Selection");
    break;

  case 1:
    lcd.setCursor (0,0);
    lcd.print("Temperature");
    break;
    
    case 2:
    lcd.setCursor (0,0);
    lcd.print("Pression");
    break;
  }
}

void selection()
{
  select++; 
}

Merci d'avance de votre aide :slight_smile:

Bizounours:
Bonsoir, j'essais de faire un menu interactif, mais je bute sur l'utilisation de la fonction lcd.clear()...

Où la placer efficacement pour effacer l'écran entre chaque menu ?

Merci d'avance de votre aide :slight_smile:

bonjour
ça depend ... :grin:
et un clear n'est pas toujours utile et necessaire hors "demarrage"
une astuce consiste à utiliser des longeurs fixe pour ecraser la precedente info

exemple :

lcd.print("     Bonjour         ");
lcd.print("Mode Selection");
lcd.print("Temperature     ");
lcd.print("Pression             ");

oui, on en parlait justement là :
http://forum.arduino.cc/index.php?topic=240385.msg1724420#msg1724420

john_lenfr:
oui, on en parlait justement là :
Actualiser heure - #8 by fdufnews - Français - Arduino Forum

:grin:
Ce qui tend à prouver que ce n'est pas necessairement une mauvaise solution 8)

Le problème du lcd.clear c'est que ça a un peu tendance à faire flasher l'écran et ce n'est pas agréable à l'oeil. Alors qu'un effacement local n'est quasiment pas visible et cela consomme aussi moins de temps.

Malgré tout si tu veux vraiment utiliser un lcd.clear, il faut le placer juste avant de redessiner l'écran comme cela le temps ou l'écran est vide se trouve réduit au minimum ce qui diminue le papillotement.

Je vient de faire la modification avec une chaîne vide, ça marche au poil, merci a vous, toujours au top ! XD

Et maintenant, est-il possible de détecter l'appuis d'un bouton pendant x temps afin de déclencher une action ?

J'ai ça qui marche bien, mais je voudrais sélectionné un menu par l'appuie prolonger du bouton (d'ou l'interruption en mode FALLING), comme ça, je peut appuyer x temps sans interruption.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
int contr = 3;
int bouton = 2;
int select = 0;

void setup()
{
  pinMode(contr, OUTPUT);
  pinMode(bouton, INPUT);
  attachInterrupt(0, selection, FALLING);
  Serial.begin(9600); // Communication serie
  lcd.begin(16, 2);
  lcd.setCursor(5,0);
  lcd.print("Bonjour");
  delay(500);
  lcd.clear();
}

void loop()
{
  switch(select)
  {
  case 0:
    lcd.setCursor (0,0);
    lcd.print("Mode Selection  ");
    break;

  case 1:
    lcd.setCursor(0,0);
    lcd.print("Temperature     ");
    break;
    
    case 2:
    lcd.setCursor(0,0);
    lcd.print("Pression        ");
    break;
    
    case 3:
    select=0;
    lcd.clear();
    break;
  }
  
}

void selection()
{
  select++;
}

Voilà, j'ai modifié mon code en conséquence, ça commence à être pas trop mal :

Plusieurs problèmes par-contre :

  • De temps à autre, le compteur sort du switch, me bloquant le programme (Il est censé me faire une boucle type 0, 1, 2, 0 ect)
    Grosso modo ça donne ça dans le moniteur : 000000111111111222222220000000 (fonctionnement normal) puis d'un coup 00000111111222222333000001111112222223333444445555566666 (chaque changement d'état correspond a un appui)
    Ca ressemble a du rebond, mais j'ai une résistance + un condensateur sur le bouton, je ne vois pas comment faire mieux :~

  • La fonction millis peut-être utilisé pour détecter une longueur de temps d'appuie ? Attention, je ne veux utiliser qu'un bouton...
    Style :

if(appuie>=1000) // si le temps d'appuie détecter est supérieur ou égal a une seconde, afficher le sous menu correspondant
{
     switch(validation) // Validation de l'affichage
     case 1:
     lcd.print(temperature);
    break;
}

Je sait que je pourrais afficher la température en même temps que la sélection de ce mode, mais j'aurais aimé savoir faire une sélection basé sur le temps d'appuie (et du coup pouvoir faire une infinité de sous menu voir un retour a la racine)

Pour tout vous dire, le but du jeu sera de récupérer les données récupérer sur ma vieille brouettes (température, pression d'huile, et pourquoi pas plus tard un indice de déclenchement du ventilo ect ect)
Mais j'aimerais maîtriser tout ça avant de me lancer dans l'installation et j'ai encore beaucoup de questions :smiley:

Et dernière question, j'ai lu sur un forum que le câblage du bouton ce faisais suivant ce schéma :
5V --- Résistance --- bouton --- masse
|
|
Entrée Arduino

Je les ai monté comme à gauche, et à droite c'est comme dans le livre du starter kit !

Mes boutons fonctionnes, mais du coup j'ai des doutes...

Personne ? Ne serais-ce que pour le schéma ? J'ai bien fait des recherches, mais on trouve de tout et son contraire...

Idem, quand je place un condensateur céramique entre le plus et le signal, j'ai l'impression que mon bouton fonctionne 100 fois mieux, et j'ai vu des schéma où ce condensateur était placé entre le plus et la masse... qu'en pensez-vous ?

Bizounours:
Personne ? Ne serais-ce que pour le schéma ? J'ai bien fait des recherches, mais on trouve de tout et son contraire...

Idem, quand je place un condensateur céramique entre le plus et le signal, j'ai l'impression que mon bouton fonctionne 100 fois mieux, et j'ai vu des schéma où ce condensateur était placé entre le plus et la masse... qu'en pensez-vous ?

bonsoir
un condensateur entre "plus et masse" ça filtre juste l'alim, ça n'a (quasi) aucune influence sur un contact.
entre plus et le signal , il absorbe les rebonds de contacts

Okay, et pour les branchements, les deux schéma sont similaires non ?

Ce sont exactement les mêmes, mais un truc m'intrigue, pourquoi une R de 10k sur la masse? Ca doit pas faire bon ménage avec la pull-up. Moi, je mets le bouton entre la pin et la masse, une capa de 10nF en // sur le contact (à la place de la 10k d'ailleurs, et 10kpF = 10nF, ne se seraient-ils pas gouré entre Res et cap?) et roule!

édit : Pour ce qui est du temps que prend un LCD.clear() et LCD.write(" "), je ne suis pas sûr, car la lib LCD est tellement bourée de digitalWrite et delay que... (je le sais, je l'ai réécrite pour gagner du temps)

Aucune idée, c'est quoi que t'appel la "pull-up ?" J'ai suivi l'exemple du livre en rajoutent seulement un condo céramique 103 entre le signal et l'alim... :smiley:

D'ailleurs je pense avoir la solution pour mon problème de comptage de temps, je met l'interruption sur le front montant (RISING), et je code de tel manière que :

SI l'appuie dur plus d'une seconde -----> Affiche les sous (sous) menus

SINON, change la catégorie de menu principal :smiley:

Le problème c'est que l’interruption est rattaché a une fonction d'incrémentation... Du coup il vaut mieux codé le comptage et l'incrémentation dans la même fonction ou branché l'interrupteur sur les deux broches permettant l’interruption ?

la pull-up, tout le monde croit que c'est huggies qui l'a inventée, mais non, ça existait déjà bien avant. C'est une résistance de l'ordre de 10k intégrée à la puce sur chaque entrée, activable ou non. Elle permet de mettre la pin à HIGH si rien n'est connecté dessus.

En fait, je crois que c'est toi qui a collé des résistances sur ton dessin, alors que ce sont en fait des capas.

Donc électroniquement, tu es bon. C'est donc ton code qui foire...

void setup()
{
  pinMode(contr, OUTPUT);
  pinMode(bouton, INPUT);
  attachInterrupt(0, selection, FALLING);

il manque un "digitalWrite(bouton, HIGH);" après les pinMode, ça activera ladite pull-up.

Ceci dit, tu n'es pas dans le ton. Tu comptes le nombre de fois que tu appuies sur le bouton, et avant d'arriver à 1000, bah...

Il faut que tu mesures le temps d'appui, et dans ton cas, pulseIn ne te sera d'aucun recours, à moins de bien savoir programmer.

Fais des recherches sur les temps d'appuis, j'ai une solution, mais tu vas pas aimer et surtout rien comprendre. Vois si quelqu'un a déjà pondu une lib dessus, et essaie de rouver le nom que porte ce genre d'action "appui long'?

Super_Cinci:
la pull-up, tout le monde croit que c'est huggies qui l'a inventée, mais non, ça existait déjà bien avant. C'est une résistance de l'ordre de 10k intégrée à la puce sur chaque entrée, activable ou non. Elle permet de mettre la pin à HIGH si rien n'est connecté dessus.

En fait, je crois que c'est toi qui a collé des résistances sur ton dessin, alors que ce sont en fait des capas.

Donc électroniquement, tu es bon. C'est donc ton code qui foire...

void setup()

{
  pinMode(contr, OUTPUT);
  pinMode(bouton, INPUT);
  attachInterrupt(0, selection, FALLING);


il manque un "digitalWrite(bouton, HIGH);" après les pinMode, ça activera ladite pull-up.

Ceci dit, tu n'es pas dans le ton. Tu comptes le nombre de fois que tu appuies sur le bouton, et avant d'arriver à 1000, bah...

Il faut que tu mesures le temps d'appui, et dans ton cas, pulseIn ne te sera d'aucun recours, à moins de bien savoir programmer.

Fais des recherches sur les temps d'appuis, j'ai une solution, mais tu vas pas aimer et surtout rien comprendre. Vois si quelqu'un a déjà pondu une lib dessus, et essaie de trouver le nom que porte ce genre d'action "appui long'?

En faite dans le bouquin c'est belle et bien des résistances de 10 K?, j'ai rajouter moi un capa de 0.01uF .
Comme sur ce schéma :

Mais du coup, plus ça va, moins je comprend le système anti-rebond, la résistance elle sert a quoi si il y en as en interne ? Et mon capa est bien placé ? (C'est ici qu'il fonctionne le mieux)

Je devais avoir du caca dans les yeux...

En effet, le montage proposé avec les résistances permet d'avoir un digitalRead() dans le bon sens (HIGH = appuyé, LOW = relâché). Pas besoin donc d'activer les pull-up. tes résistances sont des pull-down...

La capa en // sur le contact du BP, c'est juste pour avoir un signal bien propre. Faut imaginer que le contact, quand on appuie, il fait des faux-contacts très rapides pendant qu'on descend (comme si on appuyait plusieurs fois sur le bouton). La capa permet juste de filtrer ces faux-contacts. En général et de façon orthodoxe, on met la capa entre le signal et la masse, mais dans le principe, ça change pas grand chose.

Super_Cinci:
Je devais avoir du caca dans les yeux...

En effet, le montage proposé avec les résistances permet d'avoir un digitalRead() dans le bon sens (HIGH = appuyé, LOW = relâché). Pas besoin donc d'activer les pull-up. tes résistances sont des pull-down...

La capa en // sur le contact du BP, c'est juste pour avoir un signal bien propre. Faut imaginer que le contact, quand on appuie, il fait des faux-contacts très rapides pendant qu'on descend (comme si on appuyait plusieurs fois sur le bouton). La capa permet juste de filtrer ces faux-contacts. En général et de façon orthodoxe, on met la capa entre le signal et la masse, mais dans le principe, ça change pas grand chose.

A ok, ça me rassure parce que je commençais à m'embrouiller ]:smiley:
Oui, j'ai lu que le rebond était du en partie a l'élasticité des matériaux, c'est un concept facile a intégrer pour moi !

Je pense que je vais re-faire mon petit shield en y intégrant directement le capa du coup !

Voilà, j'ai modifié mon tableau de bord, vu que ni les potentiomètres, ni les boutons ne tiennent convenablement...


J'ai fait une alim commune pour les boutons :smiley:

Bon c'est la cata, j'aimerais avancé sur mon projet (déjà, récupérer la température de ma voiture serais une grande victoire....)

Mais je bute sur un problème qui doit probablement être tellement con que j'arrive pas à en trouver là solution...
J'ai brancher une TMP36 pour simuler la température de ma voiture, et l'afficher sur le LCD, c'est fait ça fonctionne !

Le problème vient du bouton, il arrive régulièrement a sortir du switch, et de ce fait me bug le programme :confused: Pourtant j'ai les résistances et les condensateurs, je ne devrais plus avoir de rebond, mais j'en ai encore... existe t'il des boutons poussoirs de très bonne qualité ? Le problème vient d'ailleurs ? :~

Bonjour, je continu ici, pour indiquer que j'ai résolu le problème de rebond en rajoutant un petit delay dans ma fonction qui compte !

Donc tout fonctionne bien maintenant !
J'ai pu récupérer l'heure d'un module RTC, ça avance doucement donc !

Merci a vous 8)

N'hésite pas à nous mettre ton code, il y a sûrement quelques optimisations qui te rendraient bien service...