Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Faire une fonction avec une variable en argument

Pour une LED dont l'état bascule avec le BP correspondant

Sujet résolu
    6 août 2012 à 3:30:21

    Bonjour Bonjour!

    J'ai une petite question à propos de code (cela aurait d'ailleurs sans doute été plus approprié de mettre cette question dans le forum info, mais je pense que la réponse servira plus aux amis Arduinoien qu'aux informaticiens)

    Pour faire simple :
    J'ai 7 boutons poussoirs, chacun servant à commander une LED, quand j'appuie sur sur le bp1 il allume la led1 correspondante, quand je rappuie il l'éteint, etc...
    Le code est relativement simple :

    //on créé 2 variables
    boolean vbp1=0; //qui enregistrera la valeur du BP1 en temps réel
    boolean mvbp1=0; //pour mettre en mémoire la valeur du BP1 pour détecter un changement
    
    void led1() //décision d'allumer led1 ou non
    {
    vbp1= digitalRead(bp1); //Lecture de l'état du BP
    if ((vbp1 != mvbp1)&&(vbp1 == LOW)) //si on appuie sur le BP1
    {
    varled1= !varled1; //on bascule la variable qui définira l'état de la led 1
    }
    mvbp1=vbp1;
    
    switch (varled1) //en fonction de là où en est varled1 on l'allume ou pas
    {
    	case 0:
    	digitalWrite(led1,LOW);
    	break;
    	case 1:
    	digitalWrite(led1,HIGH);
    	break;
    }
    }
    


    Maintenant la question :
    Est ce que j'ai besoin d'écrire ce code 7 fois? en changeant respectivement 1 par 0,2,3,4,5,6,7, ce qui serait pénible et inintéressant, mais pas insurmontable ^^

    Où est ce qu'on peut faire une fonction du genre :

    void gerer_la_led(int X) //décision d'allumer led1 ou non
    {
    vbpX= digitalRead(bpX); //Lecture de l'état du BP
    if ((vbpX != mvbpX)&&(vbpX == LOW)) //si on appuie sur le BP
    {
    varledX= !varledX; //on bascule la variable qui définira l'état de la led
    }
    mvbpX=vbpX;
    
    switch (varledX) //en fonction de là où en est varled1 on l'allume ou pas
    {
    	case 0:
    	digitalWrite(ledX,LOW);
    	break;
    	case 1:
    	digitalWrite(ledX,HIGH);
    	break;
    }
    }
    

    Ou X serait un argument d'entrée? et dans mon programme j'appelle void gerer_la_led(1), void gerer_la_led(2), etc...

    Je n'ai pas trouvé si c'était possible dans le cours, et je me demande si je ne suis pas en train d'essayer de faire du C orienté objet?
    • Partager sur Facebook
    • Partager sur Twitter
      6 août 2012 à 8:34:39

      Tu pourrait faire 2 tableaux :
      char led[7] = {/*pin de tes led*/};
      char Bp[7] = {/*pin de tes Bp*/};
      puis une boucle for et voilà !

      PS : pour ton code essaye ça :
      //on créé 2 variables
      boolean vbp1=0; //qui enregistrera la valeur du BP1 en temps réel
      boolean mvbp1=0; //pour mettre en mémoire la valeur du BP1 pour détecter un changement
      
      void led1() //décision d'allumer led1 ou non
      {
        vbp1= digitalRead(bp1); //Lecture de l'état du BP
        if ((vbp1 != mvbp1)&&(vbp1 == LOW)) //si on appuie sur le BP1
        {
          varled1= !varled1; //on bascule la variable qui définira l'état de la led 1
        }
        mvbp1=vbp1;
        digitalWrite(led1,varled1);
      }
      
      • Partager sur Facebook
      • Partager sur Twitter
      2b||!2b   sqrt(4b²)
      Anonyme
        6 août 2012 à 9:57:21

        J'aurai fait un OU avec des diodes que j'aurai injecté sur une patte d'interruption.

        Dans la fonction d'interruption, tu met a jour une variable avec les valeurs de tes boutons en faisant un mask sur le registre PINx correspondant aux entrées utilisé.

        Puis soit dans ton loop() soit dans ton interruption tu appel led1() en fonction de la variable .
        • Partager sur Facebook
        • Partager sur Twitter
          6 août 2012 à 14:28:11

          Je rejoins diode, mettre les numéros des broches des LED dans une tableau permettera de rendre le code plus générique
          • Partager sur Facebook
          • Partager sur Twitter
            7 août 2012 à 8:02:29

            Citation : diode

            Tu pourrait faire 2 tableaux :
            char led[7] = {/*pin de tes led*/};
            char Bp[7] = {/*pin de tes Bp*/};
            puis une boucle for et voilà !

            PS : pour ton code essaye ça



            Effectivement voilà une bonne idée!! Je vais essayer de mettre ça en place, merci!
            Et je vais aussi essayer le code que tu me proposes sans le switch!

            Citation : thelme

            J'aurai fait un OU avec des diodes que j'aurai injecté sur une patte d'interruption.

            Dans la fonction d'interruption, tu met a jour une variable avec les valeurs de tes boutons en faisant un mask sur le registre PINx correspondant aux entrées utilisé.

            Puis soit dans ton loop() soit dans ton interruption tu appel led1() en fonction de la variable .


            Je te remercie aussi pour ta réponse, mais n'ayant pas accès à mon arduino en ce moment, je préfère me lancer dans un code plus simple, pour avoir un minimum de modif à faire quand je pourrais tester tout ça!
            Par contre je garde çà dans un coin! (et surement que j'aurais quelques questions quand j'essayerais ça ^^)
            • Partager sur Facebook
            • Partager sur Twitter

            [Arduino] Faire une fonction avec une variable en argument

            × 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