Partage
  • Partager sur Facebook
  • Partager sur Twitter

utilisation des classes c++ en arduino

Sujet résolu
    5 janvier 2013 à 17:14:51

    Bonjour

    Je rencontre un problème tout bête avec l'utilisation des classes en arduino.
    J'ai décidé, parce que cela me paraissait logique et puis parce que j'ai définit les pinMode() dans le constructeur de la classe, d'instancier celle-ci dans le setup().
    Sauf que bien évidemment, elles ne peuvent être par conséquent utilisés dans le loop().

    Je me suis dit par la suite que j'allai bêtement déplacer leur déclaration en début de code, comme ça leur portée sera globale. Sauf que je fais appel au constructeur et donc à différents pinMode() à l'extérieur du setup().

    Je n'arrive pas à trouver de solution. Ou peut-être qu'il ne faut tout simplement pas utiliser les pinMode() dans le constructeur et les définir avant?
    • Partager sur Facebook
    • Partager sur Twitter
      5 janvier 2013 à 19:04:53

      tu as quoi comme message d'erreur à la compilation ?
      Essai de faire un
      #include "arduino.h"
      

      ca inclut les trucs (constantes, déclarations...) du framework arduino, il est pas visible dans le sketch mais en fait est fait par défaut dans le "main"
      • Partager sur Facebook
      • Partager sur Twitter
        6 janvier 2013 à 9:08:10

        Sauf erreur il n'y a pas de souci de compilation.
        Les messages sont: MaClasse (ici f1 et f2) not declared in this scope dans le premier cas et du charabia interminable dans le deuxième. Le problème c'est que justement j'ai en arduino en quelque sorte deux main: loop() et setup().

        J'ai trouvé une solution plus ou moins potable en séparant le constructeur des pinMode() que j'ai regroupé dans une fonction init().
        //-----------------------------------------------------------
        typedef unsigned const int pin;
        class feu {
          public:
          feu(pin rouge,pin orange,pin vert);
          void halt();
          void go();
          void init();
          protected:
          pin r; pin o;pin v;
        };
        
        feu::feu(pin rouge,pin orange,pin vert):r(rouge),o(orange),v(vert)
        {};
        void feu::halt()
        {
           digitalWrite(o,LOW);
           //...
        };
        
        void feu::go()
        {
           //...
        };
        
        void feu::init()
        {pinMode(r,OUTPUT);pinMode(o,OUTPUT);pinMode(v,OUTPUT);
         digitalWrite(r,LOW);digitalWrite(o,HIGH;digitalWrite(v,HIGH);};
          
         //---------------------------------------------------------------
          feu f1(1,2,3)//pin à titre indicatif; 
          feu f2(4,5,6);
         //--------------------------------------------------------------- 
        void setup ()
        {
          f1.init();
          f2.init();
        };
        
        void loop ()
        {
          f1.go();
          delay(1000);
          f1.halt();
          delay(1000);
          f2.go();
          delay(1000);
          f2.halt();
          delay(1000);// les durées ne correspondent pas encore à l'exercice
        }
        

        C'est donc les lignes 31 et 32 qui me dérangent.
        A la base mon constructeur était
        feu::feu(pin rouge,pin orange,pin vert):r(rouge),o(orange),v(vert)
        {this->init();};
        

        Et mon setup:
        void setup ()
        {
        feu f1(1,2,3)//pin à titre indicatif; 
        feu f2(4,5,6);
        };
        

        Sauf que justement je ne pouvais déclarer mes instances f1 et f2 dans le setup() et les utiliser dans le loop() par après.
        • Partager sur Facebook
        • Partager sur Twitter
          6 janvier 2013 à 14:41:26

          (je-lis-pas-car-il-y-a-pas-de-balises-codes ... et ca me pique les yeux :p )
          • Partager sur Facebook
          • Partager sur Twitter
            6 janvier 2013 à 16:17:12

            Citation : Eskimon

            (je-lis-pas-car-il-y-a-pas-de-balises-codes ... et ca me pique les yeux :p )


            voilà qui est fait :-°
            • Partager sur Facebook
            • Partager sur Twitter
              6 janvier 2013 à 17:05:18

              Tu pourrais créer tes classes dans d'autres fichiers plutot que dans le corps du fichier principal Arduino (tu as l'air de connaitre le C++, donc créer ta classe dans un fichier .h et .cpp)
              • Partager sur Facebook
              • Partager sur Twitter
                6 janvier 2013 à 17:30:19

                Je veux bien mais cela ne résout pas mon problème.
                Celui-ci étant:
                Où doit-on instancier les objets (ici feu f1 et f2) ?
                En c++ classique cela s'effectue dans le main sauf qu'ici, je veux les initialiser dans le setup() et les utiliser dans le loop(), ce qui n'est pas possible de pars la protée de ces instances.
                Je trouve un peu "moche" d'écrire ces déclarations à l'extérieur de toute fonction.

                Ou alors la question pourrait être: Comment définir des objets dans le setup() de sorte qu'ils soient utilisables dans le loop() (portée générale)

                Concrètement toi tu initialises tes objets dans quelle partie ?
                • Partager sur Facebook
                • Partager sur Twitter
                  6 janvier 2013 à 18:20:18

                  C'est un des points 'faibles' du framework Arduino... il faut faire des variables globales :(
                  Par exemple :

                  #include "maClasse.h"
                  
                  MonObjet objet(4,5); //un objet qui utilise des paramètres dans son constructeurs
                  
                  void setup()
                  {
                      objet.initialisation(); //une méthode par exemple
                  }
                  
                  void loop()
                  {
                      objet.action(3); //une autre méthode
                  }
                  
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 janvier 2013 à 18:51:39

                    :D
                    Merci pour ta réponse.
                    Je vais donc me contenter de cette solution.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    utilisation des classes c++ en 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