Partage
  • Partager sur Facebook
  • Partager sur Twitter

Code à poussoirs avec Arduino

    21 juin 2013 à 11:17:42

    Bonjour à tous.

    Je suis en train de mettre au point un système d'alarme, mais j'ai un gros problème avec la partie du code, je m'explique : Une fois qu'il y a eu détection par un module infrarouge, un buzzer "bip" pendant 3 secondes, ce qui indique qu'il faut entrer un code pour désactiver l'alarme. Mais voilà, j'ai décidé que pour entrer mon code, j'allais utiliser 4 boutons-poussoirs, correspondant à des chiffres de 1 à 4 pour réaliser une combinaison de 4 chiffres qui désactivera l'alarme si il correspond au nombre voulu. Mon problème est donc que je n'ai absolument aucune idée de comment récupérer l'appui des boutons l'un après l'autre, pour affecter la valeur correspondante au bouton appuyé aux variables 'a' 'b' 'c' 'd', 'a' pour le premier appui, 'b' pour le second etc... et enregistrer le tout dans une variable "code" qui me permettra de faire la comparaison.

    Merci d'avance pour votre aide.

    -
    Edité par gamesman59 21 juin 2013 à 11:20:58

    • Partager sur Facebook
    • Partager sur Twitter
      21 juin 2013 à 13:03:52

      tu es sur quel support ? Un microcontrôleur ? de la logique câblée ? un automate industriel ? Un pc ?
      • Partager sur Facebook
      • Partager sur Twitter

      Retrouvez moi sur mon blog et ma chaine Youtube !

        21 juin 2013 à 13:14:02

        Il me semble que c'est écrit dans le titre, j'utilise Arduino.
        • Partager sur Facebook
        • Partager sur Twitter
          21 juin 2013 à 13:23:43

          Autant pour moi !!

          Nouvelle question : Qu'est ce qui te bloque vraiment ? Arrives tu à faire une lecture d'une entrée numérique ? Si oui, moi je verrais bien une machine à état qui permetterait de facilement décomposé/imposé la séquence

          • Partager sur Facebook
          • Partager sur Twitter

          Retrouvez moi sur mon blog et ma chaine Youtube !

            21 juin 2013 à 13:59:49

            Ce qui me bloque, c'est comment réaliser ce code à 4 chiffres. Je récupère l'appui du bouton avec digitalRead(), ensuite si c'est le bouton 1, j'affecte le chiffre 1 à la variable 'a'. Comme le code est l'ensemble des variables 'a','b','c', et 'd', je voudrais savoir comment stocker la valeur 'a' pour ensuite passer à la 'b' et ainsi de suite. Je ne sais pas si c'est très clair...
            • Partager sur Facebook
            • Partager sur Twitter
              21 juin 2013 à 14:14:19

              Là comme ça, j'ai une méthode un peu barbare qui me vient à l'esprit:

              SI 1er chiffre est vérifié ALORS

                 SI 2éme chiffre est vérifié ALORS

                    SI 3éme chiffre est vérifié ALORS

                       SI 4éme chiffre est vérifié ALORS

                          code trouvé

              SINON code non-trouvé

              Si un programmeur passe par là, ça va peut-être lui piquer les yeux....

              • Partager sur Facebook
              • Partager sur Twitter
                21 juin 2013 à 14:18:18

                void loop()
                {
                  distance = analogRead(capteur);
                  Serial.println(distance);
                  if (distance > 200)
                  {
                    easyvr.playSound(5, EasyVR::VOL_FULL);
                  }
                  delay (5000);
                  
                  digitalRead(bouton1);
                  digitalRead(bouton2);
                  digitalRead(bouton3);
                  digitalRead(bouton4);
                  
                  if (bouton1 == HIGH)
                  {
                    a = 1;
                  }
                  else if (bouton2 == HIGH)
                  {
                    a = 2;
                  }
                  else if (bouton3 == HIGH)
                  {
                    a = 3;
                  }
                  else if (bouton4 == HIGH)
                  {
                    a = 4;
                  }
                  
                  digitalRead(bouton1);
                  digitalRead(bouton2);
                  digitalRead(bouton3);
                  digitalRead(bouton4);
                  
                  if (bouton1 == HIGH)
                  {
                    b = 1;
                  }
                  else if (bouton2 == HIGH)
                  {
                    b = 2;
                  }
                  else if (bouton3 == HIGH)
                  {
                    b = 3;
                  }
                  else if (bouton4 == HIGH)
                  {
                    b = 4;
                  }
                  digitalRead(bouton1);
                  digitalRead(bouton2);
                  digitalRead(bouton3);
                  digitalRead(bouton4);
                  
                  if (bouton1 == HIGH)
                  {
                    c = 1;
                  }
                  else if (bouton2 == HIGH)
                  {
                    c = 2;
                  }
                  else if (bouton3 == HIGH)
                  {
                    c = 3;
                  }
                  else if (bouton4 == HIGH)
                  {
                    c = 4;
                  }
                  digitalRead(bouton1);
                  digitalRead(bouton2);
                  digitalRead(bouton3);
                  digitalRead(bouton4);
                  
                  if (bouton1 == HIGH)
                  {
                    d = 1;
                  }
                  else if (bouton2 == HIGH)
                  {
                    d = 2;
                  }
                  else if (bouton3 == HIGH)
                  {
                    d = 3;
                  }
                  else if (bouton4 == HIGH)
                  {
                    d = 4;
                  }
                if (a == 1 && b == 2 && c == 3 && d == 4) // si le code est "1234"
                {
                  // le code est bon, allumge d'une LED témoin.
                }
                else {
                  // activation de l'alarme
                }
                  
                  
                

                Voilà pour que ce soit plus clair, le code représentatif de ce que je souhaiterais faire, et j'ai l'impression qu'il manque quelque chose.
                • Partager sur Facebook
                • Partager sur Twitter
                  21 juin 2013 à 14:51:11

                  J'ai pas trop le temps là, je répond plus précisément plus tard mais dans l'immédiat tu peux chercher "machine à état"

                  -
                  Edité par Eskimon 21 juin 2013 à 14:51:31

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Retrouvez moi sur mon blog et ma chaine Youtube !

                    21 juin 2013 à 17:02:52

                    Comme tu me l'a conseillé, j'ai fais quelques recherches mais je n'ai rien trouvé de bien concluant...

                    J'attends donc tes explications avec impatience.

                    Merci beaucoup.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 juin 2013 à 18:36:44

                      Bonjour l'ergonomie!

                      Voici exactement ton code, reformaté, il prend déjà beaucoup moins de place (de 102 à 55 lignes). Autant de code pour une tâche si simple est inutile, obstructif. Pense aux fonctions! Tu fais 4 fois exactement la même chose, c'est juste une histoire de valeurs de variables.

                      void loop()
                      {
                        distance = analogRead(capteur);
                        Serial.println(distance);
                        
                        if (distance > 200) easyvr.playSound(5, EasyVR::VOL_FULL);
                        delay (5000);
                         
                        digitalRead(bouton1);
                        digitalRead(bouton2);
                        digitalRead(bouton3);
                        digitalRead(bouton4);
                         
                        if (bouton1 == HIGH) a = 1;
                        else if (bouton2 == HIGH) a = 2;
                        else if (bouton3 == HIGH) a = 3;
                        else if (bouton4 == HIGH) a = 4;
                        
                        digitalRead(bouton1);
                        digitalRead(bouton2);
                        digitalRead(bouton3);
                        digitalRead(bouton4);
                         
                        if (bouton1 == HIGH) b = 1;
                        else if (bouton2 == HIGH) b = 2;
                        else if (bouton3 == HIGH) b = 3;
                        else if (bouton4 == HIGH) b = 4;
                        
                        digitalRead(bouton1);
                        digitalRead(bouton2);
                        digitalRead(bouton3);
                        digitalRead(bouton4);
                         
                        if (bouton1 == HIGH) c = 1;
                        else if (bouton2 == HIGH) c = 2;
                        else if (bouton3 == HIGH) c = 3;
                        else if (bouton4 == HIGH) c = 4;
                      
                        digitalRead(bouton1);
                        digitalRead(bouton2);
                        digitalRead(bouton3);
                        digitalRead(bouton4);
                         
                        if (bouton1 == HIGH) d = 1;
                        else if (bouton2 == HIGH) d = 2;
                        else if (bouton3 == HIGH) d = 3;
                        else if (bouton4 == HIGH) d = 4;
                      
                        if (a == 1 && b == 2 && c == 3 && d == 4) {
                          // le code est bon, allumge d'une LED témoin.
                        }
                        else {
                          // activation de l'alarme
                        }
                      }


                      EDIT: Je ne me souviens plus bien mais je ne suis pas sûr que tu peut lire un pin comme ça, sans boucle. Je ne voudrais pas dire de bêtises.

                      int read_value() {
                        
                        int digit;
                        // ici declare les pins de tes 4 boutons
                        
                        digitalRead(bouton1);
                        digitalRead(bouton2);
                        digitalRead(bouton3);
                        digitalRead(bouton4);
                         
                        if (bouton1 == HIGH) digit = 1;
                        else if (bouton2 == HIGH) digit = 2;
                        else if (bouton3 == HIGH) digit = 3;
                        else if (bouton4 == HIGH) digit = 4;
                        
                        return digit
                      }
                      
                      void loop()
                      {
                        distance = analogRead(capteur);
                        Serial.println(distance);
                        
                        if (distance > 200) easyvr.playSound(5, EasyVR::VOL_FULL);
                        delay (5000);
                         
                         a=read_value();
                         b=read_value();
                         c=read_value();
                         d=read_value();
                      
                        if (a == 1 && b == 2 && c == 3 && d == 4) {
                          // le code est bon, allumge d'une LED témoin.
                        }
                        else {
                          // activation de l'alarme
                        }
                      }


                      -
                      Edité par moyk 23 juin 2013 à 18:51:48

                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 juin 2013 à 15:45:42

                        Tiens, j'ai récupéré pas mal de trucs ces derniers temps, dont des boutons poussoirs, alors je me suis dit que j'allais faire un petit truc à code comme toi. Ici c'est très simple, c'est avec 2 boutons. En admettant:

                        a = bouton de gauche

                        b = bouton de droite

                        Le code a tapé est:

                        abb

                        A chaque pression de bouton, la led pin 13 t'indique si tu as bon en fonction de son clignotement. Si tu as tout bon, la led s'allume.

                        Mais attention, tu n'as que 1 seconde et demie par pression, sinon, tout se reset. Faut être rapide! J'espère que cela t'aidera, tiens nous au courant!

                        Voilà, le code, assez simple (j'ai pas commenté c'est pas bien. Mais c'est vraiment facile... J'éditerais si besoin):

                        const int a = 7;
                        const int b = 6;
                        const int c = 5;
                        int stateA = 0;
                        int stateB=0;
                        int stateC=0;
                        int correct=0;
                        
                        void check(int stage) {
                          int counter=0;
                          int beat=0;
                          correct=stage;
                          if (stage==1) beat=500;
                          else if (stage==2) beat=100;
                          
                          while (counter<3) {
                            digitalWrite(13, HIGH);
                            delay(beat);
                            digitalWrite(13, LOW);
                            delay(beat);
                            counter=counter+1;
                          }
                        }
                        
                        void setup() {
                          pinMode(a, INPUT);   
                          pinMode(b, INPUT);
                          pinMode(c, INPUT);
                          pinMode(13, OUTPUT);
                          Serial.begin(9600);
                        }
                        
                        void loop(){
                          stateA = digitalRead(a);
                          stateB = digitalRead(b);
                          
                          if (correct==0 && stateA==HIGH) check(1);
                          else if (correct==1 && stateB==HIGH) check(2);
                          else if (correct==2 && stateB==HIGH) digitalWrite(13, HIGH);
                          else correct=0;
                          
                          delay(1500);
                        }



                        -
                        Edité par moyk 26 juin 2013 à 15:48:35

                        • Partager sur Facebook
                        • Partager sur Twitter
                          26 juin 2013 à 15:52:24

                          J'espere reviens plus tard avec une solution élégante à base de machine à état...

                          -
                          Edité par Eskimon 26 juin 2013 à 16:22:37

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Retrouvez moi sur mon blog et ma chaine Youtube !

                            26 juin 2013 à 17:20:54

                            Je ne me suis pas documenté sur le sujet...

                            Code à 3 boutons, code = c a b b a

                            const int a = 7;
                            const int b = 6;
                            const int c = 5;
                            int stateA = 0;
                            int stateB=0;
                            int stateC=0;
                            int correct=0;
                            
                            void check(int stage, int beat) {
                              correct=stage;
                              int pitch=beat;
                              int counter=0;
                              
                              while (counter<3) {
                                digitalWrite(13, HIGH);
                                delay(beat);
                                digitalWrite(13, LOW);
                                delay(beat);
                                counter=counter+1;
                              }
                            }
                            
                            void setup() {
                              pinMode(a, INPUT);   
                              pinMode(b, INPUT);
                              pinMode(c, INPUT);
                              pinMode(13, OUTPUT);
                              Serial.begin(9600);
                            }
                            
                            void loop(){
                              stateA = digitalRead(a);
                              stateB = digitalRead(b);
                              stateC = digitalRead(c);
                              
                              if (correct==0 && stateC==HIGH) check(1, 500);
                              else if (correct==1 && stateA==HIGH) check(2, 300);
                              else if (correct==2 && stateB==HIGH) check(3, 150);
                              else if (correct==3 && stateB==HIGH) check(4, 50);
                              else if (correct==4 && stateA==HIGH) digitalWrite(13, HIGH);
                              else correct=0;
                              
                              delay(1500);
                            }

                            Qu'est-ce qui ne va pas avec ça?

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Code à poussoirs avec Arduino

                            × 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