Partage
  • Partager sur Facebook
  • Partager sur Twitter

Variable qui change de valeur sans raison

Variable qui change de valeur sans raison

Sujet résolu
    26 juin 2020 à 22:08:41

    Bonjour, je travaille sur un programme de serrure électronique avec une puce RFID et un servomoteur. Pour cela j'utilise différents boutons pour allumer/éteindre le système, ouvrir la porte, activer/éteindre le son. Le problème vient du fait que dans ma fonction ouverture, durant l'affectation de la variable son, la variable se met sur une des deux valeurs mais juste après la variable (de la ligne 34 et la ligne 36 la valeur change par exemple), la valeur passe à 0 pour je ne sais quelle raison. Pourriez-vous m'aider ?

    #include <SPI.h>
    #include <MFRC522.h>
    #define SS_PIN 10
    #define RST_PIN 9
    MFRC522 mfrc522(SS_PIN, RST_PIN);
    char st[20];
    
    int buzzer = 8;      // pin du buzzer
    int bouton = 5; // bouton ouverture de la porte de l'intérieur
    int leo = 7;         //pin bouton changement de carte
    int o;               //  variable bouton changement de carte
    int onoffson = 2;     // bouton pour choisir si il y a du son/lumières
    int son;
    
    #include <Servo.h>
    Servo MS1;
    int PDS1 = 10;          // pin servomoteur
    
    
    void ouverture(){                    //ouverture de la porte
      digitalWrite(3, HIGH);
       bool etat_son = digitalRead(onoffson);        // on regarde l'état du bouton qui décide si le son est présent
      if(!etat_son){
        int son = 2;
      }
      else{
        int son = 1;
      }
      if(son == 1){                 
        tone(buzzer, 987.8, 150);         // bip bip bip biiiiiip
        delay(155);
        tone(buzzer, 987.8, 150);
        delay(155);
        tone(buzzer, 987.8, 150);
        delay(155);
        tone(buzzer, 987.8, 1000);
        delay(1005);
      }
      
        for(PDS1 = 10; PDS1 <= 110; PDS1++)   //ouverture de la porte (servomoteur)
        {
          MS1.write(PDS1);
          delay(15);
        }
        delay(1000);
        for(PDS1 = 110; PDS1 >= 10; PDS1--)    //fermeture de la porte
        {
          MS1.write(PDS1);
          delay(15);
        }
        digitalWrite(3, LOW);
    }
    
    
    void setup() {
      SPI.begin();
      mfrc522.PCD_Init();
      MS1.attach(6);
      MS1.write(PDS1);
      pinMode(bouton, INPUT_PULLUP);
      pinMode(leo, INPUT_PULLUP);
      pinMode(onoffson, INPUT_PULLUP);
      pinMode(3, OUTPUT);              // led bleu
      pinMode(4, OUTPUT);              // led rouge
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
    }
    
    void loop() {
      
      bool etat_leo = digitalRead(leo);     // on regarde quelle(s) carte(s) est/sont autorisée(s)
      if(!etat_leo){
        o = 2;
      }
      
      else{
        o = 1;
      }
      
      bool etat_bouton = digitalRead(bouton);          // on regarde si le bouton d'ouverture de la porte et appuyé
      if(!etat_bouton)
      {
        ouverture();                 // on ouvre la porte
      }
    
      if ( ! mfrc522.PICC_IsNewCardPresent())           // on regarde si la puce capte une carte
      {
        return;
      }
      if ( ! mfrc522.PICC_ReadCardSerial())
      {
        return;
      }
      String tag = ""; 
      byte caractere;
      for (byte i = 0; i<mfrc522.uid.size; i++)               // on enregistre l'UID de la carte
      {  
        tag.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
        tag.concat(String(mfrc522.uid.uidByte[i], HEX));
      }
      tag.toUpperCase();
    
      if(tag.substring(1) == "D0 8C 1E 1A")                  // si la carte est ok on ouvre
      {
        ouverture();
      }
    
      else if(o == 2){
        if(tag.substring(1) == "82 18 63 0E"){           // si la carte est connue et qu'elle est autorisée on ouvre
          ouverture();
        }
      }
    
      else{                                           // sinon la carte est inconnue donc on bip
        digitalWrite(4, HIGH);
         bool etat_son = digitalRead(onoffson);     // on regarde si le son est activé
      if(!etat_son){
        int son = 2;
      }
      else{
        int son = 1;
      }
        if(son == 1){
        for (int a = 1; a<4; a++){                // bip qui passe par différentes valeurs
          for(int i = 700; i <= 7000; i++)
          {
            tone(buzzer, i, 50);
          }
          for (int i = 7000; i >= 700; i--)
          {
            tone(buzzer, i, 50);
          }
        }
        }
        digitalWrite(4, LOW);
      }
      delay(100);
    }



    • Partager sur Facebook
    • Partager sur Twitter
      27 juin 2020 à 9:34:43

      Je pense que le problème vient du fait que tu as une variable globale son déclarée en ligne 13 (en principe elle doit être initialisée à 0).

      Sauf que tu redéclares en ligne 24 et en ligne 27 la variable sont et tu lui donnes une valeur.

      Ces valeurs ne sont accessibles qu'à l'intérieur du bloc d'accolades et elles sont inconnues de la variable son déclarée en ligne 13.

      Tu as le même problème en lignes 118 et 121.

      • Partager sur Facebook
      • Partager sur Twitter

      Le crayon la gomme et le papier sont les meilleurs outils du programmeur !

        27 juin 2020 à 13:43:34

        > tu as une variable globale son déclarée en ligne 13 (en principe elle doit être initialisée à 0).

        Une variable non initialisée à une valeur indéfinie.

        En configurant convenablement les avertissements du compilateur, celui-ci indique les problèmes soulevés par joel76: variable non utilisée et variable non initialisée. Le minimum vital est de compiler avec -Wall -Wextra et de réduire au maximum les variables globales.

        Dans tous les cas, cette variable son ne sert à rien et peut-être remplacé par if (etat_sont).

        Idem pour o qui n'est en fait qu'un bool basé sur etat_leo. Au passage un code cette forme:

          if(!etat_leo){
            o = 2;
          }
          
          else{
            o = 1;
          }
        

        peut s'écrire:

          o = etat_leo ? 1 : 2;

        Toute la transformation bizarre en chaîne de caractère pour faire une comparaison peut être remplacé par

        if (mfrc522.uid.size == 5) {
            // si la carte est ok on ouvre
            if (mfrc522.uid.uidByte[1] == 0xD0
             && mfrc522.uid.uidByte[2] == 0x8C
             && mfrc522.uid.uidByte[3] == 0x1E
             && mfrc522.uid.uidByte[4] == 0x1A
            ) {
                ouverture();
            }
            else if(o == 2){
                // si la carte est connue et qu'elle est autorisée on ouvre
                if (mfrc522.uid.uidByte[1] == 0x82
                 && mfrc522.uid.uidByte[2] == 0x18
                 && mfrc522.uid.uidByte[3] == 0x63
                 && mfrc522.uid.uidByte[4] == 0x0E
                ) {
                    ouverture();
                }
            }
        }
        

        On peut aussi faire une fonction qui récupère un tag pour simplifier les comparaisons

        uint32_t get_tag(uint8_t const* trame)
        {
          return trame[1] << 24) | (trame[2] << 16) | (trame[3] << 8) | trame[4];
        }
        
        if (get_tag(mfrc522.uid.uidByte) == 0xD08C1E1A)

        Et sinon, il y a un forum C++

        • Partager sur Facebook
        • Partager sur Twitter
          29 juin 2020 à 19:10:52

          Après avoir fait les modifications ça a fonctionné mercii. (désolé pour le temps de la réponse j'ai eu un problème et j'ai dû ressouder pas mal des composants du projet avant de pouvoir tester le nouveau code)

          Et en effet je ne suis pas très doué en programmation hardware vu que je n'ai pas vu de cours à ce sujet juste lu quelques fiches et regardé quelques vidéos.

          • Partager sur Facebook
          • Partager sur Twitter
            29 juin 2020 à 20:41:45

            Ce sont plus des problèmes de progammation C/C++ qu'autres choses !

            • Partager sur Facebook
            • Partager sur Twitter

            Le crayon la gomme et le papier sont les meilleurs outils du programmeur !

              29 juin 2020 à 21:08:30

              en fait c'est plutôt arduino donc je ne savais pas où le mettre dsl du coup je le mettrai en C++ la prochaine
              • Partager sur Facebook
              • Partager sur Twitter

              Variable qui change de valeur sans raison

              × 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