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 :

Capturer dans une variable un champ 'caractère' d'une trame nmea avec TinyGPSCustom


Sujet :

Arduino

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Passionné
    Inscrit en
    Janvier 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Passionné
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Capturer dans une variable un champ 'caractère' d'une trame nmea avec TinyGPSCustom
    Bonjour amis marins et programmeurs,

    Je suis passionné de mer et d'informatique, et vu les coûts exorbitants du matériel électronique chez les shipchandler, J'ai choisi de tenter de faire un maximum de choses avec arduino et/ou Raspberry Pi.
    Jusqu'à présent, le Raspberry me sert de lecteur de carte avec enregistrement du journal de bord automatique et dispositif de sécurité en cas d'homme à la mer (Grand merci aux développeurs de OpenPlotter!!)
    L'arduino devrait me permettre de commander des petits écrans oled pour me servir de répétiteurs. J'ai déjà réalisé un speedomètre avec un petit module GPS Ublox qui fonctionne parfaitement, et je suis en train de faire un répétiteur qui me donnera la force et la direction du vent couplé à une girouette anémomètre Advansea.
    Mon problème est le suivant:
    Je capte par le port serie de mon arduino nano, une trame nmea VWR provenant de ma gireouette anémomètre, qui comporte la direction du vent de 0 à 180° (position 1), son orientation (Tribord ou Babord représentés par R(pour Right) et L (pour Left) en position 2, et sa force en noeuds en position 3. La biblothèque TinyGPS++ me permet d'isoler ces 3 éléments de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TinyGPSCustom ang(gps, "IIVWR", 1); // $IIVWR sentence, 1th element
    TinyGPSCustom dir(gps, "IIVWR", 2); // $IIVWR sentence, 2th element
    TinyGPSCustom vit(gps, "IIVWR", 3); // $IIVWR sentence, 3th element
    Je peux afficher ces 3 nouvelles valeurs par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    println (ang.value());
    println (dir.value());
    println(ang.value());
    Mais pour que l'affichage change d'aspect selon que le vent vienne de Babord ou de Tribord, il me faudrait placer la valeur de dir.value() dans une variable qui me servirait à la comparer dans un test (par exemple:
    if dir.value()=='L' alors...
    if dir.value()=='R' alors....
    Mais ce test ne marche pas, car dir.value() n'est pas un 'char'. J'ai essayé avec d'autres variables, mais aucune n'arrive à capturer cette valeur.
    Je m'interroge donc sur la façon de pouvoir comparer cette valeur pour influencer le comportement de l'affichage!!
    Je peux parfaitement imprimer ces sorties ang.value(), dir.value() et vit.value(), mais je n'arrive pas à les placer dans une variable!!
    Je suis preneur de toute piste qui me permettrait de finaliser ce projet.
    Merci d'avance pour toute suggestion.

  2. #2
    Membre actif Avatar de cedd70
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Mars 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 154
    Points : 263
    Points
    263
    Par défaut
    Salut,

    difficile de te répondre sans savoir le type valeurs retournées (exemple donné pour un entier)

    Regarde du coté de la fonction sprintf pour convertir des formats

    pourquoi pas aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (dir.value() > 0) 
    // R
    else if (dir.value() < 0)
     // L
    else
    // tout droit
    Si ton capteur est correctement initialisé

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Passionné
    Inscrit en
    Janvier 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Passionné
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Merci pour la réponse de cedd70, mais le problème est justement que je ne connais pas le type de la valeur retournée par dir.value() qui provient de la bibliothèque TinyGPS;
    Mon capteur est bien initialisé puisque je capte la trame nmea suivante:
    $IIVWR,26.7,R,10.7,N,5.5,M,19.8,K-7C
    Après la deuxième virgule de ma trame, je retrouve bien un 'R' qui signifie que le vent vient de tribord.
    J'extraie donc cette valeur grâce à TintyGPSCustom de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TinyGPSCustom dir(gps,IIVWR,2);
    lorsque je fais print (dir.value()), j'obtiens soit un 'L' si le vent vient de babord, soit un 'R' si le vent vient de tribord. La lettre s'affiche correctement sur mon écran oled!!
    Mais si je veux la capturer dans une variable, ça ne marche pas. J'imagine que si je peux imprimer cette sortie, je devrais pouvoir l'enregistrer dans une variable?? Oui, mais comment??
    J'ai essayé avec toutes sortes de variables (int, double, float, char, String,e.t.c..) mais aucun de ces choix n'est le bon!!
    Le plus vraissemblable à mon sens serait un 'char', mais là encore, lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (dir.value()=='L')
    	Serial.print("Gauche");
    else if(dir.value()=='R')
    	Serial.print("Droite");
    else
    Serial.print("tout droit")
    mon programme n'en tient pas compte (comme si mon évaluation n'était pas conforme.)
    Une idée?

  4. #4
    Membre actif Avatar de cedd70
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Mars 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 154
    Points : 263
    Points
    263
    Par défaut
    Tu utilise TinyGPS++ ? comme lib ?

    Si oui voila la class
    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
     
    class TinyGPSCustom
    {
    public:
       TinyGPSCustom() {};
       TinyGPSCustom(TinyGPSPlus &gps, const char *sentenceName, int termNumber);
       void begin(TinyGPSPlus &gps, const char *_sentenceName, int _termNumber);
     
       bool isUpdated() const  { return updated; }
       bool isValid() const    { return valid; }
       uint32_t age() const    { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
       const char *value()     { updated = false; return buffer; }
     
    private:
       void commit();
       void set(const char *term);
     
       char stagingBuffer[_GPS_MAX_FIELD_SIZE + 1];
       char buffer[_GPS_MAX_FIELD_SIZE + 1];
       unsigned long lastCommitTime;
       bool valid, updated;
       const char *sentenceName;
       int termNumber;
       friend class TinyGPSPlus;
       TinyGPSCustom *next;
    };

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (strcmp(dir.value(), "L") == 0) 
    {
               do something I want...
    };

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Passionné
    Inscrit en
    Janvier 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Passionné
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Merci beaucoup
    Merci infiniment pour ta solution qui marche à merveille et va me permettre de finir mon projet grâce à toi!!
    Vive l'entraide et la communauté!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Des variables de champ dans du texte lui meme appelé d'une variable de champ
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/05/2017, 21h11
  2. [V8] affecter à une variable char le contenu d'une variable many2one xml
    Par audreyelm dans le forum Odoo (ex-OpenERP)
    Réponses: 4
    Dernier message: 14/10/2015, 09h30
  3. Réponses: 9
    Dernier message: 05/11/2008, 09h37
  4. Réponses: 9
    Dernier message: 21/02/2007, 13h20
  5. Réponses: 3
    Dernier message: 14/03/2006, 14h43

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