Partage
  • Partager sur Facebook
  • Partager sur Twitter

Opérateurs logiques

Arduino

Sujet résolu
    20 mars 2019 à 22:49:07

    Bonjour,

    Etant débutant dans le domaine de la programmation et étudiant les opérateurs logiques en cours, je me suis mis en tête de les exploiter dans un code. J'ai trouvé un exercice sur Internet sur m'entrainer mais je suis bloqué.

    Voici l'énoncé:

    Objectif : Proposer un circuit de commande. Vous avez à votre disposition :

    ·Une Arduino Uno

    ·4 boutons poussoirs NO pour simuler les 4 entrées

    ·Une DEL rouge pour simuler la sortie M et une DEL verte pour simuler la sortie D (à mettre en série avec des résistances de 330 Ω)

    ·Des résistances de 10 KΩ pour assurer, aux entrées, un niveau logique zéro

           Le code:

           

    Dans mon code, je dois donc faire en sorte que la LED rouge (M) s'allume lorsque les conditions ci-dessus sont respectées et idem pour la LED verte (D). 

          J'ai utilisé les variables ainsi, BPm = m ; BPd = d ; FCb = b ; FCa = a

           Actuellement, j'en  suis ici mais j'ai deux problèmes: premièrement, les LED sont deja allumé sans que je ne fasse rien alors que je voudrais qu'elles soient éteinte initialement et deuxièmement, les LED ne s'allument pas comme l'equation logique ci-dessus le dit.

    const int BPm = 2;  
    const int BPd = 3;  
    const int FCb = 7;  
    const int FCa = 6;  
    
    const int MotM =  13;  
    const int MotD =  12;  
    
    void setup()
    {
      // parametrage des Pins comme étant des entrées
      pinMode(BPm, INPUT);
      pinMode(BPd, INPUT);
      pinMode(FCb, INPUT);
      pinMode(FCa, INPUT);
      
      // parametrage des Pins comme étant des sorties
      pinMode(MotM, OUTPUT);
      pinMode(MotD, OUTPUT); 
    }
    
    
    void loop()
    {
      int BPmState;
      int BPdState; 
      int FCbState;
      int FCaState;
    
      BPmState = digitalRead(BPm);
      BPdState = digitalRead(BPd);
      FCbState = digitalRead(FCb);
      FCaState = digitalRead(FCa);
      
      if ((BPmState == LOW) || (BPdState == !LOW) || (FCbState == !LOW))
      {
        digitalWrite(MotM, HIGH);
      }
      else
      {
        digitalWrite(MotM, LOW);
      }
    
      if((BPmState == !LOW) || (BPdState == LOW) || (FCaState == LOW))
      {
        digitalWrite(MotD, HIGH);
      }
      else
      {
        digitalWrite(MotD, LOW);
      }
      
    }

           Merci de votre aide d'avance.

    ddz

       L

    Le

    • Partager sur Facebook
    • Partager sur Twitter
      21 mars 2019 à 2:09:10

      Ouch !

      Commence par choisir des noms de variable un peut (beaucoup) plus parlant, histoire qu'on comprenne ce que te code veux dire (la programmation n'est pas un concours d'abreviation).

      d'après tes équations logique, on devrais voir des "Et" quelque part dans ton code, mais on ne voit que des "ou":

      M = m ET NON(d) ET NON(b) <==> M = m ET NON(d OU b).
      D = NON(m) ET d ET NON(a) <==> D = d ET NON(m OU A).

      -
      Edité par Deedolith 21 mars 2019 à 2:09:45

      • Partager sur Facebook
      • Partager sur Twitter
        21 mars 2019 à 20:18:32

        Attendez, je crois avoir compris. Mais j'ai une question: Pour dire qu'on n'appuie pas sur le bouton, je dois ecrire BPdState == !LOW  ou  !BPdState == LOW  ?
        • Partager sur Facebook
        • Partager sur Twitter
          21 mars 2019 à 21:47:39

          Simple question de logique, le code doit être le plus expressif possible et ce pour une raison très simple, tu vas passer plus de temps à le relire qu'a l'ecrire. Pire même, sur de gros programmes, tu seras amené à relire du code que tu as écrit il y a des années (sans parler de la possibilité que tu sois obligé de relire le code d'un autre, ou l'inverse). Quand tu reliras ton code dans 5 ans, tu n'auras plus le contexte, tu seras passé à autre chose... les seuls guides que tu auras seront les noms de variables et de fonctions que tu auras choisi. C'est pour ça que nous, les pros, les programmeurs expérimentés insistons tant sur la nécessité de bien nommer ses variables, types et fonctions, et de toujours choisir l'expression la plus claire possible, c'est juste une question de survie.

          -
          Edité par int21h 21 mars 2019 à 21:50:47

          • Partager sur Facebook
          • Partager sur Twitter
          Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
            22 mars 2019 à 10:35:44

            HugoBlaess a écrit:

            Attendez, je crois avoir compris. Mais j'ai une question: Pour dire qu'on n'appuie pas sur le bouton, je dois ecrire BPdState == !LOW  ou  !BPdState == LOW  ?


            Salut,

            Tu dis que ce sont des boutons Normalement Ouvert sur un montage en pull-down, donc leur état au repos (lorsqu'on appuie pas dessus) est à LOW, ça s'écrit `BPxState == LOW`. Et pour indiquer que l'on appuie dessus, il vaut mieux écrire `BPxState == HIGH` car ce n'est pas vraiment un booléen, ce sont des valeurs d'entier choisi arbitrairement par arduino, et il pourrait s'amuser à créer d'autres valeurs (transition, front montant/descendant, haute impédance ...) donc tester un NON(LOW) n'est pas une bonne solution. Si c'est tout de même ce que tu veux faire, ça s'écrit plutôt `!(BPxState == LOW)`

            Aussi, tu peux initialiser les variables lors de leur déclaration, pour des questions de lisibilité et de maintenance comme disent déjà mais VDD

            -
            Edité par romantik 22 mars 2019 à 10:37:48

            • Partager sur Facebook
            • Partager sur Twitter
            Dream on, Dream on, Dream until your dream comes true
              22 mars 2019 à 15:02:13

              La bonne solution est découpler les deux notions

              • état appuyé/relaché (on/off)
              • HIGH/LOW
              bool  A = digitalRead(...) == HIGH;   // pour un pull down
              bool  B = digitalRead(...) == LOW;    // pour pull up  
              ....
              
              if (A && B) {   // si les deux boutons sont appuyés
                ...
              }

              Mieux, deux classes PullUpButton, PullDownButton

              class PullDownButton {
              
                  int m_pin;
              
              public:
                  PullDownButton(int pin) {
                     m_pin = pin;
                  }
                  void setup() {
                     inputMode(m_pin, INPUT);
                  }
                  boolean is_on() {
                     return digitalRead(m_pin) == HIGH;
                  }
              };
                     

              et hop

              PulldownButton poussoir(12);
              
              
              void setup() {
                  poussoir.setup();
                  ...
              }
              
              void loop() {
                 if (poussoir.is_on()) {
                      ...
                 }
                ..
              }
              


              (et je vous passe la classe abstraite pour factoriser le code des deux types de boutons...)


              PS: en fait il ne faut pas 5 ans pour avoir du mal à remettre le nez dans un code où on a mis des noms de variables à la con. C'est plutot 5 jours, pour peu qu'on ait bossé sérieusement sur autre chose entretemps.

              -
              Edité par michelbillaud 22 mars 2019 à 15:05:53

              • Partager sur Facebook
              • Partager sur Twitter

              Opérateurs logiques

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown