capturer un champ 'caractère' d'une trame nmea avec tinygps++

Bonjour à tous,

Dans un projet de répétiteur des données ‘vent’ par un arduino vers un écran oled, je ne sais pas comment capturer dans une variable la direction du vent, figurée par ‘L’ (left) ou ‘R’ (right) à la position 2 de la trame $IIVWR provenant d’un capteur de tête de mat Advansea S400. Grâce à la bibliothèque TinyGPS++, il m’est facile de récupérer les valeurs numériques (direction, force du vent), mais je n’arrive pas à faire changer mon affichage en fonction de la direction du vent. Le code complet:

/*Pour ne pas consommer de mémoire, j'évite d'utiliser un port virtuel:
  le téléversement sera donc fait, gps déconnecté*/

#include <TinyGPS++.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display;
// The TinyGPS++ object
TinyGPSPlus gps;


TinyGPSCustom ang(gps, "IIVWR", 1); // $IIVWR sentence, 1th element
TinyGPSCustom dir(gps, "IIVWR", 2); // $IIVWR sentence, 2th element

void setup() 
{
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialise avec l'adresse I2C addr 0x3C 
  Serial.begin(4800);	// à adapter en fonction du gps.
   
}

void loop() 
{
  
    if (ang.isUpdated() )
  
  {
  
 
 display.clearDisplay();
   display.setTextSize(2);
  display.setTextColor(BLACK, WHITE); // 'inverted' text
  display.setCursor(0,0);
  display.println(" Ang.Vent "); 
  display.setTextSize(3);
  display.setCursor(25,30);
  display.setTextColor(WHITE);
  if (dir.value()=='L')		//si le vent vient de Babord!)
  {
  display.print("-");display.println(ang.value()); // le signe - est placé à gauche de la valeur en angle
 
  }
  else
  {
    display.print(ang.value());display.println("-"); // le signe - est placé à droite de la valeur en angle
   
  }
    
  
  display.display();

  }

  while (Serial.available() > 0)
    gps.encode(Serial.read());
}

A l’execution du programme, j’ai bien les valeurs numériques sur mon écran oled, mais l’affichage ne change pas lorsque dir.value()==‘L’: pour un angle de 45° tribord, l’affichage sera :" 45- " et pour un angle de 45 babord, l’affichage devrait être "-45 ". Si jamais un érudit en c++ y voit une erreur, merci beaucoup de me le signaler.

Quel est le prototype de la fonction TinyGPSCustom::value() ? renvoie-t-elle bien un char ? (regarde dans le fichier TinyGPS++.h)

Merci Biggil pour ta rapide réponse, mais je ne trouve pas le prototype de la fonction TinyGPS++ dans l'entête de la librairie! Les seules références que je trouve pour TinyGpsCustom sont les suivantes:

 // custom element support
  friend class TinyGPSCustom;
  TinyGPSCustom *customElts;
  TinyGPSCustom *customCandidates;
  void insertCustom(TinyGPSCustom *pElt, const char *sentenceName, int index);

Je parle de 'caractère', car la chaine nmea $IIVWR renvoie soit un 'R', soit un 'L' à la deuxième position lorsqu'on l'édite, en fonction de la direction apparente du vent (tribord ou babord). Lorsque j'envoie directement ce caractère à l'écran oled,(display.println(dir.value()), je retrouve bien ce caractère à l'affichage, mais lorsque je le capture dans une variable char et que j'envoie cette variable à l'écran, j'ai un résultat abérant. Mon but est d'arriver à mettre cette lettre dans une condition pour changer l'affichage en fonction de sa valeur. Encore merci de l'intérêt que tu portes à mon petit problème Cordialement

je suppose que ce que tu appelles "entête de la librairie" est le fichier TinyGPS++.h ? Nécessairement, la classe TinyGPSCustom est définie quelque part ! Peut-être que le fichier TinyGPS++.h contient lui-même des #include, auquel cas il faut chercher dans ces fichiers inclus. Utilise un outil de recherche de chaines de caractères dans les fichiers d'une arborescence.

Ton problème est que TinyGPSCustom::value() ne renvoie pas l'information sous la forme que tu attends.

Mes recherches dans TinyGPS.h me donnent:

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; }

Cela semble vouloir dire que TinyGPSCustom::value() devrait me renvoyer une valeur en const char *?? Je suis débutant en C et ces lignes me parlent peu!!(pas encore assez, malheureusement!). Toujours est il que, si je peux imprimer cette valeur par un display.println(dir.value()), il devrait être possible de la capturer dans une variable qui pourrait faire partie d'un test conditionnel par la suite!! Lors de mes essais, j'ai essayé les différents types de variables que je connais(bool,byte, int, double,float,char,String e.t.c, mais je n'arrive à rien. Peut être une question de pointeurs, mais là, je n'en suis qu'aux balbutiements!!! Je serais très reconnaissant à qui pourra me donner une piste exploitable par un débutant qui ne demande qu'à devenir un peu moins ignare.

Je donne ici la solution à ce problème qui m'a été donnée sur un autre forum, pour que ce sujet n'ait pas été ouvert pour rien et qu'il serve à tous les usagers. Au lieu de m'entêter à vouloir passer par une variable, j'aurais du penser à comparer directement le retour de la fonction dir.value() avec la chaine que j'attendais grâce à strcmp:

if strcmp(dir.value(),"L"==0)
{
alors...
}

Voilà, et encore merci pour votre aide.

OK, c'est bien que ça marche, mais je te conseille cependant d'étudier un peu les chaînes de caractères en C (const char*) ça te sera extrêment utile...