Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Programmer menu avec boutons


Sujet :

Arduino

  1. #1
    Membre habitué

    Homme Profil pro
    Technicien
    Inscrit en
    août 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2013
    Messages : 119
    Points : 183
    Points
    183
    Par défaut Programmer menu avec boutons
    Bonjour

    Je souhaiterai programmer un menu avec bouton avec des actions différentes selon l'ordre dans lequel on appuie sur les boutons. Ainsi :
    - bouton CAL--> action CAL (symbolisé par affichage de "Appui CAL seul")
    - bouton ENTER --> action ENTER (symbolisé par affichage de "ENTER appuye")
    - Bouton ENTER --> action ENTER --> si appui bouton CAL --> action CAL après ENTER (symbolisé par affichage du message "Appui CAL ap enter")

    Mon schéma électrique est bon car quand j'appuie sur chacun des boutons, j'ai bien un message qui s'affiche (CAL, ENTER) par contre, je dois avoir un souci de programmation car quand je sélectionne ENTER puis CAL, l'affichage reste celui de CAL alors qu'il devrait être CAL après ENTER.
    (A terme, je rajouterai un 3ème bouton mais je pense qu'une fois le principe trouvé, je pourrais m'en sortir)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    #include "DFRobot_PH.h"
    #include <EEPROM.h>
    #include <Wire.h>
    #include<LiquidCrystal_I2C.h>
    
    #define PH_PIN A1
    #define pinBoutonEnter  2
    #define pinBoutonCal  4
    #define pinBoutonExit  7
    
    
    LiquidCrystal_I2C lcd(0x27, 20, 4);
    
    
    boolean lastBoutonEnter = LOW;  //a
    boolean lastBoutonCal = LOW;
    boolean lastBoutonExit = LOW;
    boolean etatBoutonEnter;
    boolean etatBoutonCal;
    boolean etatBoutonExit;
    
    
    void setup()
    {
      Serial.begin(BAUD);
      ph.begin();
     
      lcd.init(); // initialisation de l'afficheur
      lcd.backlight();
      lcd.setCursor(0, 0);
      lcd.print("Appuyer ETALON   ");
      lcd.setCursor(0, 1);
      lcd.print("pour etalonnage  ");
      lcd.setCursor(0, 2);
      lcd.print("ou attendre 10s  ");
      lcd.setCursor(0, 3);
      lcd.print("pour mesurer pH  ");
    }
    
    void loop()
    {
        lcd.backlight();
     
        boolean testBoutonEnter = 0; //variable pour savoir si on rentre dans la boucle de calibration
        boolean testBoutonCal = 0; //variable pour savoir si on valide l'étalonnage
        boolean testBoutonExit = 0; //variable pour quitter le mode étalonnage
    
        static unsigned long timepoint = millis();   
       
        //on teste si le bouton ENTER est pressé --> si oui, on rentre dans le mode de calibration
        etatBoutonEnter=digitalRead(pinBoutonEnter);
        if (etatBoutonEnter != lastBoutonEnter)
        {
          delay(20);
          etatBoutonEnter=digitalRead(pinBoutonEnter);
          if (etatBoutonEnter == HIGH)
          {
            testBoutonEnter=1;
            lcd.backlight();
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("ENTER appuye");
            lcd.setCursor(0,3);
            lcd.print(testBoutonEnter);
    
            while (testBoutonEnter==1)
            {
                   
            //on teste si le bouton CAL est pressé --> si oui, on valide l'étalonnage
            etatBoutonCal=digitalRead(pinBoutonCal);
            if (etatBoutonCal != lastBoutonCal)
            {
              delay(20);
              etatBoutonCal=digitalRead(pinBoutonCal);
              if (etatBoutonCal == HIGH)
              {
                testBoutonCal = 1;
                lcd.backlight();
                lcd.clear();
                lcd.setCursor(0,0);
                lcd.print("Appui CAL ap enter");
                lcd.setCursor(0,3);
                lcd.print(testBoutonEnter);
                testBoutonEnter=0;
              }
            }
           
            }
           
          }
        }
    
        //on teste si le bouton CAL est pressé --> si oui, on valide l'étalonnage
            etatBoutonCal=digitalRead(pinBoutonCal);
            if (etatBoutonCal != lastBoutonCal)
            {
              delay(20);
              etatBoutonCal=digitalRead(pinBoutonCal);
              if (etatBoutonCal == HIGH)
              {
                testBoutonCal = 1;
                lcd.backlight();
                lcd.clear();
                lcd.setCursor(0,0);
                lcd.print("Appui CAL seul");
                lcd.setCursor(0,3);
                lcd.print(testBoutonEnter);           
              }
            }
       
        lastBoutonEnter=etatBoutonEnter;
        lastBoutonCal=etatBoutonCal;
    }
    Pourriez-vous m'aiguiller à trouver l'origine de mon erreur ?
    Merci
    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

  2. #2
    Membre averti

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mai 2013
    Messages : 60
    Points : 398
    Points
    398
    Par défaut Des boutons partout...
    Bonjour,

    Même les tests normaux ne doivent pas se dérouler correctement. En effet, un appui sur enter fait rentrer dans une boucle dont on ne peut sortir que par Cal. Cela ne se voit pas mais deux appuis successifs sur enter ne seront traités q'une seule fois.

    Par ailleurs dans le cas d'un appui sur Cal durant un appui sur Enter affiche bien le message attendu mais est suivi de suite du bloc Cal qui affiche sont propre message (pour s'en convaincre, il suffit de mettre un délai entre le bloc Enter et le bloc Cal).

    Sauf erreur, ceci devrait fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    void loop()
    {
       // on teste si le bouton ENTER est pressé --> si oui, on rentre dans le mode de calibration
       etatBoutonEnter = digitalRead(pinBoutonEnter);
       if (etatBoutonEnter > lastBoutonEnter)
       {
          lcd.backlight();
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Appui ENTER");
          if(lastBoutonCal == LOW)    // Appui sur Cal après appui maintenu sur Enter
             while (etatBoutonEnter = digitalRead(pinBoutonEnter)  // C'est bien un = et non == ;-)
             {  // on teste si le bouton CAL est pressé --> si oui, on valide l'étalonnage
                etatBoutonCal = digitalRead(pinBoutonCal);
                if (etatBoutonCal)
                {
                   lcd.backlight();
                   lcd.clear();
                   lcd.setCursor(0,0);
                   lcd.print("Appui CAL + ENTER");
                   break;
                }
             }
       }
       else  // "else" salvateur
       {  // on teste si le bouton CAL est pressé --> si oui, on valide l'étalonnage
          etatBoutonCal = digitalRead(pinBoutonCal);
          if (etatBoutonCal > lastBoutonCal)
          {
             lcd.backlight();
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("Appui CAL");
          }
       }
       lastBoutonEnter= etatBoutonEnter;
       lastBoutonCal  = etatBoutonCal;
       delay(50);
    }
    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  3. #3
    Membre habitué

    Homme Profil pro
    Technicien
    Inscrit en
    août 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2013
    Messages : 119
    Points : 183
    Points
    183
    Par défaut
    Bonjour

    Le code fonctionne, cela change par rapport à ma conception de la programmation mais puisque la mienne ne fonctionne pas mais que celle là marche, je conserve la tienne
    Quelques demandes d'éclaircissement :
    - tu testes l'état du bouton avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (etatBoutonEnter > lastBoutonEnter)
    alors que moi j'utilisais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (etatBoutonEnter != lastBoutonEnter)
    : y-a-t-il une raison "de programmation" ?

    Par contre, avec la modification de "philosophie", je suis embêté pour poursuivre mon projet en l'adaptant à 3 boutons (ENTER, CAL et EXIT) :
    - bouton CAL ou bouton EXIT seul : rien ne se passe
    - bouton ENTER seul : entrée dans le mode de calibration
    - bouton ENTER suivi de EXIT : on quitte le mode de calibration sans enregistrer les résultats
    - bouton ENTER suivi de CAL : on calibre la sonde --> un appui sur EXIT ensuite quitte le mode de calibration en sauvegardant les résultats de mesure
    Autant je pense m'en sortir pour le bouton ENTER suivi de EXIT par contre je suis embêté pour le dernier mode : j'imagine un code du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(lastBoutonExit == LOW)    // Appui sur E après appui maintenu sur Enter
             while (etatBoutonCal = digitalRead(pinBoutonCal))  // C'est bien un = et non == ;-)
             { 
                etatBoutonExit = digitalRead(pinBoutonExit);
                if (etatBoutonExit)
    mais je ne vois pas où le placer car je ne vois pas d'accolade débutant pour le test du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(lastBoutonCal == LOW)
    Merci pour ton aide en tout cas.
    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

  4. #4
    Membre averti

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mai 2013
    Messages : 60
    Points : 398
    Points
    398
    Par défaut Réponses
    Bonjour,

    1. Pour comprendre, il faut se rappeler que HIGH = 1 et LOW = 0. Alors la différence est que etatBoutonEnter > lastBoutonEnter n'est vrai que si etatBoutonEnter = 1 et lastBoutonEnter = 0 c'est à dire à l'appui du bouton. En revanche, etatBoutonEnter != lastBoutonEnter est vrai à l'appui du bouton mais également à son relâché. Comme ici ce qui intéresse est l'appui...

    2. Changement de philosophie.
    La modification est simple et proche du code prosposé (attention aux noms cependant). Pour Enter+Exit, juste après le bloc du Cal ( if(lastBoutonCal == LOW) while (...){... ...}, il suffit d'ajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    else if(lastBoutonExit == LOW)    // Appui sur E après appui maintenu sur Enter
             while (etatBoutonExit = digitalRead(pinBoutonExit))  // C'est bien un = et non == ;-)
             { 
                etatBoutonExit = digitalRead(pinBoutonExit);
                if (etatBoutonExit)....
    De la même manière, pour ajouter un Exit seul, il suffit de copier le bloc du Cal à la suite de ce dernier, de le faire précéder de else, et de remplacer dans ce nouveau bloc tous les Cal par des Exit.
    Pour ajouter d'autres boutons on peut pratiquer de même mais cela devient rapidement lourd. Dans ce cas, on peut gérer les boutons (hors les modificateurs comme ici Enter) dans un tableau de structure (State, Last, Pin). Mais ceci est une autre histoire

    Nota : j'ai fait disparaître des accolades qui introduisent un bloc déjà délimité comme if(...) while{...} mais j'ai respecté les indentations ce qui fait que l'accolade de fin du whille est décalée de 2 retraits. Si cela gène la lecture, rien n'empêche de réintroduire les accolades entre le if et le while et après celle du while.

    Bon courage.
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  5. #5
    Membre habitué

    Homme Profil pro
    Technicien
    Inscrit en
    août 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2013
    Messages : 119
    Points : 183
    Points
    183
    Par défaut
    Bonjour

    J'ai mis en oeuvre ta solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    void loop()
    {
       // on teste si le bouton ENTER est pressé --> si oui, on rentre dans le mode de calibration
       etatBoutonEnter = digitalRead(pinBoutonEnter);
       if (etatBoutonEnter > lastBoutonEnter)
       {
          ph.calibration(voltage,temperature,"ENTERPH");  // calibration process by Serail CMD
          lcd.backlight();
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("->etalonnage pHmetre");
          lcd.setCursor(0, 1);
          lcd.print("ENTER+CAL pour valider");
          lcd.setCursor(0, 2);
          lcd.print("EXIT pour quitter   ");
          if(lastBoutonCal == LOW)    // Appui sur Cal après appui maintenu sur Enter
             while (etatBoutonEnter = digitalRead(pinBoutonEnter))  // C'est bien un = et non == ;-)
             {  // on teste si le bouton CAL est pressé --> si oui, on valide l'étalonnage
                etatBoutonCal = digitalRead(pinBoutonCal);
                if (etatBoutonCal)
                {
                lcd.backlight();
                lcd.clear();
                ph.calibration(voltage,temperature,"CALPH");  // calibration process by Serail CMD
                lcd.backlight();
                lcd.setCursor(0, 0);
                lcd.print("->etalonnage reussi ");
                lcd.setCursor(0, 1);
                lcd.print("EXIT pour sauvegarde");
                lcd.setCursor(0, 2);
                lcd.print("et pour quitter     ");
                   break;
                }
             }
          else if(lastBoutonExit == LOW)    // Appui sur E après appui maintenu sur Enter
            while (etatBoutonEnter = digitalRead(pinBoutonEnter))  // C'est bien un = et non == ;-)
             { 
                etatBoutonExit = digitalRead(pinBoutonExit);
                if (etatBoutonExit)
                {
                lcd.backlight();
                lcd.clear();
                ph.calibration(voltage,temperature,"EXITPH");  // calibration process by Serail CMD
                lcd.backlight();
                lcd.setCursor(0, 0);
                lcd.print("->On sort ");
                break;
                }
             }
        }
     
       else  // "else" salvateur
       {  
          etatBoutonExit = digitalRead(pinBoutonExit);
          if (etatBoutonExit > lastBoutonExit)
          {
             lcd.backlight();
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("Appui Exit");
          }
       }
       lastBoutonEnter= etatBoutonEnter;
       lastBoutonCal  = etatBoutonCal;
       lastBoutonExit = etatBoutonExit;
    Le code marche très bien ... une seule fois ! Car une fois que j'ai fait une première fois CAL, je ne peux plus le refaire : l'appui de ENTER+CAL envoie la commande "CALPH" que lors du premier appui, pas les suivants (y compris quand je quitte le mode de calibration avec ENTER+EXIT). J'ai regardé le code, je ne comprends pas pourquoi il ne retourne pas dans la boucle à la 2ème fois (et les fois suivantes)
    Là ou cela m'ennuie, c'est que j'ai besoin de faire 2 fois cette manipulation avec 2 solutions différentes pour calibrer correctement mon pH-mètre.

    Autre question, pour changer de philosophie de programmation : ici, pour quitter le mode étalonnage après calibration, je dois d'abord faire ENTER+CAL puis sans relâcher ENTER appuyer sur EXIT (si je relâche ENTER, je change de mode et je passe de la suite ENTER --> EXIT au lieu de ENTER --> CAL --> EXIT).

    N'est-il pas possible d'entre dans le mode de calibration (l'équivalent du ENTER+CAL actuel) sans avoir à maintenir les 2 boutons pressés (mais c'est sans doute bien plus compliqué à programmer) ? Dis autrement, pour faciliter l'utilisation du montage :
    1ère situation : j'appuie sur ENTER (et je relâche)--> je passe en mode calibration ; j'appuie sur CAL (sans aucun autre bouton) --> je calibre ; j'appuie sur EXIT, je valide la calibration
    2ème situation : j'appuie sur ENTER (et je relâche)--> je passe en mode calibration, j'appuie sur EXIT, je quitte la calibration sans sauvegarder
    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

  6. #6
    Membre régulier
    Homme Profil pro
    savant fou
    Inscrit en
    septembre 2019
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : savant fou

    Informations forums :
    Inscription : septembre 2019
    Messages : 44
    Points : 84
    Points
    84
    Par défaut
    Si vous voulez structurer mieux votre code, Il faudrait que vous sépariez la gestion de vos boutons du corps du code (il existe de bonnes librairies de boutons) et prendre un approche par machine à état / final state machine (FSM en anglais)

    ———

    Citation Envoyé par Guesset Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    else if(lastBoutonExit == LOW)    // Appui sur E après appui maintenu sur Enter
             while (etatBoutonExit = digitalRead(pinBoutonExit))  // C'est bien un = et non == ;-)
             { 
                etatBoutonExit = digitalRead(pinBoutonExit);
                if (etatBoutonExit)....
    A noter qu’il n’y a pas besoin d’affecter etatBoutonExit dans le corps du while puisque vous le faites dans la condition et le if ne sert à rien puisque si on est dans le corps du while c’est que c’était HIGH

  7. #7
    Membre averti

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mai 2013
    Messages : 60
    Points : 398
    Points
    398
    Par défaut Mea culpa
    Bonjour,

    J'ai été un peu trop vite en disant qu'il suffisait d'ajouter deux blocs (avec Enter et sans). Le Exit seul doit fonctionner mais pas le Enter+Exit. En effet, il passe d'abord par la boucle Enter+Cal dont il ne sort que par la remonté de Enter (mais alors c'est cuit pour Exit qui vient derrière) ou par l'appui sur Cal (ce qui fait que Enter+Exit est alors Enter+Cal+Exit).

    Il faut réintégrer les deux cas dans la boucle Enter + Cal qui devient Enter + (Cal ou Exit). Je vais faire une proposition dans la journée.

    Avec mes excuses.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  8. #8
    Membre averti

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mai 2013
    Messages : 60
    Points : 398
    Points
    398
    Par défaut
    Bonjour Jay

    Citation Envoyé par Jay M Voir le message
    A noter qu’il n’y a pas besoin d’affecter etatBoutonExit dans le corps du while puisque vous le faites dans la condition et le if ne sert à rien puisque si on est dans le corps du while c’est que c’était HIGH
    C'est vrai, merci. Mais en fait l'erreur est le Exit en rouge qui devrait être resté un Enter puisqu'on vérifie que le Enter est maintenu appuyé (comme un modificateur) en attendant l'appui éventuel sur Exit ou Cal. Les bibliothèques de boutons sont intéressantes mais la gestion de modificateurs (ou "modifiers" comme CTRL, MAJ, ALT sur PC) me semble peu développée.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  9. #9
    Membre habitué

    Homme Profil pro
    Technicien
    Inscrit en
    août 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2013
    Messages : 119
    Points : 183
    Points
    183
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Avec mes excuses.Salutations
    Aucun problème, tu m'aides beaucoup !

    J'ai essayé de modifier en proposant ça pour n'avoir qu'à appuyer sur un seul bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    void loop()
    {
      // on teste si le bouton ENTER est pressé --> si oui, on rentre dans le mode de calibration
      etatBoutonEnter = digitalRead(pinBoutonEnter);
      if (etatBoutonEnter > lastBoutonEnter)
      {
        testBoutonEnter=1;
        ph.calibration(voltage,temperature,"ENTERPH");  // calibration process by Serail CMD
        lcd.backlight();
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("->etalonnage pHmetre");
        lcd.setCursor(0, 1);
        lcd.print("CAL pour valider");
        lcd.setCursor(0, 2);
        lcd.print("EXIT pour quitter   ");
        if(lastBoutonCal == LOW)    // Appui sur Cal après appui sur Enter
          while (testBoutonEnter == 1)  
          {  // on teste si le bouton CAL est pressé --> si oui, on valide l'étalonnage
            etatBoutonCal = digitalRead(pinBoutonCal);
            if (etatBoutonCal)
            {
              lcd.backlight();
              lcd.clear();
              ph.calibration(voltage,temperature,"CALPH");  // calibration process by Serail CMD
              lcd.backlight();
              lcd.setCursor(0, 0);
              lcd.print("->etalonnage reussi ");
              testBoutonCal=1;
            }
            if(lastBoutonExit == LOW)    // Appui sur E après appui maintenu sur Enter
              while (testBoutonCal == 1) 
              { 
                etatBoutonExit = digitalRead(pinBoutonExit);
                if (etatBoutonExit)
                {
                  lcd.backlight();
                  lcd.clear();
                  ph.calibration(voltage,temperature,"EXITPH");  // calibration process by Serail CMD
                  lcd.backlight();
                  lcd.setCursor(0, 0);
                  lcd.print("->Etalonnage reussi ");
                  delay(1000);
                  lcd.clear();
                  testBoutonEnter=0;
                  testBoutonCal=0;
                  break;
                }
             }
           }
     
     
        }
     
       else  // "else" salvateur
       {  
          etatBoutonExit = digitalRead(pinBoutonExit);
          if (etatBoutonExit > lastBoutonExit)
          {
             ph.calibration(voltage,temperature,"EXITPH");  // calibration process by Serail CMD
             lcd.backlight();
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("->Etalonnage arrete");
             delay(2000);
             lcd.clear();
     
          }
       }
       lastBoutonEnter= etatBoutonEnter;
       lastBoutonCal  = etatBoutonCal;
       lastBoutonExit = etatBoutonExit;
    Il fonctionne très bien pour la partie ENTER --> CAL --> EXIT
    par contre quand je fais ENTER --> EXIT, cela ne fonctionne que si je suis passé d'abord par ENTER --> CAL --> EXIT
    Et toujours le problème du CAL que je ne peux atteindre qu'une seule fois
    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

  10. #10
    Membre averti

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mai 2013
    Messages : 60
    Points : 398
    Points
    398
    Par défaut Les trois petits boutons
    Bonjour,

    Code revu proposé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    void loop()
    {
       // on teste si le bouton ENTER est pressé --> si oui, on rentre dans le mode de calibration
       etatBoutonEnter = digitalRead(pinBoutonEnter);
       if (etatBoutonEnter > lastBoutonEnter)
       {
          ph.calibration(voltage,temperature,"ENTERPH");  // calibration process by Serail CMD
          lcd.backlight();
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("->etalonnage pHmetre");
          lcd.setCursor(0, 1);
          lcd.print("ENTER+CAL pour valider");
          lcd.setCursor(0, 2);
          lcd.print("EXIT pour quitter   ");
          while (etatBoutonEnter = digitalRead(pinBoutonEnter))  // C'est bien un = et non == ;-)
          {
             etatBoutonCal = digitalRead(pinBoutonCal);  
             if (etatBoutonCal > lastBoutonCal)          // Appui sur Cal avec appui maintenu sur Enter
             {
                lcd.backlight();
                lcd.clear();
                ph.calibration(voltage,temperature,"CALPH");  // calibration process by Serail CMD
                lcd.backlight();
                lcd.setCursor(0, 0);
                lcd.print("->etalonnage reussi ");
                lcd.setCursor(0, 1);
                lcd.print("EXIT pour sauvegarde");
                lcd.setCursor(0, 2);
                lcd.print("et pour quitter     ");
                break;
             }
             etatBoutonExit = digitalRead(pinBoutonExit);
             if (etatBoutonExit > lastBoutonExit)
             {
                lcd.backlight();
                lcd.clear();
                ph.calibration(voltage,temperature,"EXITPH");  // calibration process by Serail CMD
                lcd.backlight();
                lcd.setCursor(0, 0);
                lcd.print("->On sort ");
                break;
             }   
          }
       }
       else  // "else" salvateur
       {  
          etatBoutonExit = digitalRead(pinBoutonExit);
          if (etatBoutonExit > lastBoutonExit)
          {
             lcd.backlight();
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("Appui Exit");
          }
       }
       lastBoutonEnter= etatBoutonEnter;
       lastBoutonCal  = etatBoutonCal;
       lastBoutonExit = etatBoutonExit;
       delay(50);
    }
    Il devrait se comporter ainsi :

    Nom : 3 boutons.png
Affichages : 35
Taille : 65,1 Ko

    Est-ce que les comportements suivants sont bien ceux souhaités ?
    1. Dès que le bouton Enter est appuyé son action propre est réalisée qu'il soit ou non accompagné de Cal ou Exit.
    2. Cal n'a aucune action si Enter n'est pas appuyé.


    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  11. #11
    Membre habitué

    Homme Profil pro
    Technicien
    Inscrit en
    août 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2013
    Messages : 119
    Points : 183
    Points
    183
    Par défaut
    Non, j'obtiens toujours le même problème : l'appui sur ENTER+EXIT après ENTER+CAL réinitialise la procédure à partir de l'appui sur ENTER.

    Après, la solution proposée dans le post 4 que j'ai adapté dans le post 5 fonctionne plutôt bien : pour être parfait, il y a juste le problème du CAL qui ne peut se faire qu'une seule fois.
    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

  12. #12
    Membre averti

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mai 2013
    Messages : 60
    Points : 398
    Points
    398
    Par défaut Des boutons partout...
    Bonjour,

    La suppression fonctionnelle (pas d'action pour Cal seul) a fait également disparaître l'actualisation de Cal.

    En effet, de facto la lecture du bouton Cal a été supprimée dans le else de fin (celui-ci ne traite plus que le seul bouton Exit quand il n'y a pas de Enter), il faudrait le réintroduire en partie (simplement un etatBoutonCal = digitalRead(pinBoutonCal); en début du bloc else de fin) parce qu'actuellement si Enter n'est pas appuyé, Cal n'est plus actualisé.

    Je ne suis pas sûr de comprendre la première phrase :
    Non, j'obtiens toujours le même problème : l'appui sur ENTER+EXIT après ENTER+CAL réinitialise la procédure à partir de l'appui sur ENTER.
    Salutation
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  13. #13
    Membre habitué

    Homme Profil pro
    Technicien
    Inscrit en
    août 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2013
    Messages : 119
    Points : 183
    Points
    183
    Par défaut
    Citation Envoyé par Guesset Voir le message
    il faudrait le réintroduire en partie (simplement un etatBoutonCal = digitalRead(pinBoutonCal); en début du bloc else de fin)
    Efftivement, avec cette manipulation, cela fonctionne
    Le code complet qui répond à mes attentes avec ton aide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    void loop()
    {
      // on teste si le bouton ENTER est pressé --> si oui, on rentre dans le mode de calibration
      etatBoutonEnter = digitalRead(pinBoutonEnter);
      if (etatBoutonEnter > lastBoutonEnter)
      {
        testBoutonEnter=1;
        ph.calibration(voltage,temperature,"ENTERPH");  // on envoie la commande ENTERPH au module pour commencer la calibration
        lcd.backlight();
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("->etalonnage pHmetre");
        lcd.setCursor(0, 1);
        lcd.print("CAL pour valider");
        lcd.setCursor(0, 2);
        lcd.print("EXIT pour quitter   ");
        int i=6;
        while (i>=0)
        {
          lcd.setCursor(0,3);
          lcd.print("Attendre ");
          lcd.setCursor(9,2);
          lcd.print(i);
          lcd.setCursor(10,2);
          lcd.print(" sec");
          delay(1000);
          i=i-1;
        }
      lcd.setCursor(0,2);
      lcd.print("                    ");
        if(lastBoutonCal == LOW)    // on  teste l'appui sur Cal après avoir  appuyé au préalable sur Enter
          while (testBoutonEnter == 1)  
          {  // on teste si le bouton CAL est pressé --> si oui, on valide l'étalonnage
            etatBoutonCal = digitalRead(pinBoutonCal);
            if (etatBoutonCal)
            {
              lcd.backlight();
              lcd.clear();
              ph.calibration(voltage,temperature,"CALPH");  // calibration process by Serail CMD
              lcd.backlight();
              lcd.setCursor(0, 0);
              lcd.print("->etalonnage reussi ");
              lcd.setCursor(0, 1);
              lcd.print("EXIT pour sauvegarde");
              lcd.setCursor(0, 2);
              lcd.print("et pour quitter     ");
              testBoutonCal=1;
            }
            if(lastBoutonExit == LOW)    // Appui sur E après appui maintenu sur Enter
              while (testBoutonCal == 1)  // C'est bien un = et non == ;-)
              { 
                etatBoutonExit = digitalRead(pinBoutonExit);
                if (etatBoutonExit)
                {
                  lcd.backlight();
                  lcd.clear();
                  ph.calibration(voltage,temperature,"EXITPH");  // calibration process by Serail CMD
                  lcd.backlight();
                  lcd.setCursor(0, 0);
                  lcd.print("->Etalonnage reussi ");
                  delay(1000);
                  lcd.clear();
                  testBoutonEnter=0;
                  testBoutonCal=0;
                  break;
                }
             }
           }
    
       }
       else  // "else" salvateur
       {  
          etatBoutonCal = digitalRead(pinBoutonCal);
          etatBoutonExit = digitalRead(pinBoutonExit);
          if (etatBoutonExit > lastBoutonExit)
          {
             ph.calibration(voltage,temperature,"EXITPH");  // calibration process by Serail CMD
             lcd.backlight();
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("->Etalonnage arrete");
             delay(2000);
             lcd.clear();
             
          }
       }
       lastBoutonEnter= etatBoutonEnter;
       lastBoutonCal  = etatBoutonCal;
       lastBoutonExit = etatBoutonExit;
       
       
       float resultatph=0.0;
       static unsigned long timepoint = millis();
       if(millis()-timepoint>2000U)  //time interval: 2s
        {
          timepoint = millis();
    
          for (int i =0;i<cycles;i++){
            voltage = analogRead(PH_PIN)/1024.0*5000;  // read the voltage
            //temperature = readTemperature();  // read your temperature sensor to execute temperature compensation
            phValue = ph.readPH(voltage,temperature);  // convert voltage to pH with temperature compensation
            //Serial.print("temperature:");
            //Serial.print(temperature,1);
            //Serial.print("^C  pH:");
            resultatph += phValue;
          }
    
          resultatph /= cycles;
          
          Serial.println(resultatph,2);
          
          lcd.setCursor(0, 3);
          lcd.print("pH = ");
          lcd.setCursor(5, 3);
          lcd.print(resultatph,2);
        }
       ph.calibration(voltage,temperature);  // calibration process by Serail CMD
       delay(50);
    }
    merci beaucoup pour l'aide apportée
    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] affichage menu avec bouton dès le démarrage de Access
    Par saphir20 dans le forum IHM
    Réponses: 1
    Dernier message: 08/11/2009, 10h21
  2. Menu avec boutons déroulants
    Par xanatos dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/07/2008, 12h46
  3. [VB6]menu avec le bouton droit
    Par yoyothebest dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/05/2006, 22h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo