envoi de données poids sigfox

Bonjour
Je débute avec arduino,
je souhaite envoyer des données de poids de ma balance vers sigfox mais j'ai du mal a trouver un bon exemple sur internet.

voici mon code pour le pesage :

#include "HX711.h"

HX711 scale;

void setup() {
  Serial.begin(38400);
  //Serial.println("HX711 Demo");

 // Serial.println("Initializing the scale");
  // parameter "gain" is ommited; the default value 128 is used by the library
  // HX711.DOUT	- pin #A1
  // HX711.PD_SCK	- pin #A0
  scale.begin(A1, A0);
  scale.set_scale(23150.f);                      // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();				        // reset the scale to 0
}

void loop() {
  Serial.print("Poids :\t");
  Serial.print(scale.get_units(), 5);
 
  scale.power_down();			        // put the ADC in sleep mode
  delay(5000);
  scale.power_up();
}

j'ai fait un petit tuto de Découverte du MKRFOX 1200 qui utilise la librairie sigfox pour un exemple d'envoi d'une température

oui, je l'ai vu mais la partie envoie je ne comprends pas le fonctionnement

SigFox.write((uint8_t*)&msg, sizeof(SigfoxMessage));

Cette commande write() de la librairie prend deux paramètres : un pointeur vers la zone mémoire de début des données et le nombre d'octets à envoyer

j'ai stocké en mémoire dans la structure msg ma température (transformée pour le fun en entier en centièmes de degrés). donc &msg est l'adresse (le pointeur) vers ma structure de données. comme la fonction attend un pointeur vers un octet, je convertis le type avec un cast explicite (uint8_t*) en entier 8 bit non signés (un octet).

Ensuite il faut dire combien d'octets on va envoyer, et donc j'utilise la fonction sizeof() qui vous dit combien d'octets sont utilisés par un type ou une variable. SigfoxMessage c'est le nom du type de ma structure, donc sizeof(SigfoxMessage) va me dire combien d'octet je dois envoyer.

-->d'où le

SigFox.write((uint8_t*)&msg, sizeof(SigfoxMessage));

J'aurais pu me passer de la structure et juste mettre la T° dans une variable et passer l'adresse de cette variable et utiliser sizeof() de la même manière pour calculer le nombre d'octets à envoyer mais cette approche par structure est plus évolutive, si je voulais envoyer plus de choses, je les ajouterai dans ma structure et le code d'envoi ne changera pas.

OK ?

Bonjour,
j’ai adapté votre code pour avoir des valeurs temperature et humidité de mon capteur DTH22 pour pouvoir recevoir par email les données avec les , et cela fonctionne.

typedef struct __attribute__ ((packed)) sigfox_message { // see http://www.catb.org/esr/structure-packing/#_structure_alignment_and_padding
  //int16_t moduleTemperature;
  float dhtTemperature;
  float dhtHumidity;
  float poids;
} SigfoxMessage;
float t = dht.readTemperature();
 float h = dht.readHumidity();
 float poids = (scale.get_units(), 3);

  msg.dhtTemperature = (float) (t);
  msg.dhtHumidity = (float) (h);
  msg.poids = (float) (poids);

par contre pour la mesure du poids je bute sur la déclaration de cette variable
je ne sais pas ce qu’il faut mettre
j’ai ceci : float poids = (scale.get_units(), 3);
et :
Serial.print(poids); me donne 3
alors que
Serial.print(scale.get_units(), 3); me donne le bon resultat de ma pesée

je voudrais transmettre le poids vers SIGFOX
Merci de votre aide :

en C++, la virgule peut séparer deux expressions et retourne comme valeur l'évaluation de la seconde expression. par exemple

int x = 10, 20; // met 20 dans x, 10 est ignoré

Donc ce code float poids = (scale.get_units(), 3);
eut dire appeler la méthode get_units() sur l'objet scale, mettre le résultat à la poubellle et retourner la valeur 3 qui sera stockée dans la variable de type flottant poids...

bref, ça fait pareil que

float poids = 3;

Alors que Serial.print(scale.get_units(), 3);
veut dire appeler la méthode get_units() sur l'objet scale, passer ce résultat à la fonction print, et dire combien de chiffre on veut après la virgule avec le second paramètre de print, ici 3.

bref faites float poids = scale.get_units(); et vous aurez votre valeur dans la variable poids

Super, ça marche :slight_smile:

Pouvez vous m'indiquer comment l'on peut afficher une données poids en Kg sous ce format : x.xxx Kg ?
j'ai bien la valeur retournée par la balance sous forme de nombre avec 10 chiffres après la virgule.

Faut-il que je convertisse cette données avant de l'envoyer ou modifier mon callback pour afficher le bon format :
ma configuration est :
poids::float:32:little-endian dans le payload config
et
Poids {customData#poids} Kg
dans le corps du mail

Merci encore de votre aide

Que recevez vous dans le mail ? trop de chiffres après la virgule? si c'est cela votre problème, tronquez la valeur lue avant l'émission

float v1 = 1.23456789
unsigned long v2 = v1 * 1000; // va ne conserver que la partie entière en prenant 3 décimales v2 sera 1234
v1 = v2 / 1000.0 // va remettre dans v1 1.234, vous avez ainsi enlevé les autres décimales
// reste plus qu'à envoyer v1

Peut t'on envoyer 2 messages différents avec sigfox dans le même programme :

on a :

typedef struct __attribute__ ((packed)) sigfox_message { 
  int16_t temp2;
  int16_t dhtTemperature;
  uint16_t dhtHumidity;
  float poids;
  
  } SigfoxMessage;

// stub for message which will be sent

SigfoxMessage msg;

ce qui sert de structure du message à envoyer
mais si je veux transmettre une seule données dans un autre message par exemple un message d'alarme.
Est ce que je peux déclarer une seconde structure ? et comment ? Merci

mais si dans mon programme je veux changer de structure pour envoyer un autre message (d'alarme par exemple) comment déclarer une nouvelle structure de message ?

Bonjour

Est ce que je peux déclarer une seconde structure ? et comment ? Merci
mais si dans mon programme je veux changer de structure pour envoyer un autre message (d'alarme par exemple) comment déclarer une nouvelle structure de message ?

Il me semble que , pour tenir compte des contraintes (actuelles ?) de Sigfox, il faut inclure l'alarme dans LA structure (unique)

Si tu envoies à Sigfox un message construit sur la base d'une autre structure que celle qu'il connait ("grammaire de décodage") il me semble qu'il ne saura pas quoi en faire.

LA structure DU message qu'on déclare dans le backend de Sigfox pour un device donné me parait unique. (simple impression issue d'une pratique limite et récente de Sigfox......sans MKRFOX1200.)

En gros : il faut loger l'info 'alarme' dans l'espace de 12 octets (1 bit, ça doit être possible de le caser ....quitte à 'serrer' un peu les autres infos) L'application , le service , qui assurera la présentation des infos relayées par Sigfox (ThingSpeak peut être) se chargera de réagir à un changement de valeur de la variable 'alarme'.

Il y a peut être une combine pour que Sigfox réagisse à des messages qui sont tantôt des données tantôt un événement d'alarme et qu'il traite différemment ces deux types de messages.

La grammaire de décodage est propre au type de message reçu, dans le Back-End de Sigfox, chaque type de message URL, Mail, à son propre champs de decodage de grammaire.
Ensuite je peux créer un second message pour décoder ce message, mais je ne vois pas comment, une fois j’envoie des données sur un serveur via une url et si une alarme je l'envoi par mail si la structure est unique.
on peut créer plein de callback avec sigfox avec autant de decodage de message, mais effectivement je ne voit pas ou l'on peut faire le distingo d'un message A ou B

"Type de message" : j'en vois trois DATA, SERVICE, ERROR.

Seul le premier type prend en charge des données 'utilisateur' (custom), cohérentes avec la structure définie à l'émission , données utilisateur qu'il est possible de passer à une url, un mail....

Les seules variables utilisateur disponibles sont celles qui ,par ailleurs ,ont été définies dans l'écran 'payload display'.

Je ne vois pas de choix multiple possible et de règle permettant à Sigfox de traiter de manière différenciée les messages (du type DATA) reçus contenant des données émises.

........Quelque chose m'échappe peut être, tout cela est pour moi 'tout nouveau'....

D'ou l'idée de passer toute les variables(alarme incluse) à quelque chose comme ThingSpeak qui saura , lui, traiter les divers éléments et envoyer par exemple une alerte. Il me semble que le traitement des données n'est pas (aujourd'hui) du ressort de Sigfox.

Tu peux :

-ajouter une variable 'alarm' à la structure émise par le MKRFOX1200,
-déclarer cette variable dans le backend Sigfox : Menu Edition.... Payload display, custom grammar, custom configuration,
-créer un callback spécifique type Data, Uplink, url qui extrait la seule variable alarm et l'envoie vers un site tiers (ThingSpeak, IFTTT......etc)ou un serveur perso qui réagira en cas de passage de la variable 'alarm' de 0 à 1 (mail, sms, notification...).

Dans ce 'montage' la variable 'alarm' serait actualisée toutes les 15' (si c'est l'intervalle choisi) , Sigfox la retransmet au service chargé de détecter l'évènement (passage de la variable de 0 à 1) et déclencher l'action d'avertissement.

IFTTT à l'air sympa, mais je n'ai pas trouver la façon de faire pour lire les données, l'action channel MAKER n'existe plus ? il est impossible de le selectionner, a moins qu'il est changé de nom ?
Si quelque a déja expérimenter IFTTT ?

la dernière fois que j'ai utilisé IFTTT c'était avec Maker
.......probablement remplacé par Webhooks...

Alors voila, c'est effectivement Webhooks qui le remplace, mais je ne vais pas m'en servir.
Je fait une nouvel Applet avec Email :

Pour résoudre mon problème initial d'alarme si poids = 0 voila ce que j'ai fait

1 - Je reçoi déja à l'aide de sigfox un message par mail de mes données avec un CALLBACK DATA UPLINK EMAIL

2 - Je cré un second CALLBACK email contenant la seule donnée qui m'interesse ici : le poids avec une entete spécifique (#IFTTT).

3- Je crée une regle dans mon logiciel de messagerie qui dit que si le mail contient #IFTTT et que dans le corps du message poids = 0 alors le message est transféré à trigger@applet.ifttt.com

4 -il suffit ensuite dans IFTTT de créer une règle email avec condition : entete = #IFTTT et qui provient de mon email alors il envoi un SMS...
If send trigger@applet.ifttt.com an email tagged #IFTTT from xxx@orange.fr, then send me an SMS at 00336XXXXXXXX (update phon

Merci IFTTT et merci al1fch pour l'info.
Il me reste plus qu'à modifier mon code pour l'envoi de ce message spécifique si le poids =0

Super !! bonne idée , le filtrage et la règle par le logiciel de messagerie !!

de mon côté je n'avais probablement pas suivi d'assez près le fil de discussion et je pensais que l'alarme n'était plus liée au poids mais à un contact dédié.

je viens de faire un petit test avec une variable binaire 'alarme' ajoutée à la 'grammaire' + un callback spécifique qui 'titille' IFTTT envoyant la valeur 0 ou 1 de l'alarme...... + une règle (applet) IFTTT est programmée pour envoyer un mail si la variable vaut 1, pas de règle programmée quand la variable vaut 0

Finalement , malgré ses limites, IFTTT permet de 'prolonger' facilement l'action du backend Sigfox en attendant que les fonctionnalités de ce dernier se développent !!