J-M-L:
avec les contraintes que vous donnez vous pouvez avoir 9 octets sur MKRFOX
struct __attribute__ ((packed)) sigfox_messageBig {
uint8_t tension; // 0 à 255
uint8_t essaimage; // 0 à 255
int8_t dhtTemperature; // -128° à 127°
int8_t temp2; // -128° à 127°
uint8_t dhtHumidity; // 0 à 100%
float poids;
} ;
mais vous pouvez faire mieux avec vos contraintes, sans pour autant modifier la façon dont on accède aux champs de la structure: Vous pouvez d'utiliser [des champs de bit](http://en.cppreference.com/w/cpp/language/bit_field) (bit field pour les anglophones) - ça donne ce que l'on attend d'un point de vue représentation mémoire
struct attribute ((packed)) sigfox_messageSmall {
uint8_t tension : 7; // 7 bits (0 à 127)
uint8_t essaimage: 1; // 1 bit (0 ou 1)
int8_t dhtTemperature; // -128° à 127°
int8_t temp2; // -128° à 127°
uint8_t dhtHumidity; // 0 à 100%
float poids;
} ;
Voici un petit programme d'essai
/*
tension de la batterie de 00 à 100
essaimage = 1 ou 0
poids : avec 3 chiffres après la virgules
dhtHumidity : entier sur 2 chiffre
temp2 et dhtTempearature : entier sur 2 chiffre
*/
struct attribute ((packed)) sigfox_messageBig {
uint8_t tension; // 0 à 255
uint8_t essaimage; // 0 à 255
int8_t dhtTemperature; // -128° à 127°
int8_t temp2; // -128° à 127°
uint8_t dhtHumidity; // 0 à 100%
float poids;
} ;
struct attribute ((packed)) sigfox_messageSmall {
uint8_t tension : 7; // 7 bits (0 à 127)
uint8_t essaimage: 1; // 1 bit (0 ou 1)
int8_t dhtTemperature; // -128° à 127°
int8_t temp2; // -128° à 127°
uint8_t dhtHumidity; // 0 à 100%
float poids;
} ;
sigfox_messageBig enregistrement1;
sigfox_messageSmall enregistrement2;
void printBinary(uint8_t * ptr, byte n)
{
for (int i = n - 1 ; i >= 0; --i) {
for (int b = 7; b >= 0; --b) {
if (bitRead(*(ptr + i), b)) Serial.print("1");
else Serial.print("0");
}
Serial.print(" ");
}
}
void setup() {
uint8_t * ptr;
Serial.begin(115200);
while (!Serial);
Serial.println("****** structure de base ******");
Serial.print("Taille d'un enregistrement Big = ");
Serial.println(sizeof(enregistrement1));
ptr = (uint8_t *) &enregistrement1;
enregistrement1.tension = 64 + 16 + 4 + 1; // on devrait voir B01010101
enregistrement1.essaimage = true; // le bit de poids faible à 1
printBinary(ptr, 1); Serial.println("\ttension");
printBinary(ptr + 1, 1); Serial.println("\tEssaimage");
Serial.println("\n****** avec champs de bit ******");
Serial.print("Taille d'un enregistrement Small = ");
Serial.println(sizeof(enregistrement2));
ptr = (uint8_t *) &enregistrement2;
enregistrement2.tension = 64 + 16 + 4 + 1; // on devrait voir B01010101
enregistrement2.essaimage = false; // le bit de poids fort à 0
printBinary(ptr, 1); Serial.println("\tEssaimage et Tension");
enregistrement2.essaimage = true; // le bit de poids fort à 1
printBinary(ptr, 1); Serial.println("\tEssaimage et Tension");
enregistrement2.tension = 8 + 4 + 2 + 1; // les 4 bits de poids faibles à 1
printBinary(ptr, 1); Serial.println("\tEssaimage et Tension");
}
void loop() {}
si vous l'exécutez vous verrez dans la console série:
[sub][color=blue]****** structure de base ******
Taille d'un enregistrement Big = 9
01010101 tension
00000001 Essaimage
****** avec champs de bit ******
Taille d'un enregistrement Small = 8
01010101 Essaimage et Tension
11010101 Essaimage et Tension
10001111 Essaimage et Tension
[/color][/sub]
al1fch:
Bonjour
optimisation possible en réduisant le nombre de bits de chaque élément du message
première étape , sans compliquer le traitement :
dhtTemperature, temp2, dhthumidité, tension : 8 bits au lieu de 16 (int8)
essaimage : 1 bit (uint:1, côté portail Sigfox)
En compliquant un peu , au vu de la plage des données, il est possible de tasser encore plus en n'allouant que 7 bits à tension et les deux dht (7 bits suffisent pour coder un entier de 0 à 127)
voir par exemple cette page du site Framboise 314 (bas de page "Dans 12 octets qu'est-ce que tu veux mettre ?"
ok merci votre optiomisation a fonctionné avec mon code, mais si je veux rajouter 3 autres load cell ? ca passe plus en taille, je ne sais pas quoi mettre.