Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Bouton à mémoire 1bit

Sujet résolu
    24 avril 2013 à 16:59:55

    Bonjour à tous, je suis actuellement en train de suivre le tuto Arduino et je cherchais par moi même comment créer un bouton à mémoire un bit, c'est à dire que lorsque l'on appuie sur le bouton la led s'allume et reste allumé puis lorsque l'on rappuie, la led s’éteint.
    J'ai réalisé le même montage que l'on trouve sur cette page : http://www.siteduzero.com/sciences/tutoriels/arduino-pour-bien-commencer-en-electronique-et-en-programmation/recuperer-l-appui-du-bouton
    Et voici mon code : 
     const int bouton = 2; //le bouton est connecté à la broche 2 de la carte Adruino
    const int led = 13; //la LED à la broche 13
     
    int etatBouton; 
    int etatLed;
    
    void setup()
    {
       pinMode(led, OUTPUT); //la led est une sortie
       pinMode(bouton, INPUT); //le bouton est une entrée
       etatBouton = HIGH; 
       etatLed = HIGH;
    }
     
    void loop()
    {
       etatBouton = digitalRead(bouton); //Rappel : bouton = 2
        
       if(etatBouton == LOW) //Si le bouton est appuyé
       {
          etatLed == !etatLed; //L'état de la Led change
       }
       else // Autrement
       {
         //Rien ne se passe
       }
       digitalWrite(led, etatLed);
    }

    -
    Edité par BlepBloupBlop 24 avril 2013 à 17:03:39

    • Partager sur Facebook
    • Partager sur Twitter
      24 avril 2013 à 18:26:42

      Il y a de l'idée, mais le problème de ce programme c'est qu'il ne prend pas en compte la variation d'état du bouton. Tu te contentes de vérifier uniquement qu'il est à l'état bas. Et comme ton programme fonctionne à une vitesse hallucinante (plusieurs milliers de fois par seconde), ta led va s'allumer et s'éteindre plusieurs fois par seconde et tu ne verras pas le changement.

      As tu des idées comment résoudre ce problème (est-ce que je t'ai mis sur une piste ou juste embrouiller un peu plus ?)

      • Partager sur Facebook
      • Partager sur Twitter

      Retrouvez moi sur mon blog et ma chaine Youtube !

        25 avril 2013 à 22:21:14

        Bin je ne vois pas trop non '^^ peut être mettre un timer dans la boucle pour bloquer l'état du bouton un moment histoire pouvoir enlever son doigt, genre 1 sec mais c'est tout, de plus en utilisant cette méthode, si l'utilisateur met trop de temps la led ne changera pas... Il faudrait autrement réinitialiser la boucle quand le bouton pas de l'état Low à High

        • Partager sur Facebook
        • Partager sur Twitter
          25 avril 2013 à 22:36:41

          Pour modifier une valeur c’est = et non == (ligne 21).

          Pour résoudre le problème du bouton, il y a deux méthodes, un flag ou une FSM (Finite State Machine = Machine à états).

          Un flag (ou booléen) est une variable valant 0 ou 1 (faux ou vrai), tu pourrais faire un flag boutonAppuye, le mettre à 1 quand tu appuie sur le bouton, le mettre à 0 quand tu le relâches et changer l’état de la led si, lors de l’appui, le flag était à 0.

          Une FSM permet d’implémenter un GRAFCET, sais-tu ce que c’est ?

          EDIT: Une FSM est un peu lourd pour ça AMHA.

          -
          Edité par fscorpio 25 avril 2013 à 22:38:26

          • Partager sur Facebook
          • Partager sur Twitter
            25 avril 2013 à 23:12:07

            Sinon il y a la solution dans la suite du tuto ^^

            Le concept est de repérer un changement d'état plutot qu'un état lui même. Comme le dit fscorpio, il faut utiliser un flag. Ainsi tu peux sauvegarder l'état du bouton au temps 't' et ensuite le comparé au temps 't-1' ou 't+1'. S'il y a eu le changement d'état que tu cherches (haut vers bas ou bas vers haut tu exécutes ton instruction, sinon tu ne fais rien !

            • Partager sur Facebook
            • Partager sur Twitter

            Retrouvez moi sur mon blog et ma chaine Youtube !

              26 avril 2013 à 17:25:58

              Oui je vois ce qu'est un grafcet il n'y a pas de problème à ce niveau, et autrement pour le flag, je crée alors un booléen appelé EtatBouton par exemple et je compare la valeur du booléen à des valeurs antérieurs pour savoir si il y a eu changement d'état ?

              • Partager sur Facebook
              • Partager sur Twitter
                28 avril 2013 à 13:06:29

                J'ai essayé, mais je ne pense n'avoir réellement rien changé au programme d'origine et là j'ai plus trop d'idée :l
                Si vous pouviez m'aider : 
                const int bouton = 2; //le bouton est connecté à la broche 2 de la carte Adruino
                const int led = 13; //la LED à la broche 13
                boolean x = 1;
                 
                int etatBouton; //variable qui enregistre l'état du bouton
                int etatLed; //variable indiquand l'état de la LED
                
                void setup()
                {
                   pinMode(led, OUTPUT); //la led est une sortie
                   pinMode(bouton, INPUT); //le bouton est une entrée
                   etatBouton = HIGH; //on initialise l'état du bouton comme "relaché"
                   etatLed = HIGH;
                } 
                void loop()
                {
                   etatBouton = digitalRead(bouton); //Rappel : bouton = 2
                   
                   
                   if(etatBouton != x) 
                   {
                      etatLed == !etatLed; //L'état de la Led change
                      x == etatBouton;
                   }
                   else // Autrement
                   {
                     //Rien ne se passe
                   }
                   digitalWrite(led, etatLed);
                }
                
                • Partager sur Facebook
                • Partager sur Twitter
                  28 avril 2013 à 17:26:55

                  Arf, toujours bloqué mais j'ai l'impression de toucher au but, voici mon programme :

                  const int bouton = 2; //le bouton est connecté à la broche 2 de la carte Adruino
                  const int led = 13; //la LED à la broche 13
                  int memoire_bout = HIGH;
                   
                  int etatBouton; //variable qui enregistre l'état du bouton
                  int etatLed; //variable indiquand l'état de la LED
                  
                  void setup()
                  {
                     pinMode(led, OUTPUT); //la led est une sortie
                     pinMode(bouton, INPUT); //le bouton est une entrée
                     etatBouton = HIGH; //on initialise l'état du bouton comme "relaché"
                     etatLed = HIGH;
                  } 
                  void loop()
                  {
                     etatBouton = digitalRead(bouton); //Rappel : bouton = 2
                     
                     if((etatBouton != memoire_bout) && (etatBouton == LOW)) 
                     {
                        etatLed == !etatLed; //L'état de la Led change
                     }
                     
                     memoire_bout == etatBouton;
                    
                     digitalWrite(led, etatLed);
                  }

                  J'ai suivi le tuto et j'ai modifié la condition, je sais que mon programme ne marche pas comme il faut, mais normalement la Led devrai s'allumer si je reste appuyé sur le bouton, hors ce n'est pas le cas, si tu pouvais vite vérifier mon programme et me dire si je me suis de nouveau trompé ou non, cela serai utilse merci

                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 avril 2013 à 18:02:31

                    ligne 21 et 24, tu as un == à la place d'un = ...
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Retrouvez moi sur mon blog et ma chaine Youtube !

                      28 avril 2013 à 18:53:39

                      Merci beaucoup, le programme marche nickel !
                      • Partager sur Facebook
                      • Partager sur Twitter

                      [Arduino] Bouton à mémoire 1bit

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown