callback Sigfox via email

Bonjour
Je teste actuellement la fonction callback de Sigfox avec l'arduino MKRFOX1200,
Je recoit des mails concernant les capteurs, mais les résultats ne sont pas en ° pour la température et en % pour l'humidité.
Voici le code que j'utilise, je doit pas bien m'y prendre.

Type : DATA / UPLINK
Channel : EMAIL
Custom paylod config :
moduleTemp::int:16:little-endian dhtTemp::int:16:little-endian dhtHum::uint:16:little-endian lastMsg::uint:8

Sujet du mail :
Température {customData#dhtTemp}"°C",Taux d'humidité {customData#dhtHum}

et j'obtiens ceci par exemple :
Voici le dernier relevé :

Température 5352"°C",Taux d'humidité 21448

Et comment vous émettez les éléments (codage hexa de vos valeurs) ?

int16_t convertoFloatToInt16(float value, long max, long min) {
float conversionFactor = (float) (INT16_t_MAX) / (float)(max - min);
return (int16_t)(value * conversionFactor);
}

uint16_t convertoFloatToUInt16(float value, long max) {
float conversionFactor = (float) (UINT16_t_MAX) / (float)(max);
return (uint16_t)(value * conversionFactor);

float h = dht.readHumidity(); // Read temperature as Celsius (the default)
float t = dht.readTemperature();

SigFox.begin();
// Wait at least 30ms after first configuration (100ms before)
delay(100);

// We can only read the module temperature before SigFox.end()
t = SigFox.internalTemperature();
msg.moduleTemperature = convertoFloatToInt16(t, 60, -60);

// Clears all pending interrupts
SigFox.status();
delay(1);

SigFox.beginPacket();
SigFox.write((uint8_t*)&msg, 12);

msg.lastMessageStatus = SigFox.endPacket();

SigFox.end();
//Sleep for 15 minutes
LowPower.sleep(SLEEPTIME);

Manque du code là...
Structure de msg? pourquoi 12 (longueur max) alors que vous envoyez 2 octets? Vous comprenez ce que fait convertoFloatToInt16()?

(et ce serait mieux avec les Tags de code svp)

j'ai pris un peu de temps aujourd'hui pour récapituler mes premiers pas avec le MKRFOX 1200 et j'ai pris comme exemple une partie de ce que vous voulez faire pour envoyer la T° du module, en centième de degrés sous forme entière (26.5° sera envoyé sous forme de 2650 convertit en hexadécimal)

ensuite il ne vous reste plus qu'à configurer le callback en ayant donné la bonne grammaire

Bonjour JML,
je débute en Iot et je bloque également sur le passage de données température ( qui peuvent-être négatives) et le poids d'une ruche (de 0 a 50kg).
si la température est négative, votre conversion en HEXA *100 conserve-t-elle le signe ?

Dans votre code vous déclarez dans la structure du message :
int16_t moduleTemperature;

et dans le code plus bas :
msg.moduleTemperature = (int32_t) (SigFox.internalTemperature() * 100.0);

je ne comprends pas le passage int32_t vers int16_32

D'avance merci

nicozozo:
si la température est négative, votre conversion en HEXA *100 conserve-t-elle le signe ?

Dans votre code vous déclarez dans la structure du message :
int16_t moduleTemperature;

et dans le code plus bas :
msg.moduleTemperature = (int32_t) (SigFox.internalTemperature() * 100.0);

je ne comprends pas le passage int32_t vers int16_32

c'est effectivement une idiotie de ma part :slight_smile: j'aurais dû mettre (int16_t) ou rien du tout (mais ça ne fait pas de bug)

la fonction SigFox.internalTemperature() retourne un float(), 100.0 sera en float, donc la multiplication par 100.0 est effectuée en float. Ensuite on veut tronquer le résultat pour le mettre sur 16 bits, donc ça ne sert à rien de le tronquer d'abord sur 32 bits pour copier ensuite les 16 bits dans la variable de destination. on peut même laisser faire le compilateur il sait faire cela très bien.

Le signe lui est propagé correctement. si j'ai -12.244 x 100 = -1224,4 et quand on tronque ça fait -1224. que ce soit présenté en hexadécimal ne change rien, au final dans la mémoire de l'Arduino c'est toujours en binaire (base 2).

==> Le décimal, l'hexadecimal etc ce sont juste des représentation "humaines" plus condensées et lisibles de ces 0 et 1. Ce sont les 0 et 1 qui sont transmis et si de l'autre côté vous lui avez bien dit que vous émettez une donnée sur 2 octets, qui est un entier signé, codé en little endian alors ça va décoder correctement.