IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

MySensors, fonctions et (suspens) POINTEURS !


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    Par défaut MySensors, fonctions et (suspens) POINTEURS !
    Bonjour à tous.
    J'aimerais réaliser un code qui me permette d'ouvrir une porte à distance à l'aide de la bibliothèque MySensors.

    J'ai donc un code plutôt moche qui fonctionne, mais j'aimerais le rendre plus optimisé et plus lisible.
    J'ai donc ceci maintenant :
    Dans mon fichier "main.ino" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <MySensors.h>
    #include "Gestion_Porte.hpp"
     
    void receive(const MyMessage &message) // Lors de réception d'un message.
    {
    	if (message.sensor == ID_GESTION_PORTE) // Si c'est message du noeud 0 (gestion de la porte) :
    	{
    		if (message.getBool())
    			Ouverture_Porte(&debugMessage, &etatPorteMessage);
    		else
    			Fermeture_Porte(&debugMessage, &etatPorteMessage);
     
    		delay(10);
    	}
    }

    et dans un fichier Gestion_Porte.hpp j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifndef GESTIONPORTE_HPP
        #define GESTIONPORTE_HPP
     
        #include <Arduino.h>
        #include <MySensors.h>
     
        void Ouverture_Porte(MyMessage *pDebugMessage, MyMessage *pEtatPorteMessage);
        void Fermeture_Porte(MyMessage *pDebugMessage, MyMessage *pEtatPorteMessage);
     
    #endif
    Dans le fichier Gestion_Porte.ino :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    void Ouverture_Porte(MyMessage *pDebugMessage, MyMessage *pEtatPorteMessage)
    {
        unsigned char ouvertureOk = 0;
     
        pDebugMessage->set("Ouverture de la porte");
        send(*pDebugMessage);
     
        if (digitalRead(PIN_FDC_OPEN)) // Si le détecteur de fin de course ouverture n'est pas actif, alors :
        {
            uint64_t timeCount = millis();
     
            digitalWrite(PIN_RELAY_PORTE,HIGH); // Alim 12V pour moteur.
            delay(20);
     
            ledcAttachPin(PIN_DRIVER_IN1, 0); // Attache la pin PIN_DRIVER_IN1 au canal pwm N°0 configuré ci-après.
    	ledcWrite(0, 250); // Initialise le canal pwm 0 (voir setup()) à un signal pwm de 254 (= 1 logique).
    	digitalWrite(PIN_DRIVER_IN2, LOW);
     
            while (digitalRead(PIN_FDC_OPEN) && ouvertureOk != 2) // Tant que le fin de course ouverture n'est pas actif :
            {
                if (millis() - timeCount > DELAY_OUVERTURE) // Si on est dans cette boucle plus longtemps que DELAY_OUVERTURE, alors :
                {
                    ouvertureOk = 2; // Valeur 2 = erreur.
                    pDebugMessage->set("Porte bloquee");
                }
     
                delay(2);
            } 
     
            ledcWrite(0, 0); // Met la vitesse du moteur à 0.
            ledcDetachPin(PIN_DRIVER_IN1); // Detache la pin PIN_DRIVER_IN1 du canal pwm N°0.
            digitalWrite(PIN_RELAY_PORTE,LOW); // Coupe l'alim 12V.
            //pinMode(PIN_DRIVER_IN2, INPUT);        
        }
     
        if(!digitalRead(PIN_FDC_OPEN)) // Si le détecteur de fin de course ouverture est actif,
        {
            ouvertureOk = 1; // Valeur 1 = Ouvert.
            pDebugMessage->set("Porte ouverte");
        }
     
        pEtatPorteMessage->set(ouvertureOk); // ouvertureOK = soit 1 soit 2.
        send(*pDebugMessage);
        send(*pEtatPorteMessage);
    }

    Je n'arrive pas à le compiler et j'ai ce message d'erreur :

    c:/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio\build\ESP32\src\main.cpp.o:C:\usr\Bureau\Emeteur_Recepteur RF24 ESP32 (Poulailler)/.pio/libdeps/ESP32/MySensors/core/MyTransport.cpp:46: multiple definition of `_transportReady_cb'; .pio\build\ESP32\src\Gestion_Porte.cpp.o:C:\usr\OneDrive\Bureau\Emeteur_Recepteur RF24 ESP32 (Poulailler)/.pio/libdeps/ESP32/MySensors/core/MyTransport.cpp:46: first defined here
    c:/usr/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio\build\ESP32\src\main.cpp.o: in function `stReadyTransition()':
    et tout plein de messages de la sorte.

    Je crois comprendre que le problème viendrait du fait que j'ai le
    #include <MySensors>
    dans le main et le Gestion_Porte mais du coup je ne comprends pas comment faire avec les pointeurs dans mon fichier Gestion_Porte.

    Si quelqu'un peut m'aider ce sera avec plaisir

    Merci.

  2. #2
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut
    Bonjour,

    Un code plus complet serait plus utile. Par exemple, les messages parlent d'une ligne 46 impossible à localiser dans des fragments de code.

    En outre, les fragments devraient être constitués de blocs complets. Le premier extrait n'a pas de } de fin. Le lecteur ne sait donc pas si il y a encore du code qui prolonge cette fonction.

    Pour la fonction d'ouverture, il me semble que la toute première ligne devrait être un test de la butée d'ouverture ne serait-ce que pour éviter d'envoyer un message d'ouverture indu.

    Salutations

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    Par défaut
    Bonjour.
    Effectivement j'avais oublié l'accolade de fin du premier bloc !

    Pour ce qui est du test il est bien présent en ligne 8 (3eme code)

    Et pour la ligne 46, ça fait partie de la bibliothèque MySensors du coup j'ai pas jugé utile de vous en faire part ne sachant pas trop à quoi elle est utile ni quel code poster pour la bomme compréhension totale, et surtout, si je mets mon code en entier dans le main (sans pointeurs vers ailleurs) ça fonctionne, mais c'est pas joli, c'est foutoir et pas optimisable, mais confirme bien que le souci vient de ma façon d'utiliser les pointeurs je suppose.

  4. #4
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut
    Bonjour,

    Oui le test est présent, mais après l'envoi d'un message qui annonce l'ouverture de la porte même si celle-ci est déjà ouverte. Je proposerais un code plutôt de ce type (non testé bien sûr ).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    void Ouverture_Porte(MyMessage *pDebugMessage, MyMessage *pEtatPorteMessage) {
       if(! digitalRead(PIN_FDC_OPEN)) return;       // Déjà ouverte
       pDebugMessage->set("Ouverture de la porte");
       send(*pDebugMessage);
       uint64_t T_start = millis();
       digitalWrite(PIN_RELAY_PORTE, HIGH);          // Activer le 12 V moteur
       delay(20);
       ledcAttachPin(PIN_DRIVER_IN1, 0);             // Attache PIN_DRIVER_IN1 au canal pwm 0
       ledcWrite(0, 250);                            // Vitesse du moteur maximale (presque)
       digitalWrite(PIN_DRIVER_IN2, LOW);
       while(digitalRead(PIN_FDC_OPEN) && (millis() - T_start < DELAY_OUVERTURE)) delay(2);
       ledcWrite(0, 0);                              // Vitesse du moteur à 0
       ledcDetachPin(PIN_DRIVER_IN1);                // Detache PIN_DRIVER_IN1 du canal pwm 0
       digitalWrite(PIN_RELAY_PORTE, LOW);           // Désactiver le 12 V moteur
       if(digitalRead(PIN_FDC_OPEN)) {
          pDebugMessage->set("Porte bloquee");	
          pEtatPorteMessage->set(2);
       }
       else {
          pDebugMessage->set("Porte ouverte");
          pEtatPorteMessage->set(1)
       }
       send(*pDebugMessage);
       send(*pEtatPorteMessage);
    }
    Salutations

  5. #5
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 75
    Par défaut
    Exact. Je ne pense pas souvent à la commande "return" dans un void...

    Mais mon souci est toujours présent et la compilation ne fonctionne pas.
    Je peux éventuellement poster le code complet sur github si ça peut aider a m'aider

  6. #6
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut
    Bonjour,

    Le #include <MySensors.h> du main ne sert à rien car il existe aussi dans le fichier Gestion_Porte.hpp.

    Mais normalement cela n'a pas d'impact car il doit être protégé de toute re-déclaration (grace à une compilation conditionnelle comme pour Gestion_Porte.hpp).

    Si ce n'est pas le cas, il y aurait effectivement de multiples re-déclarations des fonctions de MySensors.h. Pour régler le problème, Il suffirait alors de ne garder qu'une inclusion, la première.

    Salutations

Discussions similaires

  1. Petits problème de fonction et de pointeur
    Par markipoli dans le forum Débuter
    Réponses: 3
    Dernier message: 19/11/2007, 17h42
  2. Apeller fonction DLL avec pointeurs en Delphi
    Par dacid dans le forum Delphi
    Réponses: 2
    Dernier message: 11/08/2006, 12h11
  3. [WD10] Utiliser une fonction OpenGL avec pointeur (int)
    Par Zoons dans le forum WinDev
    Réponses: 3
    Dernier message: 06/07/2006, 16h38
  4. Fonction retournant un pointeur
    Par Le Furet dans le forum C
    Réponses: 8
    Dernier message: 25/09/2005, 18h54
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo