Go Down

Topic: [Résolu]Comment bien comprendre/utiliser les bytes, les doubles et les char (Read 1 time) previous topic - next topic

J-M-L

ptr est un pointeur typé et quand vous dites *ptr = ... vous n'écrivez que le nombre d'octest Dépendant de ce type car ça dépend du type de stockage pour la variable destination  - et ici *ptr est de type 1 seul octet de mémoire (uint8_t)

Donc *ptr = 0xAABB; par exemple ne récupérerait que le BB à l'endroit du pointeur le compilateur comprend que vous ne voulez que l'octet de poids faible car il n'y a qu'une case dans la destination alors que
* ((uint16_t *) ptr) = 0xAABB;
 va bien mettre BB au niveau du pointeur et AA dans l'octet suivant (little endian, on range en mémoire d'abord le poids faible)

C'est pour cela que dans mon exemple ci dessus  quand j'écris 16 bits, je cast le pointeur en 16 bits (transformé temporairement pour cette ligne)
* ((uint16_t *) ptr) = allMesures[s][m].mesure;
Parce que mesure est sur 2 octets dans mon exemple

Bien sûr il faut avancer ensuite le pointeur du bon nombre de case d'où ptr += sizeof(uint16_t);

De la même manière quand je veux mettre chrono dans le buffer je dis au compilateur par un cast (changement de type) que ptr pointe vers une zone 32 bits et ensuite j'avance de 4 cases le pointeur
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

pierrot10

Bonjour J-M-L.

J'aimerais savoir si vous pouviez encore me filer un coup de pouce. Je n'arrive pas à résoudre mon problème malgré tous les exemples.

En soit, ces exemples mon beaucoup aidé car ils font toujours partie de mon code.

Ceci je bloque toujours sur le même point.

J'ai surfé sur le net et sur le site de TTN et ils fournissent un exemple pour envoyer plusieurs variables.
Avec ceci j'ai réussi à faire ce que je veux SAUF que je n'arrive toujours pas à empiler des int dans un byte!!!!

GRRR.  :)

Voic donc mon cas.

J'ai ces variables

Code: [Select]

byte payloadAltitude[] = {0x34};
    byte payloadHumidity[] = {0x35};
    byte payloadMoisture[] = {0x36};
    byte payloadLuminosity[] = {0x37};
    byte payloadUv[] = {0x38};
    byte payloadLatitude[] = {0x39};
    byte payloadLongitude[] = {0x31, 0x30};
    byte payloadDate[] = {0x31, 0x31};

Puis ensuite je calcule la taille

Code: [Select]

int sizeofPayloadBattery = sizeof(payloadBattery);
    int sizeofPayloadTemperature = sizeof(payloadTemperature);
    int sizeofPayloadPression = sizeof(payloadPression);
    int sizeofPayloadAltitude = sizeof(payloadAltitude);
    int sizeofPayloadHumidity = sizeof(payloadHumidity);
    int sizeofPayloadMoisture = sizeof(payloadMoisture);
    int sizeofPayloadLuminosity = sizeof(payloadLuminosity);
    int sizeofPayloadUv = sizeof(payloadUv);
    int sizeofPayloadLatitude = sizeof(payloadLatitude);
    int sizeofPayloadLongitude = sizeof(payloadLongitude);
    int sizeofPayloadDate = sizeof(payloadDate)

int playloadSize = sizeofPayloadBattery + sizeofPayloadTemperature + sizeofPayloadPression + sizeofPayloadAltitude + sizeofPayloadHumidity + sizeofPayloadMoisture + sizeofPayloadLuminosity + sizeofPayloadUv + sizeofPayloadLatitude +sizeofPayloadLongitude + sizeofPayloadDate;
    
    sprint(F("Payload size: "),1); sprintln(playloadSize,2);
    
    byte payload[playloadSize];


et j'empile

Code: [Select]


memcpy(payload, payloadBattery, sizeofPayloadBattery);
memcpy(payload + sizeofPayloadBattery, payloadTemperature, sizeofPayloadTemperature);
memcpy(payload + sizeofPayloadBattery + sizeofPayloadTemperature, payloadPression, sizeofPayloadPression);
memcpy(payload + sizeofPayloadBattery + sizeofPayloadTemperature + sizeofPayloadPression, payloadAltitude, sizeofPayloadAltitude);
memcpy(payload + sizeofPayloadBattery + sizeofPayloadTemperature + sizeofPayloadPression + sizeofPayloadAltitude, payloadHumidity, sizeofPayloadHumidity);
memcpy(payload + sizeofPayloadBattery + sizeofPayloadTemperature + sizeofPayloadPression + sizeofPayloadAltitude + sizeofPayloadHumidity, payloadMoisture, sizeofPayloadMoisture);
memcpy(payload + sizeofPayloadBattery + sizeofPayloadTemperature + sizeofPayloadPression + sizeofPayloadAltitude + sizeofPayloadHumidity + sizeofPayloadMoisture, payloadLuminosity, sizeofPayloadLuminosity);
memcpy(payload + sizeofPayloadBattery + sizeofPayloadTemperature + sizeofPayloadPression + sizeofPayloadAltitude + sizeofPayloadHumidity + sizeofPayloadMoisture + sizeofPayloadLuminosity, payloadUv, sizeofPayloadUv);
memcpy(payload + sizeofPayloadBattery + sizeofPayloadTemperature + sizeofPayloadPression + sizeofPayloadAltitude + sizeofPayloadHumidity + sizeofPayloadMoisture + sizeofPayloadLuminosity + sizeofPayloadUv, payloadLatitude, sizeofPayloadLatitude);
memcpy(payload + sizeofPayloadBattery + sizeofPayloadTemperature + sizeofPayloadPression + sizeofPayloadAltitude + sizeofPayloadHumidity + sizeofPayloadMoisture + sizeofPayloadLuminosity + sizeofPayloadUv + sizeofPayloadLatitude, payloadLongitude, sizeofPayloadLongitude);
memcpy(payload + sizeofPayloadBattery + sizeofPayloadTemperature + sizeofPayloadPression + sizeofPayloadAltitude + sizeofPayloadHumidity + sizeofPayloadMoisture + sizeofPayloadLuminosity + sizeofPayloadUv + sizeofPayloadLatitude + sizeofPayloadLongitude, payloadDate, sizeofPayloadDate);

//if((sizeofPayloadBattery + sizeofPayloadTemperature + sizeofPayloadPression + sizeofPayloadAltitude + sizeofPayloadHumidity + sizeofPayloadMoisture + sizeofPayloadLuminosity + sizeofPayloadUv + sizeofPayloadLatitude + sizeofPayloadLongitude + sizeofPayloadDate) > 51) Serial.println(F("playload is over (10)"));


// PRINT
Serial.print("mydata = { ");
  for (byte i = 0; i < playloadSize; i++) {
    //Serial.print("0x");
    if (payload[i] <= 0xF) Serial.print("-");
    Serial.print(payload[i], HEX);
    Serial.print(" ");
  }
Serial.println("}");


Ca marche!!!!!


Sauf que mon problème est encore ici
Code: [Select]

byte payloadBattery[] = {0x34};
    byte payloadTemperature[] = {0x35};
    byte payloadPression[] = {0x36};
    byte payloadAltitude[] = {0x37};


Et je précise.

sij'ai
Code: [Select]

int ibatt = 345
int itemp = -3
int ipres = 1
int ialti = 123456 // je fait expres de mettre un gros chiffre


Je n'arrive pas à les passer dans

Code: [Select]

byte payloadBattery[] = {0x33 0x34 0x35};
    byte payloadTemperature[] = {0x2d 0x33};
    byte payloadPression[] = {0x31};
    byte payloadAlttiude[] = {0x31 0x32 0x33 0x34 0x35 0x36 0x20};


J'ai essayé plein de truc comme paremple
Code: [Select]
byte payloadBattery[2];
playloadBattery[0] = ibatt / 256;
playloadBattery[1] = ibatt % 256;
    byte payloadTemperature[2];
playloadTemperature[0] = itemp / 256;
playloadTemperature[1] = itemp % 256;
    byte payloadPression[2];
playloadPression[0] = ipres / 256;
playloadPression[1] = ipres % 256;
    byte payloadAltitude[2];
playloadAltitude[0] = ialti / 256;
playloadAltitude[1] = ialti % 256;


Ci-dessus, affichera des valerus fausses sous // PRINT

J'ai encore essayé

Code: [Select]
byte tBattery[2];
tBattery[0] = ibatt / 256;
tBattery[1] = ibatt % 256;
    byte tTemperature[2];
tTemperature[0] = itemp / 256;
tTemperature[1] = itemp % 256;
    byte tPression[2];
tPression[0] = ipress / 256;
tPression[1] = ipres % 256;
    byte tAltitude[2];
tAltitude[0] = ialti / 256;
tAltitude[1] = ialti % 256;


byte payloadBattery[] = tBattery;
    byte payloadTemperature[] = tTemperature;
    byte payloadPression[] = tPression;
    byte payloadAlttiude[] = tAltitude;


 Ceci m'affichera une erreur dans mon terminal. Je ne sais plus ce que j'ai essayé...

Comment travailler ibatt (et les nombre négatif ou grand nombre)

ibatt = 345

pour arriver à ce même résultat

byte payloadTemperature[] ={0x33, 0x34, 0x35};

Il est encore important que je puisse sauver dans notre comme
1 (1 digit)
345 (3 digit)
-4 (négative)
123456 (6 digit pour les longitude et latitude)

Des que j'arrive à comprendre et à la faire, je suis débloqué  :o  :o

Milles mercis
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

J-M-L

vous comprenez que quand vous écrivez
Code: [Select]
byte payloadBattery[] = {0x34};vous déclarez un tableau de 1 byte de long (car vous ne passez qu'une valeur) ? donc la variable payloadBattery est de type pointeur en mémoire sur un tableau de byte.

donc votre exemple avec
Code: [Select]
byte payloadAltitude[] = {0x34};
byte payloadHumidity[] = {0x35};
byte payloadMoisture[] = {0x36};
// ... etc
est tout à fait fonctionnel car la fonction memcpy() a besoin d'un pointeur en mémoire pour travailler.

A ce sujet, pour simplifier la lecture et l'écriture au lieu de faire
Code: [Select]
memcpy(payload, payloadBattery, sizeofPayloadBattery);
memcpy(payload + sizeofPayloadBattery, payloadTemperature, sizeofPayloadTemperature);
memcpy(payload + sizeofPayloadBattery + sizeofPayloadTemperature, payloadPression, sizeofPayloadPression);
qui devient vite pénible à lire, il est plus simple de déclarer un pointeur et de le bouger.

Code: [Select]
byte * ptr = payload; // on initialise ptr au début du payload
memcpy(ptr, payloadBattery, sizeofPayloadBattery);
ptr+= sizeofPayloadBattery; // on décale le pointeur

memcpy(ptr, payloadTemperature, sizeofPayloadTemperature);
ptr+= sizeofPayloadTemperature; // on décale le pointeur

memcpy(ptr, payloadPression, sizeofPayloadPression);
ptr+= sizeofPayloadPression; // on décale le pointeur

// etc





Pour votre question maintenant concernant
Code: [Select]
int ibatt = 345;
il faut comprendre ici que ibatt est une variable de type entier. Comme ce n'est pas un tableau, lorsque dans du code vous faites référence à ibatt, vous manipulez le contenu de la mémoire et pas le pointeur sur la mémoire associée. En C le pointeur (l'adresse de la case mémoire du début du stockage) se représente par &ibatt. à cet endroit en mémoire va se trouver le codage sur plusieurs octets de votre nombre. Le nombre d'octets de codage dépend du type de la variable. Un int sur arduino standard c'est 2 octets, un float ou un long c'est 4 par exemple. Le nombre d'octets affectés au stockage d'un entier va influencer les valeurs représentables: sur un Arduino typique (genre UNO), un int est sur 2 octets donc 16 bits. un int est signé donc il y a un bit qui va être utilisé pour dire si le nombre est positif ou négatif et il reste 15 bits pour représenter la valeur, ce qui permet par convention (puisqu'on est en base 2) d'avoir une valeur minimum à -215 = -32,768 et maximale à +215-1 = 32,767.
Si vos valeurs sont toutes positives vous pouvez utiliser un unsigned int qui va alors vous donner les 16 bits pour représenter vos nombres entre 0 et 216-1=65535. On voit bien que la représentation sous forme de 1 et de 0 de votre nombre n'est qu'affaire de convention (qui suit une norme internationale), cette convention vous la définissez avec le type de la variable et le compilateur se charge du reste.

Pour ibatt qui est un int donc sur 2 octets, vous aurez à partir de l'adresse mémoire &ibatt la représentation de 345(décimal) qui est en héxadécimal 0x159(hex).

Le compilateur sur Arduino étant little endian et la mémoire étant organisée en octets (une adresse pointe vers 8 bits de mémoire) il va mettre dans la mémoire d'abord l'octet de poids faible puis celui de poids fort et donc on aura à partir de l'adresse mémoire &ibatt 0x59 puis dans l'octet qui suit en mémoire la valeur 0x01.

Mais vous me dites vouloir avoir dans le payload 0x33 0x34 0x35 ce qui correspond à la représentation en ASCII de votre nombre en base 10 (le caractère '3' est effectivement codé en 0x33, le caractère '4' est 0x34 et le caractère '5' est 0x35).

Cette approche comme on vous l'a déjà mentionné n'est pas super car l'entier 15228 par exemple va nécessiter 5 octets pour être représenté alors que l'entier 3 ne va en nécessité qu'un seul. Pour calculer la taille de votre payload a priori, c'est pénible... et côté décodage ça va être un peu galère aussi, il faudra marquer la fin de la chaîne de caractères puisque sa longueur n'est pas fixe. et donc rajouter un octet (généralement on met '\0' dans ce caractère). Il est bcp plus efficace d'envoyer la représentation binaire, les fameux 2 octets à partir de l'adresse mémoire &ibatt 0x59 puis 0x01.

en continuant l'approche mentionnée ci dessus cela se ferait par

Code: [Select]
int ibatt = 345;

byte * ptr = payload; // on initialise ptr au début du payload
memcpy(ptr, (byte *) (& ibatt), sizeof(ibatt));
ptr+= sizeof(ibatt); // on décale le pointeur du bon nombre d'octets



Cependant si vous tenez à représenterez en mémoire la chaîne de caractères ASCII, il faut d'abord la convertir.

Pour cela il y a des fonctions dans les librairies standard (stdlib.h ou string.h par exemple) et celle qui permet de convertir un entier (type int) en chaîne ASCII est itoa()

Pour convertir un entier stocké dans valeur, et mettre la chaîne correspondante à la représentation ASCII dans une certaine base à l'adresse pointée par adresseMémoire,  l'appel de fonction est le suivant
itoa(valeur, adresseMémoire, base );

ça rajoute tout seul aussi un caractère nul de fin de chaîne '\0' à la fin de l'encodage.

Donc puisque vous voulez représenter en base 10 et stocker ça dans le payload (en supposant qu'il y ait toute la place nécessaire dans le payload)

Code: [Select]
int ibatt = 345;

byte * ptr = payload; // on initialise ptr au début du payload
itoa ( ibatt, (char *) ptr, 10 ); // on écrit à partir de ptr la représentation ASCII en base 10 de la valeur de ibatt
ptr+= strlen(ptr) + 1; // on décale le pointeur du bon nombre d'octets, besoin du +1 pour conserver le '\0'


La fonction standard strlen()  donne le nombre de caractères utilisés. cette fonction ne compte pas le caractère nul de fin et donc je fais +1 pour déplacer le pointeur vers la prochaine case vide du payload.

Si on met tout cela dans un exemple de code:
Code: [Select]
uint8_t payload[10]; // uint8_t c'est comme byte mais plus standard
const byte nbBytesDansPayload = sizeof(payload);

void afficherPayload()
{
  for (byte i = 0; i < nbBytesDansPayload; i++) {
    Serial.print(F("payload["));
    Serial.print(i);
    Serial.print(F("]=0x"));
    Serial.print(payload[i], HEX);
    Serial.print(F("\tsoit le caractère ASCII '"));
    Serial.print((char) payload[i]);
    Serial.println(F("'"));
  }
}

void setup() {
  int ibatt = 345; // 0x159 en hexa

  Serial.begin(115200);
  // on met tout le buffer à '#'histoire de voir quelque chose lors de l'impression
  memset(payload, '#', nbBytesDansPayload);

  // on copie la représentation binaire (2 octets sur UNO)
  uint8_t * ptr = payload; // on initialise ptr au début du payload
  memcpy(ptr, (uint8_t *) (& ibatt), sizeof(ibatt));
  ptr += sizeof(ibatt); // on décale le pointeur du bon nombre d'octets

  // on copie la représentation base 10 en ASCII
  itoa(ibatt, (char *) ptr, 10); // on écrit à partir de ptr la représentation ASCII en base 10 de la valeur de ibatt
  ptr += strlen((char *) ptr) + 1; // on décale le pointeur du bon nombre d'octets, besoin du +1 pour conserver le '\0'

  afficherPayload();
}

void loop() {}


si vous exécutez, vous verrez dans la console

payload[0]=0x59 soit le caractère ASCII 'Y'
payload[1]=0x1 soit le caractère ASCII ''
payload[2]=0x33 soit le caractère ASCII '3'
payload[3]=0x34 soit le caractère ASCII '4'
payload[4]=0x35 soit le caractère ASCII '5'
payload[5]=0x0 soit le caractère ASCII ''
payload[6]=0x23 soit le caractère ASCII '#'
payload[7]=0x23 soit le caractère ASCII '#'
payload[8]=0x23 soit le caractère ASCII '#'
payload[9]=0x23 soit le caractère ASCII '#'



on retrouve bien en cases 0 et 1 la représentation de 0x159 (avec le 0x59 d'abord) puis la représentation ASCII correcte de 345 en base 10, suivi du zéro de fin de chaîne et ensuite rien n'a été touché, on trouve tous les '#' que j'avais mis au départ.

Pour des nombre négatifs ou des grands nombres c'est la même chose, si vous voulez de l'ASCII il faut prendre la fonction de conversion ASCII adaptée... mais ma recommendation c'est de ne pas envoyer l'ASCII et d'envoyer la représentation mémoire et faire ensuite le traitement côté serveur....



ça aide ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

pierrot10

Bonjour J-M-L
Je vous réponds juste pour vous dire que j'ai reçu votre super mega réponse. Vous être extraordinaire.
Je ne pourrai pas me pencher la dessus ce week-end, car je suis avec ma fille, mais je lirai ligne par ligne votre réponse lundi. Milles mercis et tout bon week-end à vous
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

pierrot10

Bonjour J-M-L,

Je crois que j'y suis arrivéééééeeeee!!!!!!!!!!!!!!!!!
Je crois, je crois, je crois.

Je me suis basé sur votre dernière réponse sans avoir de résultat concluant, mais très proche.

Avant de continuer:
Quote
A ce sujet, pour simplifier la lecture et l'écriture au lieu de faire
Oui en effet, je l'ai corrigé de la sorte. C'est en effet bien bien mieux  :)
Ce code fonctionne exactement comme je le veux, sauf que je n'arrive toujours pas  à ce que
payloadBattery prenne la valeur de ibatt, comme ci-dessous
Code: [Select]

byte payloadBattery[] = {0x33, 0x34, 0x35};     //345
    byte payloadTemperature[] = {0x2D, 0x31, 0x30}; // -10
    byte payloadPression[] = {0x31};                //1
    byte payloadAltitude[] = {0x34, 0x32, 0x34};    // 424
    byte payloadHumidity[] = {0x35};                // 5
    byte payloadMoisture[] = {0x36};                // 6
    byte payloadLuminosity[] = {0x37};              // 7
    byte payloadUv[] = {0x38};                      // 8
    byte payloadLatitude[] = {0x39};                // 9
    byte payloadLongitude[] = {0x31, 0x30};         // 10
    byte payloadDate[] = {0x31, 0x31};              // 11

    int sizeofPayloadBattery = sizeof(payloadBattery);
    int sizeofPayloadTemperature = sizeof(payloadTemperature);
    int sizeofPayloadPression = sizeof(payloadPression);
    int sizeofPayloadAltitude = sizeof(payloadAltitude);
    int sizeofPayloadHumidity = sizeof(payloadHumidity);
    int sizeofPayloadMoisture = sizeof(payloadMoisture);
    int sizeofPayloadLuminosity = sizeof(payloadLuminosity);
    int sizeofPayloadUv = sizeof(payloadUv);
    int sizeofPayloadLatitude = sizeof(payloadLatitude);
    int sizeofPayloadLongitude = sizeof(payloadLongitude);
    int sizeofPayloadDate = sizeof(payloadDate);
    
    //int playloadSize = sizeofPayloadBattery + sizeofPayloadTemperature + sizeofPayloadPression + sizeofPayloadAltitude + sizeofPayloadHumidity + sizeofPayloadMoisture + sizeofPayloadLuminosity + sizeofPayloadUv + sizeofPayloadLatitude +sizeofPayloadLongitude + sizeofPayloadDate;
    int playloadSize = 64;
    sprint(F("Payload size: "),1); sprintln(playloadSize,2);
    
    uint8_t payload[playloadSize];
    // on met tout le buffer à '#'histoire de voir quelque chose lors de l'impression
    memset(payload, '#', playloadSize);

    uint8_t * ptr = payload;

    //Arranegment proposée par J-M-L
    
    memcpy(ptr, payloadBattery, sizeofPayloadBattery);
    ptr+= sizeofPayloadBattery+1;   // On deplace le pointeur. J'ajoute volontaire un espace suppl. pour ieux lire le réultat

    memcpy(ptr, payloadTemperature, sizeofPayloadTemperature);
    ptr+= sizeofPayloadTemperature+1;   // On deplace le pointeur
    
    memcpy(ptr, payloadPression, sizeofPayloadPression);
    ptr+= sizeofPayloadPression+1;   // On deplace le pointeur

    memcpy(ptr, payloadAltitude, sizeofPayloadAltitude);
    ptr+= sizeofPayloadAltitude+1;   // On deplace le pointeur

    memcpy(ptr, payloadHumidity, sizeofPayloadHumidity);
    ptr+= sizeofPayloadHumidity+1;   // On deplace le pointeur

    memcpy(ptr, payloadMoisture, sizeofPayloadMoisture);
    ptr+= sizeofPayloadMoisture+1;   // On deplace le pointeur

    memcpy(ptr, payloadLuminosity, sizeofPayloadLuminosity);
    ptr+= sizeofPayloadLuminosity+1;   // On deplace le pointeur

    memcpy(ptr, payloadUv, sizeofPayloadUv);
    ptr+= sizeofPayloadUv+1;   // On deplace le pointeur

    memcpy(ptr, payloadLatitude, sizeofPayloadLatitude);
    ptr+= sizeofPayloadLatitude+1;   // On deplace le pointeur

    memcpy(ptr, payloadLongitude, sizeofPayloadLongitude);
    ptr+= sizeofPayloadLongitude+1;   // On deplace le pointeur

    memcpy(ptr, payloadDate, sizeofPayloadDate);

Ce qui donne
Quote
33 34 35 23 2D 31 30 23 31 23 34 32 34 23 35 23 36 23 37 23 38 39 23 31 30 23 31 31 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23
ou
Quote
345#-10#1#424#5#6#7#89#10#11####################################
C'est exactement le résultat que je veux avoir!!!( Avec des # des, c'est egal..)

Après avoir rendu cette partie plus lisible, je me suis penché sur vos propositions, sans pour autant réussir.

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

pierrot10

Finalement, je me suis basé sur votre tout dernier code

Cette partie m'affichait des caracteres ilisible
Code: [Select]

  // on copie la représentation binaire (2 octets sur UNO)
  uint8_t * ptr = payload; // on initialise ptr au début du payload
  memcpy(ptr, (uint8_t *) (& ibatt), sizeof(ibatt));
  ptr += sizeof(ibatt); // on décale le pointeur du bon nombre d'octets


Finalement, je l'ai supprimé pour gardé que ceci et là il semble que ca s'affiche bien

Si
Quote
ibatt=345
itemp=-10
ipres=1
ialti=424
ihumi=-34654// Je mets volontairement un chiffre à 6 difigt
imois=6
ilumi=7
iuv=8
ilati=4686789 // 5 deimal
lati=412436 //5decimal
idate=170925
itime=1747
Ceci
Code: [Select]
 int payloadSize = 64;
    uint8_t payload[payloadSize];
    memset(payload,'#',payloadSize);
    uint8_t * ptr = payload;

    ibatt = 345;
    itemp = -10;
    ipres = 1;
    ialti = 424;
    ihumi = -34654; // Je mets volontairement un chiffre à 6 difigt
    imois = 6;
    ilumi = 7;
    iuv = 8;
    ilati = 4686789; // 5 deimal
    ilong = 412436; //5decimal
    idate = 170925;
    itime = 1731;

    // on copie la représentation binaire (2 octets sur UNO)
    // memcpy(ptr, (uint8_t *) (& ibatt), sizeof(ibatt));
    // ptr += sizeof(ibatt); // on décale le pointeur du bon nombre d'octets

    // on copie la représentation base 10 en ASCII
    itoa(ibatt, (char *) ptr, 10); // on écrit à partir de ptr la représentation ASCII en base 10 de la valeur de ibatt
    ptr += strlen((char *) ptr) + 1; // on décale le pointeur du bon nombre d'octets, besoin du +1 pour conserver le '\0'

    // memcpy(ptr, (uint8_t *) (& itemp), sizeof(itemp));
    // ptr += sizeof(itemp);
    itoa(itemp, (char *) ptr, 10);
    ptr += strlen((char *) ptr) + 1;
  
    // memcpy(ptr, (uint8_t *) (& ipres), sizeof(ipres));
    // ptr += sizeof(ipres);
    itoa(ipres, (char *) ptr, 10);
    ptr += strlen((char *) ptr) + 1;

    // memcpy(ptr, (uint8_t *) (& ialti), sizeof(ialti));
    // ptr += sizeof(ialti);
    itoa(ialti, (char *) ptr, 10);
    ptr += strlen((char *) ptr) + 1;

    itoa(ihumi, (char *) ptr, 10);
    ptr += strlen((char *) ptr) + 1;

    itoa(imois, (char *) ptr, 10);
    ptr += strlen((char *) ptr) + 1;

    itoa(ilumi, (char *) ptr, 10);
    ptr += strlen((char *) ptr) + 1;

    itoa(iuv, (char *) ptr, 10);
    ptr += strlen((char *) ptr) + 1;

    itoa(ilati, (char *) ptr, 10);
    ptr += strlen((char *) ptr) + 1;

    itoa(ilong, (char *) ptr, 10);
    ptr += strlen((char *) ptr) + 1;

    itoa(idate, (char *) ptr, 10);
    ptr += strlen((char *) ptr) + 1;

    itoa(itime, (char *) ptr, 10);
    ptr += strlen((char *) ptr) + 1;
    
    for (byte i = 0; i < 64; i++) {
      Serial.print(F("payload3["));
      Serial.print(i);
      Serial.print(F("]=0x"));
      Serial.print(payload[i], HEX);
      Serial.print(F("\tsoit le caractere ASCII '"));
      Serial.print((char) payload[i]);
      Serial.println(F("'"));
    }

m'affiche bien
Quote
payload3[0]=0x33 soit le caractere ASCII '3'
payload3[1]=0x34 soit le caractere ASCII '4'
payload3[2]=0x35 soit le caractere ASCII '5'
payload3[3]=0x0 soit le caractere ASCII ''
payload3[4]=0x2D soit le caractere ASCII '-'
payload3[5]=0x31 soit le caractere ASCII '1'
payload3[6]=0x30 soit le caractere ASCII '0'
payload3[7]=0x0 soit le caractere ASCII ''
payload3[8]=0x31 soit le caractere ASCII '1'
payload3[9]=0x0 soit le caractere ASCII ''
payload3[10]=0x34 soit le caractere ASCII '4'
payload3[11]=0x32 soit le caractere ASCII '2'
payload3[12]=0x34 soit le caractere ASCII '4'
payload3[13]=0x0 soit le caractere ASCII ''
payload3[14]=0x2D soit le caractere ASCII '-'
payload3[15]=0x33 soit le caractere ASCII '3'
payload3[16]=0x34 soit le caractere ASCII '4'
payload3[17]=0x36 soit le caractere ASCII '6'
payload3[18]=0x35 soit le caractere ASCII '5'
payload3[19]=0x34 soit le caractere ASCII '4
payload3[20]=0x0 soit le caractere ASCII ''
payload3[21]=0x36 soit le caractere ASCII '6'
payload3[22]=0x0 soit le caractere ASCII ''
payload3[23]=0x37 soit le caractere ASCII '7'
payload3[24]=0x0 soit le caractere ASCII ''
payload3[25]=0x38 soit le caractere ASCII '8'
payload3[26]=0x0 soit le caractere ASCII ''
payload3[27]=0x34 soit le caractere ASCII '4'
payload3[28]=0x36 soit le caractere ASCII '6'
payload3[29]=0x38 soit le caractere ASCII '8'
payload3[30]=0x36 soit le caractere ASCII '6'
payload3[31]=0x37 soit le caractere ASCII '7'
payload3[32]=0x38 soit le caractere ASCII '8'
payload3[33]=0x39 soit le caractere ASCII '9'
payload3[34]=0x0 soit le caractere ASCII ''
payload3[35]=0x34 soit le caractere ASCII '4'
payload3[36]=0x31 soit le caractere ASCII '1'
payload3[37]=0x32 soit le caractere ASCII '2'
payload3[38]=0x34 soit le caractere ASCII '4'
payload3[39]=0x33 soit le caractere ASCII '3'
payload3[40]=0x36 soit le caractere ASCII '6'
payload3[41]=0x0 soit le caractere ASCII ''
payload3[42]=0x31 soit le caractere ASCII '1'
payload3[43]=0x37 soit le caractere ASCII '7'
payload3[44]=0x30 soit le caractere ASCII '0'
payload3[45]=0x39 soit le caractere ASCII '9'
payload3[46]=0x32 soit le caractere ASCII '2'
payload3[47]=0x35 soit le caractere ASCII '5'
payload3[48]=0x0 soit le caractere ASCII ''
payload3[49]=0x31 soit le caractere ASCII '1'
payload3[50]=0x37 soit le caractere ASCII '7'
payload3[51]=0x33 soit le caractere ASCII '3'
payload3[52]=0x31 soit le caractere ASCII '1'
payload3[51]=0x0 soit le caractere ASCII ''
payload3[54]=0x23 soit le caractere ASCII '#'
payload3[55]=0x23 soit le caractere ASCII '#'
payload3[56]=0x23 soit le caractere ASCII '#'
payload3[57]=0x23 soit le caractere ASCII '#'
payload3[58]=0x23 soit le caractere ASCII '#'
payload3[59]=0x23 soit le caractere ASCII '#'
payload3[60]=0x23 soit le caractere ASCII '#'
payload3[61]=0x23 soit le caractere ASCII '#'
payload3[62]=0x23 soit le caractere ASCII '#'
payload3[63]=0x23 soit le caractere ASCII '#'
Et je vois même qu'il me reste un peu de place  :)

C'est génial. Il me reste plus qu'a voir si mes données seront bien envoyées. J'essayerai aussi arrivé à la maison.

En attendant, je vais simplifer l'affichage d ela sorte
Quote
payload3 {33 34 35 0 2D 31 30 0 31 0 34 32 34 0 2D 33 34 36 35 34 0 36 0 37 0 38 0 34 36 38 36 37 38 39 0 34 31 32 34 33 36 0 31 37 30 39 32 35 0 31 37 33 31 0 23 23 23 23 23 23 23 23 23 23 }
et que je remplace les 0 par 2C (la virgule)

Je me réjouis d'essayé tut ceci.

Qu'en pensez-vous?

je vous tiens au courant et tout cas, milles milles milles mercis pour tout ce que vous avez fait, pour tout vos exemples, votre temps. C'est vraiment super sympa et je vous en suis très reconnaissant.

Vous êtes quel côté géographique?
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

pierrot10

Bonjour J-M-L

Je voulais encore vraiment vous remercier pour toute l'énergie et la patience que vous avez pris pour moi.

Ca fonctionne!!!!!!

J'ai envoyé des données que je retrouve sur le serveur. Je suis super content et sans vous j'aurais jamais réussi.

Aussi, l'air de rien, j'ai beaucoup, beaucoup appris surtout e ce qui concerne le pointer. Je ne sais pas ou vous etes localisé, mais c'est avec grand plaisir que je vous offrirais un bon verre.

Cette discussion, elle est vraiment été énorme et je vais prendre un moment pour mettre tout mon code. Je vais avant faire un peu de nettoyage mais je le mets plus tard
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

J-M-L

Super boulot - vous avez tout compris !

(bon si c'était moi vous savez bien que je n'enverrai pas de l'ASCII puisque le serveur sera bcp plus puissant pour décoder vos octets directement mais pas grave)

Bonne continuation
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

pierrot10

Voilà, j'espère qu'il n'y aura rien à redire  :)

(J'espère ne rien oublier)

Code: [Select]


//---------------------------------------------------------
// Sensor activation
//---------------------------------------------------------

#define SENSOR_BATTERY      // Battery Voltage
//#define SENSOR_GPS        // latitude, longitude, datetime
#define SENSOR_BMP180       // Barometer (temperature/pression/alt)
#define SENSOR_DTH22        // Humidity (Temrature)
//#define SENSOR_MOISTURE
#define SENSOR_TSL2561      // Luminoisty
//#define SENSOR_UV
//#define SENSOR_MEMORY     // Free memory

const byte capteur_battery_id = 0;
const byte capteur_temperature_id = 1;
const byte capteur_pression_id = 2;
const byte capteur_alt_id = 3;
const byte capteur_humidity_id = 4;
const byte capteur_moisture_id = 5;
const byte capteur_luminosity_id = 6;
const byte capteur_uv_id = 7;
const byte capteur_latitude_id = 8;
const byte capteur_longitude_id = 9;
const byte capteur_datetime_id = 10;

// JE NE LES METS PAS TOUS...
#ifdef SENSOR_BATTERY
bool battery_active = true;
#else
bool battery_active = false;
#endif

struct capteur
{
  uint8_t idDuCapteur;
  boolean actif;
  const char * nomDuCapteur;
};
capteur mesCapteur[] = {
  {capteur_battery_id, battery_active, "ba"},
  {capteur_temperature_id, temperature_active, "te"},
  {capteur_pression_id, pression_active, "pr"},
  {capteur_alt_id, alt_active, "al"},
  {capteur_humidity_id, humidity_active, "hu"},
  {capteur_moisture_id, moisture_active, "mo"},
  {capteur_luminosity_id, luminosity_active, "lu"},
  {capteur_uv_id, uv_active, "uv"},
  {capteur_latitude_id, latitude_active, "la"},
  {capteur_longitude_id, longitude_active, "lo"},
  {capteur_datetime_id, datetime_active, "da"},
};



enum : byte {c_battery = 0, c_temperature, c_pression, c_alt, c_humidity, c_moisture, c_luminosity, c_uv, c_latitude, c_longitude, c_datetime}; // dans le même ordre que mesCapteurs
const byte nbMaxCapteurs = sizeof(mesCapteur) / sizeof(mesCapteur[0]);

struct mesure {
  uint16_t id_capteur;
  int valeur; // valeur mesurée (adapter le type)
  // autre chose de pertinent à mémoriser lors d'une mesure ?
};

const byte tailleHistorique = 11; // Ce chiffre doit correspondre aux nombres de capteurs. Voir capteur mesCapteur[] = {
mesure mesMesures[nbMaxCapteurs][tailleHistorique];


Je ne peux pas mettre tout mon code dans un post, je le split
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

pierrot10

(Suite)
J'ai maintenant une fonction do_send(). Elle est appelée tous les 120sec. A caque fois qu'elle est applée, les fonctions "capteurs" sont applés..

Code: [Select]

void do_send(osjob_t* j)
{
  uint8_t payload[payloadSize];
  memset(payload,'#',payloadSize);

// Ici la partie du code qui prépare LoRa a l'envoi

/*
* Je fais appelle à mes fonctions qui me retorune tous des float.
* J'ai décidé ne pas garder les décimal, sauf pour la batterie et poue les latitude et longitude
* Je dois encore étudier la date. Ce que j'ai fais c'est du brouillon.
* Pour la batterie je garde 2 décimal
* pour lat et lon, je garde 4 décimal
* pour les autres, je garde rien
* Si le moduel est inactif, je garde la valeur de -99. Cette valeur ne sera jamais envoyée. Elle ne s'affiche que si il ya un problème...
*/

   /*
    * Getting battery value
    */
    float fbatt;
    int ibatt;
    if(battery_active)
    {
      fbatt = get_battery(battery);
      fbatt = fbatt*100;
      ibatt = fbatt;
    }
    else
    {
      ibatt = -99;
    }
    mesMesures[c_battery][capteur_battery_id].valeur = ibatt;

/*
     * Get temperature, pression, altitude value
     */
    float ftemp, fpres, falti;
    int itemp, ipres, ialti;
    
    if(temperature_active)
    {
      ftemp = get_temperature(temperature);
      itemp = ftemp;
    }
    else
    {
      itemp = -99;
    }
    mesMesures[c_temperature][capteur_temperature_id].valeur = itemp;

    if(pression_active)
    {
      fpres = get_pression(pression);
      ipres = fpres;
    }
    else
    {
      ipres = -99;
    }
    mesMesures[c_pression][capteur_pression_id].valeur = ipres;

    if(alt_active)
    {
      ialti = ALTITUDE;
    }
    else
    {
      ialti = -99;
    }
    mesMesures[c_alt][capteur_alt_id].valeur = ialti;

 /*
     * Get humidity value
     */
    float fhumi;
    int ihumi;
    if(humidity_active)
    {
      fhumi = get_humidity(humidity);
      ihumi = fhumi;
    }
    else
    {
      ihumi = -99;
    }
    mesMesures[c_humidity][capteur_humidity_id].valeur = ihumi;

    /*
     * Get moisture value
    */
    float fmois;
    int imois;
    if(moisture_active)
    {
      fmois = get_moisture(moisture);
      imois = fmois;
    }else{
      imois = -99;
    }
    mesMesures[c_moisture][capteur_moisture_id].valeur = imois;


    /*
     * Get luminosity value
     */
    int ilumi;
    float flumi;
    if(luminosity_active)
    {
      flumi = get_luminosity(luminosity);
      ilumi = flumi;
    }
    else
    {
      ilumi = -99;
    }
    mesMesures[c_luminosity][capteur_luminosity_id].valeur = ilumi;


    /*
     * Get UV value
     */
    float fuv;
    int iuv;
    if(uv_active)
    {
      fuv = get_uv(uv);
      iuv = fuv;
    }else{
      iuv = -99;
    }
    mesMesures[c_uv][capteur_uv_id].valeur = iuv;
    
  /*
     * Getting GPS value
     */
    float flati, flong, fdate;
    int ilati, ilong, idate, itime;    
    if(latitude_active)
    {
      flati = get_latitude(latitude);
      flati = flati*10000;
      ilati = flati;
    }
    else
    {
      ilati = -99;
    }
    mesMesures[c_latitude][capteur_latitude_id].valeur = ilati;

    if(longitude_active)
    {
      flong = get_longitude(longitude);
      flong = flong*10000;
      ilong = flong;
    }
    else
    {
      ilong = -99;
    }
    mesMesures[c_longitude][capteur_longitude_id].valeur = ilong;

    if(datetime_active)
    {
      fdate = get_time(datetime); // 170927.2356
      idate = fdate;   // 170927
    
      uint16_t item, item2;

      fdate = fdate*10000;  // 1709272356.00
      item = fdate;         // 1709272356
      item2 = idate*10000;  // 1709270000
      
      itime = item-item2;   // 2356
      
    }else{
      idate = -99;
      itime = -99;
    }
    mesMesures[c_datetime][capteur_datetime_id].valeur = idate;


Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

pierrot10

(suite 2)
Voilà, maintenant, je traite les données pour l'envoi. Le délème, et je crois que c'étais a base de ce post, est d'avoir une virgule qqui sépare les mesures sauf pour la dernière, en tenant compte des capteurs actifs ou pas, comme ceci (merci J-M-L)

Quote
Valeurs:{431,23,970,424,43,,7,,,,}
Le vide entre les virgules sont les capteurs inactifs


Ja'ffiche les états des capteurs, pour info (toujours dans la fonctions do_send()
Code: [Select]

byte nbCapteurActif = 0;
    for (byte i = 0; i < nbMaxCapteurs; i++) {
      sprint(F("Capteur: ["), 2);
      sprint(mesCapteur[i].nomDuCapteur, 2);
      sprint(F("]\t"), 2);
      sprint(F("actif: "), 2); sprint(mesCapteur[i].actif ? F("VRAI") : F("FAUX"), 2);
      if (mesCapteur[i].actif)nbCapteurActif++;
      sprint(F("\tID: "), 2); sprintln(mesCapteur[i].idDuCapteur, 2);
    }

Ce qui donne
Quote
Liste des capteurs
---------------------------------------
Capteur: [ba] actif: VRAI ID: 0
Capteur: [te] actif: VRAI ID: 1
Capteur: [pr] actif: VRAI ID: 2
Capteur: [al] actif: VRAI ID: 3
Capteur: [hu] actif: VRAI ID: 4
Capteur: [mo] actif: FAUX ID: 5
Capteur: [lu] actif: VRAI ID: 6
Capteur: [uv] actif: FAUX ID: 7
Capteur: [la] actif: FAUX ID: 8
Capteur: [lo] actif: FAUX ID: 9
Capteur: [da] actif: FAUX ID: 10

J'affiche les valeurs
Code: [Select]

sprintln(F("\nValeurs des capteurs actifs"), 2);
    sprintln(F("---------------------------------------"), 2);
    sprint(F("Nombre de capteurs: "), 2);
    sprintln(nbMaxCapteurs, 2);
    sprint(F("Nombre de capteurs actifs: "), 2);
    sprintln(nbCapteurActif, 2);

    sprint(F("Valeurs:"), 2);

    // Loop la strcture des capteurs
    sprint(F("{"),2);
    for (byte i = 0; i < nbMaxCapteurs; i++) {
      if (mesCapteur[i].actif) { // si le capteur n'est pas actif on n'imprime pas
        sprint(mesCapteur[i].nomDuCapteur, 0);
        sprint(F(":"), 0);
        sprint(mesMesures[i][mesCapteur[i].idDuCapteur].valeur, 0);
        if (i < nbMaxCapteurs-1) sprint(F(","), 0);
      }
      else
      {
        sprint(mesCapteur[i].nomDuCapteur, 0);
        sprint(F(":"), 0);
        sprint(mesMesures[i][mesCapteur[i].idDuCapteur].valeur, 0);
        if (i < nbMaxCapteurs-1) sprint(F(","), 0);
      }
     }
     sprintln(F("}"),2);

Ce qui donne (ce n'est pas envoyé, c'est juste pour le suivi, ou du debugage
Quote
Valeurs des capteurs actifs
---------------------------------------
Nombre de capteurs: 11
Nombre de capteurs actifs: 6
Valeurs:{ba:431,te:22,pr:970,al:424,hu:43,mo:-99,lu:0,uv:-99,la:-99,lo:-99,da:-99}
On voit bien les -99 qui témoigne qu'ils sont inactifs

Maintenant j'empile et j'affiche le contenu de payload
Code: [Select]

sprintln(F("\nEmpilations des valeurs capteurs"), 2);
     sprintln(F("---------------------------------------"), 2);

    uint8_t * ptr = payload;

    for (byte i = 0; i < nbMaxCapteurs; i++) {
      if (mesCapteur[i].actif) { // si le capteur n'est pas actif on n'imprime pas

        // PRINT LES MESURES MESUREES
        itoa(mesMesures[i][mesCapteur[i].idDuCapteur].valeur, (char *) ptr, 10); // on écrit à partir de ptr la représentation ASCII en base 10 de la valeur de ibatt
        ptr += strlen((char *) ptr);
       
        if (i < nbMaxCapteurs-1)
        {
          *ptr = ','; // virgule
           ptr += sizeof(char);
        }
        else
        {
          *ptr = 0 ; // Je ferme
        }
      }
      else
      {
        if (i < nbMaxCapteurs-1)
        {
          *ptr = ','; // virgule
          ptr += sizeof(char);
        }
        else
        {
          *ptr = 0; // Je ferme. Pas de bouger le pointeur
        }
      }
     }

    // DEBUG Affiche le contenu de payload
    sprint(F("payload = {"),2);
    for (byte i = 0; i < payloadSize; i++) {
      //Serial.print("0x");
      if (payload[i] <= 0xF) sprint(F("0"),2);
      sprint(payload[i], HEX, 2);
      sprint(F(" "),2);
    }
    sprintln(F("}"),2);

 

Ce qui donne
Quote
Empilations des valeurs capteurs
---------------------------------------
payload = {34 33 31 2C 32 32 2C 39 37 30 2C 34 32 34 2C 34 33 2C 2C 30 2C 2C 2C 2C 00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 }

Vous remarquerez que je ferme bein ma chaine à envoyer grâce au 00

Et maintenant j'envoi
(Ca rien à voir avec ce que l'ona  vu ensemble, c'est ma librairie)
Code: [Select]

sprint(F("\nOpmode check: "), 2);
    LMIC_setTxData2(1, payload, strlen((char *)payload), 0);

os_setTimedCallback(j, os_getTime() + sec2osticks(WAIT_SECS), do_send);

  sprint(F("Sent: "), 2); sprintln((char *)payload, 2);

  sprint(F(" Time: "), 2); sprint((millis() - timer) / 1000, 2); sprintln(F("s"), 2);


et voilà ce qui est affiché dans mon terminal
Quote
Opmode check: Sent: 431,22,970,424,43,,0,,,,
 Time: 0s
EV_TXCOMPLETE, time: 17
DEBUG dataLen: 0

On voit bien que les 0x23 ne sont pas pris en compte

Et maintenant, si je vais voir dans ma console TTN


Et si je regarde les valeurs enregistrées, ceci
Quote
3433322C32332C3937302C3432342C34342C2C362C2C2C2C
est bien égal à
Quote
432,23,970,424,44,,6,,,,
COOOOOLLLL!!!

Maintenant, il me reste plus qu'a traiter les données reçue au serveur. Je pense qu'avec
Code: [Select]
{432,23,970,424,44,,6,,,,}
je vais trouver un truc avec javascript et json.


Voilà, j'espère avoir bien fait. Sîl y a des trucs à perfectionner, je suis à l'écoute, surtout si j'ai mal fait un passage  :)  :(  :o  :smiley-confuse:

En tout cas là, je vois que le serveur continue à recevoir des données..  :)


MILLES MERCIS J-M-L!!!!!!!
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

pierrot10

Hello, J'aimerais savoir si je pouvais revenir sur ce post qui me rappelle un beau boulot :o).
Ceci fonctionne très bien et je peux continuer ainsi.

Mais j'ai eu une discussion sur le forum de TTN et un anglophone, bien sympa, ma fait une théorie qui me trouble. J'avoue nager quant à la conversion des bytes

https://www.thethingsnetwork.org/forum/t/what-is-the-maximum-number-of-characters-i-can-send-with-lmic/9537/6?u=pierrot10


Les données doivent être envoyé en bytes. et j'ai un dout quant au code ci-dessous

Code: [Select]

const uint8_t payloadSize = 51;
void do_send(osjob_t* j){
// gettinh here 8 to 11 value of sensors
/*
     *  Prepare the data into payload before sending to TTN. The data must byte
    */
    uint8_t payload[payloadSize];
    uint8_t * ptr = payload;

    for(byte i = 0; i < nbMaxCapteurs; i++)
    {
      if (mesCapteur[i].actif)
      {
        itoa(mesMesures[i][mesCapteur[i].idDuCapteur].valeur, (char *) ptr, 10); // We wrote to ptr the representation ASCII in base 10 the value of a sensor
        ptr += strlen((char *) ptr);
    
          *ptr = ',';             // add virgule
          ptr += sizeof(char);    // move right

      }
      else
    
          *ptr = ',';             // Add a last ,
          ptr += sizeof(char);
        
      }
    }
    *ptr = 0; // Close



Si je me concentre la-dessus
Code: [Select]
itoa(mesMesures[i][mesCapteur[i].idDuCapteur].valeur, (char *) ptr, 10); // We wrote to ptr the

itoa convertit un interger en string
http://www.cplusplus.com/reference/cstdlib/itoa/
donc la valeur de
Code: [Select]
mesMesures[i][mesCapteur[i].idDuCapteur].valeur
(qui est un int8_t)
va etre sauvée dans ptr sous forme de caratères?

C'est juste ou je suis tout faux?
Si c'est bien ca, il faudrait que je change ceci afin d'être certain que j'envoie des bytes.

Quote
Just removing the {...} does not suffice. JSON is one of the many human-readable formats. Changing {"x": 123.45, "y": 45.678} into, e.g., 123.45,45.678 would still be a human-readable format, wasting bytes when sending to TTN.
J'avoue etre pas la hauteur mais je dois donc pacourir
Code: [Select]
mesMesures[i][mesCapteur[i].idDuCapteur].valeur
et encapsuler les données dans
Code: [Select]
uint8_t payload[51];
et m'assurer que payload soit des bytes.

Est-il toujours possible d'éclairer ma lanterne?  :)

PS: Ca fonctionne comme ceci, mais mon but est d'optimiser mon code pour éviter le gaspillage de temps d'antenne (wasting of air time)

Voici deux trois commentaires que j'ai eu
Quote
You should not think in characters, but only in bits and bytes. See Working with Bytes 8 in the documentation and learn that strcpy((char *) mydata,"{\"Hello\":\"World\"}"); in your example code is bad practice.


Using the (char *)mydata above you're telling the compiler that the program knows that what is currently in the memory buffer mydata is in fact human-readable text (and not, for example, some image, or a PDF document, or a simple number). The only reason the program knows, is because it has stored the value there itself (like by using strcpy earlier).

So, (char *) does not convert anything; it is already human-readable text in memory. And when trying to use a built-in function such as Serial.println to show its contents, then your program needs to share that knowledge with the compiler, by prefixing mydata with (char *). (Here, (char) tells the compiler it's human-readable text, and * gives the compiler a "pointer" to the memory location, which is simply what Serial.println expects.) That line would then print garbage if it was in fact not human-readable text. But as it apparently shows the value you expected, you're still storing human readable text in memory (and so you would also be sending that to TTN).
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

J-M-L

Quote
Code: [Select]
mesMesures[mesCapteur.idDuCapteur].valeur

(qui est un int8_t)
va etre sauvée dans ptr sous forme de caratères?
Oui à un endroit qui change car le pointeur bouge à chaque fois qu'on écrit dans la buffer

Au final tout est dans un ou des octets. Le type c'est pour aider le compilo à savoir ce que c'est et quoi en faire
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up