Réception de données d'un capteur avec XBEE

Bonjour à tous !

J'essaie d'envoyer les données d'un capteur avec un module XBEE S1 à un autre XBEE avec une Arduino Uno et un Shield Seeds Studio V2.2 (avec les jumpers réglés sur 0 pour RX et 1 pour TX).

Doc du shield (version V2.0 du Shield)

Le capteur que j'utilise est l'IMU BNO055 que j'ai branché sur les pins A4 et A5 pour l'I2C.
Doc de la centrale inertielle

Le module XBEE est relié à mon PC et je lis les trames qu'il reçoit grâce au logiciel XCTU.

Voici le code que j'applique, j'utilise la librarie XBEE Arduino.

#include <Wire.h> //library I2C
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <utility/imumaths.h>
#include <XBee.h>
 
Adafruit_BNO055 bno = Adafruit_BNO055(); //sensor declaration

/* Sensor */

double theta; //axis X
double phi; //axis Y
double psi; //axis Z

/* Communication */
XBee xbee = XBee();
uint8_t sent[40]; //where i store my data to be sent
char hex[40]="Tilt : "; //to send
String convert=""; //for conversion to send
int i;

void setup() {

  Serial.begin(9600); //opening serial with 9600 baud

  /* Sensor Initialisation */
  if(!bno.begin())
  {
    Serial.println("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!");
    while(1);
  }  
  bno.setExtCrystalUse(true);

}

void loop() {
  
   /* EULER DATA Vector */
    imu::Vector<3> euler = bno.getVector(Adafruit_BNO055::VECTOR_EULER);    
      
   /* Display Angular Position */
    theta= euler.x();
    phi=euler.y();
    psi=euler.z();

    Serial.print("Angles");
    Serial.print("\t\t");
    Serial.print(euler.x());
    Serial.print("\t\t");
    Serial.print(euler.y());
    Serial.print("\t\t");
    Serial.println(euler.z());

    /* Data Conversion in String */
    convert="";
    convert.concat(String(theta));
    convert.concat(" "); //space
    convert.concat(String(phi));
    convert.concat(" ");
    convert.concat(String(psi));
    convert.concat(" ");
    
    /*Setting frame */
    char val[convert.length()];
    convert.toCharArray(val,convert.length());
    Serial.print("Valeur convertie : ");
    Serial.println(convert);
    for (int i=0;i<32;i++){
      Serial.println(val[i]);
      hex[8+i]=val[i];
      sent[8+i]="";
    }
  
    for (int i=0; i<40;i++){
      sent[i]=hex[i];
      //Serial.println(sent[i]);
      }
        
    /*Sending frame */
    Tx16Request tx = Tx16Request(0x1234, sent, sizeof(sent));
    xbee.send(tx);

}

Si j'arrive à obtenir le début de mes data, impossible d'avoir les données complètes.
Par exemple voici ce qui s'affiche sur le lecteur de XCTU :
En Ascii : Tilt : 356.06 5.31 ††††††††††††††††††††
Et en HEX : 54 69 6C 74 20 3A 20 00 33 35 36 2E 30 36 20 35 2E 33 31 20 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86

Alors que je devrais avoir :
Tilt : 356.06 5.31 -2.01
Il me manque toujours la dernière mesure, alors qu'elle est bien acquise par le capteur et bien stockée dans mon tableau "val".

Je pensais que j'avais un problème au niveau de la taille des tableaux que j'envoie mais après plusieurs essais, le problème ne semble pas venir de là.

Avez-vous des pistes ? Y a-t-il des contre-indications à utiliser XBEE et l'I2C en parallèle ?

N’utilisez pas la classe String, ça va vous jouer des tours avec la mémoire

Les XBee Série 1 de mémoire ont un payload de 100 octets donc vous devriez être bon

Vous avez des traces sur arduino, ça affiche quoi dans le moniteur série ?

à la lecture rapide il me semble que puisque char hex[40]="Tilt : "; vous allez avoir un ‘\0’ en hex[7] que vous n’écrasez jamais car vous commencez à 8 que l’on voit dans

54 69 6C 74 20 3A 20 [color=red][b]00[/b][/color] 33 35 36 2E 30 36 20 35 2E 33 31 20 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86

Merci d'avoir pris le temps de me répondre !
Je sais pour la classe String mais je n'ai pas encore trouvé d'autre moyen pour convertir mes données afin de les envoyer correctement ...

Concernant mon problème initial, j'avais finalement encore des problèmes au niveau du stockage dans mes tableaux. Maintenant tout fonctionne comme je le souhaite et j'arrive également à lire des données.

Pour jouer avec des cstrings (tableau de caractères terminé par un caractère nul) regardez les fonctions standards de stdlib.h et de string.h