Partage
  • Partager sur Facebook
  • Partager sur Twitter

Retour bouton étrange en état initial

    17 mars 2020 à 23:27:00

    Hello, 

    J'ai un problème étrange avec les résultats de mon code : 

    • Lorsque je lance mon programme je ne suis pas censé avoir quoi que ce soit dans le moniteur série or j'ai le retour Prise des mesures
    • J'arrive à résoudre le problème avec un delay(1);
    • Quand j'ajoute mon capteur (en commentaire dans l'exemple) le delay(1) ne change rien et je retrouve dès le début l'affichage de Prise des mesures

    Pourtant les boutons fonctionnent très bien. 

    Avez-vous une idée de la source du problème ? 

    Merci. 

    //#include <Wire.h>
    //#include <Adafruit_Sensor.h>
    //#include <Adafruit_BME280.h>
    
    //Adafruit_BME280 capteur;
    
    boolean etat_mesure=0;
    boolean etat_envois=0;
    byte pin_bouton_mesure=10;
    byte pin_bouton_envois=11;
    
    void setup()
    {
        Serial.begin(9600); 
        //capteur.begin(0x76);
        pinMode(pin_bouton_mesure,INPUT_PULLUP);
        pinMode(pin_bouton_envois,INPUT_PULLUP);
    }   
    
    void loop()
    {
    
        etat_envois=bouton(pin_bouton_envois, etat_envois);
        //delay(1);
        etat_mesure=bouton(pin_bouton_mesure, etat_mesure);
        
        if (etat_mesure==1) //Si bouton mesure appuyé 
        {
          //Serial.println(capteur.readTemperature());
          Serial.println("Prise des mesures");
        }
    
        if (etat_envois==1) //Si bouton envois appuyé
        {
          Serial.println("Envois de données");
        }
    
        delay(10);
    }
    
    
    byte bouton(byte pin, boolean etat)
    {
      if (digitalRead(pin)==0)
        {
          if(etat==0)
          {
            etat=1;
            //Serial.println("On");
          }
          
          else
          {
            etat=0;
            //Serial.println("Off");
          }
          
          while(digitalRead(pin) == 0)
          {
            etat=etat;
          }
          
          return(etat);
          
        }
    }
    



    -
    Edité par Gantilool 17 mars 2020 à 23:28:18

    • Partager sur Facebook
    • Partager sur Twitter
      18 mars 2020 à 0:20:01

      Pourquoi ta fonction bouton n'est pas de type boolean?
      • Partager sur Facebook
      • Partager sur Twitter
        18 mars 2020 à 9:20:29

        Quand la fonction est de type boolean il devient impossible de changer l'état _mesure. En revanche etat_envois fonctionne très bien. 

        Je viens de virer la fonction pour voir si le reste de mon code est ok et tout marche a merveille. Donc je pense que j'ai un problème uniquement avec la fonction : 

        #include <Wire.h>
        #include <Adafruit_Sensor.h>
        #include <Adafruit_BME280.h>
        
        Adafruit_BME280 capteur;
        
        boolean etat_mesure=0;
        boolean etat_envois=0;
        byte pin_bouton_mesure=10;
        byte pin_bouton_envois=11;
        
        void setup()
        {
            Serial.begin(9600); 
            capteur.begin(0x76);
            pinMode(pin_bouton_mesure,INPUT_PULLUP);
            pinMode(pin_bouton_envois,INPUT_PULLUP);
        }   
        
        void loop()
        {
        
        if (digitalRead(pin_bouton_envois)==0)
            {
              if(etat_envois==0)
              {
                etat_envois=1;
              }
              
              else
              {
                etat_envois=0;
              }
              
              while(digitalRead(pin_bouton_envois) == 0)
              {
                etat_envois=etat_envois;
              }
            }
        
          if (digitalRead(pin_bouton_mesure)==0)
            {
              if(etat_mesure==0)
              {
                etat_mesure=1;
              }
              
              else
              {
                etat_mesure=0;
              }
              
              while(digitalRead(pin_bouton_mesure) == 0)
              {
                etat_mesure=etat_mesure;
              }
              
              return(etat_mesure);
              
            }
        
        
        
            
            if (etat_mesure==1) //Si bouton mesure appuyé 
            {
              Serial.println(capteur.readTemperature());
              Serial.println("Prise des mesures");
            }
        
            if (etat_envois==1) //Si bouton envois appuyé
            {
              Serial.println("Envois de données");
            }
        
            delay(10);
            
        }
        
        



        • Partager sur Facebook
        • Partager sur Twitter
          18 mars 2020 à 12:09:52

          Mais pourquoi veux-tu mettre des valeurs numériques à des booléens? Les seules 2 valeurs possibles pour un booléen sont true et false, pas 1 et 0.
          • Partager sur Facebook
          • Partager sur Twitter
            19 mars 2020 à 13:25:51

            Dans ta fonction bouton, tu viens lire l'état d'une pin avec digitalRead pour changer d'état ta variable lorsque le bouton est enfoncé.

            Jusque là, rien de bien méchant.

            Le problème va se poser quand le bouton n'est pas enfoncé car dans ce cas de figure, le code ne rentre pas dans le if et la fonction ne fait strictement rien, pas même de return.

            Vu que la fonction ne retourne rien, tu vas avoir un beau comportement indéterminé ;)

            Voici le code corrigé :

            boolean bouton(byte pin, boolean etat) {
            
            	// Si le bouton est enfoncé :
            	if (digitalRead(pin)==0) {
            		
            		// Alors on inverse l'état (avec l'opérateur point d'exclamation)
            		etat = !etat;
            		
            		// Puis on attend le relachement du bouton
            		while (digitalRead(pin) == 0) {
            			// Aucun code ici
            			// (dès que la pin passera à '1', on sortira du while et ce sera la fin de l'attente)
            		}
            		
            	}
            	
            	// Et pour finir, on retourne l'état dans tous les cas
            	// (que le bouton ai été enfoncé ou non, on fait un return !)
            	return etat;
            	
            }



            • Partager sur Facebook
            • Partager sur Twitter
              24 mars 2020 à 19:32:10

              Merci, c'est beaucoup mieux comme ça. 


              lorrio a écrit:

              Dans ta fonction bouton, tu viens lire l'état d'une pin avec digitalRead pour changer d'état ta variable lorsque le bouton est enfoncé.

              Jusque là, rien de bien méchant.

              Le problème va se poser quand le bouton n'est pas enfoncé car dans ce cas de figure, le code ne rentre pas dans le if et la fonction ne fait strictement rien, pas même de return.

              Vu que la fonction ne retourne rien, tu vas avoir un beau comportement indéterminé ;)

              Voici le code corrigé :

              boolean bouton(byte pin, boolean etat) {
              
              	// Si le bouton est enfoncé :
              	if (digitalRead(pin)==0) {
              		
              		// Alors on inverse l'état (avec l'opérateur point d'exclamation)
              		etat = !etat;
              		
              		// Puis on attend le relachement du bouton
              		while (digitalRead(pin) == 0) {
              			// Aucun code ici
              			// (dès que la pin passera à '1', on sortira du while et ce sera la fin de l'attente)
              		}
              		
              	}
              	
              	// Et pour finir, on retourne l'état dans tous les cas
              	// (que le bouton ai été enfoncé ou non, on fait un return !)
              	return etat;
              	
              }





              • Partager sur Facebook
              • Partager sur Twitter

              Retour bouton étrange en état initial

              × 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