Téléversement infini

Bonjour,

Cela fais quelques jours que je bidouille mon arduino MKR FOX 1200.
Tout allais bien, j'ai tester différents capteurs.
Je me suis lancer au tuto de J-M-L : Découverte du MKRFOX 1200 - Tutoriels et cours - Arduino Forum

Tout à bien fonctionner.

Je me suis dis bon, faut faire des tests pour envoyer les données de mes capteurs de température / humidité avec SigFox car c'est tout autre choses maintenant.

J'ai fais plusieurs tests où j’obtenais pas ce que je voulais jusqu'au moment où téléversement infini..

Même avec le code de J-M-L ou les petits code retourné a l'ordi ,il ne ce passe plus rien. L'IDE plante quand je veux ouvrir le moniteur série.

J'ai comme erreur : Une erreur est survenue lors du transfert du croquis

L'IDE détecte bien ma carte sur le port COM5
Toutes les bibliothèques adéquate sont installées.

J'ai testé avec une autre carte arduino mkr wifi 1010. Pas de problème de téléversement.

J'ai chercher toute l'après-midi une solution à mon problème.. J'espère vraiment ne pas l'avoir bousillé :confused:

Essayez de faire un “double click” sur le bouton reset de votre MKRFox

Parfait ! Après plusieurs tentative ça a fonctionné ! :slight_smile:

Je sais que ce n’est pas le sujet, c’est assez compliqué de comprendre les conversions, les bits etc …

Est ce que ce premier bout de code la syntaxe et l’utilisation de SigFox est bonne ?

#include <SigFox.h>
#include <TH02_dev.h>
#include "Arduino.h"
#include "Wire.h"


typedef struct __attribute__ ((packed)) sigfox_message {
  int16_t temper;
  int16_t humidity;
} SigfoxMessage;

// stub for message which will be sent
SigfoxMessage msg;

// =================== UTILITIES ===================
void reboot() {
  NVIC_SystemReset();
  while (1);
}
// =================================================


void setup() {
  Serial.begin(115200);
  while (!Serial);

  if (!SigFox.begin()) {
    Serial.println("SigFox error, rebooting");
    reboot();
  }

  delay(100); // Wait at least 30ms after first configuration

  TH02.begin();
  delay(100);
  
  // Enable debug prints and LED indication
  SigFox.debug();

  // Read and convert the module temperature
  msg.temper = (int32_t) (TH02.ReadTemperature() * 100.0);
  Serial.print("Temperature: ");
  Serial.print(msg.temper, HEX); // display what we will send in Hexadecimal
  
  Serial.print(msg.temper); // display what we will send in Decimal
  Serial.println(" x100 deg C)");

  // Read and convert the module humidity
  msg.humidity = (int32_t) (TH02.ReadHumidity() * 100.0);
  Serial.print("Humidity: ");
  Serial.print(msg.humidity, HEX); // display what we will send in Hexadecimal
  
  Serial.print(msg.humidity); // display what we will send in Decimal
  Serial.println(" x100 deg C)");
  

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

  // Send the data
  SigFox.beginPacket();
  SigFox.write((uint8_t*)&msg, sizeof(SigfoxMessage));

  Serial.print("Status: ");
  Serial.println(SigFox.endPacket());

  SigFox.end();
}

void loop() {}

J’obtiens sur le back-end :

250bf916
temp: 2853
humi: 5881

La custom grammar : temp::int:16:little-endian humi::int:16:little-endian

J’ai bien 28 °C et 58 % humidité

Mais ai-je complètement juste ? J’arrives pas vraiment a comprendre la taille du msg que j’envoie en octet. Sachant que j’aurais 4-6 capteurs en plus connecté je devrais optimiser cette envoie ?

Pour la conversion j’aurais pu utiliser ceci ? :

float t = TH02.ReadTemperature();
msg.temper= (float) (t);
Serial.print(msg.temper);

Je sais que :

int16_t : Nombre entier signé de 2 octets
int32_t : Nombre entier signé de 4 octets
uint8_t : Nombre entier non signé d’1 octet

Quel est la différence entre int et uint ?

Je suis entrain de lire une doc d’oracle là dessus, quelques post vous concernant à ce sujet mais franchement il y a tellement d’informations que j’arrives pas trop à comprendre …

Si vous avez des tutos/cours pour s’entraîner et mieux comprendre je suis preneur !

Merci d’avance :slight_smile:

Quel est la différence entre int et uint ?

un int est un entier signé (positif ou négatif). un uint est un entier non signé (unsigned)

ils occupent le même nombre d’octets, c’est juste les valeurs min et max représentables qui ne sont pas les mêmes.

Le nombre d’octets qu’un int occupera dépend des plateformes. Sur AVR ce sera 2 octets mais ce sera 4 sur MKR

comme vous avez des messages à bien condenser, utiliser la notation int16_t ou uint16_t pour vous assurer que vous connaissez exactement le nombre d’octets alloués.

Note que vous n’avez pas besoin de donner 2 noms à votre structure, un seul suffit

typedef struct __attribute__ ((packed)) [color=red]sigfox_message[/color] {
  int16_t temper;
  int16_t humidity;
} [color=red]SigfoxMessage[/color];

L’humidité étant entre 0% et 100%, ça rentre dans un uint8_t donc pas la peine de prendre 2 octets.

Pour voir la taille de la structure qui va être envoyée, utiles sizeof()

typedef struct __attribute__ ((packed))  {
  int16_t temper; // 2 octets
  uint8_t humidity; // 1 octet
} sigfox_message_t;

// stub for message which will be sent
sigfox_message_t msg;


void setup()
{
  Serial.begin(115200);
  Serial.print(F("Taille de la structure: "));
  Serial.println(sizeof(sigfox_message_t)); // 2 + 1 = 3 donc on devrait avoir 3 en réponse
}

void loop() {}

Super! Merci :slight_smile:

J'ai changé comme vous m'avez dis en unint8_t humidity;

J'ai changé mon custom grammar : humi::uint:8:little-endian

Sur le back-end j'ai :

020bba
temp: 2818
humi: 186

Du coup, l'humidité est faussé..

J'ai utilisé :

float t = TH02.ReadHumidity();
msg.humidity = (float) (t);
Serial.print("Humidity :");
Serial.println(msg.humidity);

ça me retourne les bonnes valeurs mais sans chiffres après la virgule, j'aimerais avoir comme pour la température deux chiffres après la virgule :slight_smile:

A quel niveau dois-je me pencher ?

vous avez bien confiance dans votre capteur....

le TH02 retourne une humidité relative à ±4.5% près... donc quand il dit 80% ça veut dire entre 76,4% et 83,6%... vous n'êtes donc même pas sûr des unités... alors 2 chiffres après la virgule... :slight_smile:

Si vous y tenez alors vous ne pouvez plus transmettre entre 0 et 100 en entier.

  • soit vous envoyez un float et ça prend 4 octets et vous déclarez un float dans la structure

  • soit vous transformez votre float en entier avec 2 chiffres après la virgule en faisant msg.humidity = TH02.ReadHumidity()*100;

mais comme l'humidité va varier entre 0 et 100, ça veut dire qu'il faut pouvoir représenter entre 0 et 10000 ce qui tient dans un uint16_t comme vous aviez au début

ma recommandation cependant c'est puisque ce que vous affichez n'est déjà pas précis au niveau des unités, ne vous ennuyez pas à envoyer ce qu'il y a après la virgule... vous généreriez un nombre aléatoire côté réception pour faire les décimales que ce serait quasiment pareil...

Sur vos conseils, je restes alors en nombre entier !

Merci :slight_smile:

Il y a un point qui m’intrigue:
quel est la plage de variation de la température ?
Parce que, si on la code en entiers et qu’on admet qu’elle pourra varier entre -127 et 127 (plus que certains capteurs peuvent tolérer), on peut en faire un int8_t…

dbrion06:
Il y a un point qui m'intrigue:
quel est la plage de variation de la température ?
Parce que, si on la code en entiers et qu'on admet qu'elle pourra varier entre -127 et 127 (plus que certains capteurs peuvent tolérer), on peut en faire un int8_t...

Effectivement, la plage de température est comprises entre -127 et 127.
L'utilisation sera de température ambiante( ~26) à réchauffement du moteur de la machine ( donc pas que ça dépasse les 127 !

Ensuite ça dépend si vous voulez un chiffre après la virgule ou pas aussi pour la température

Votre capteur est il capable sans atroces -et irreversibles- souffrances de mesurer 120 C? GitHub - Seeed-Studio/Grove_Temper_Humidity_TH02: Grove_Temper_Humidity based on TH02 indique que, au delà de 70C, il devient fou...

Si sigfox accepte des entiers sur 8 bits (je ne l'ai pas verifié) , vous avez divisé la taille de vos données par 2...

Normes de gamme de température :
Gamme Basique : 0°C +70°C
Gamme Industrielle : - 20°C + 80°C. Actuellement plutôt - 40°C + 85°C
Gamme Militaire : - 40°C +125°C

La température est celle de l'ambiance dans laquelle est placé le composant.

J-M-L:
Ensuite ça dépend si vous voulez un chiffre après la virgule ou pas aussi pour la température

Oui, je gardes les chiffre après la virgule !

dbrion06:
Votre capteur est il capable sans atroces -et irreversibles- souffrances de mesurer 120 C? GitHub - Seeed-Studio/Grove_Temper_Humidity_TH02: Grove_Temper_Humidity based on TH02 indique que, au delà de 70C, il devient fou...

Je ne vais jamais monté dans des température aussi hautes, c'est juste un PoC qu'on va brancher sur une machine type "industriel" pour faire des démonstration :slight_smile:

dbrion06:
Si sigfox accepte des entiers sur 8 bits (je ne l'ai pas verifié) , vous avez divisé la taille de vos données par 2...

Pour cela, que je veux des chiffres après la virgule pour donné un côté plus bling bling etc.. ce qu'on propose en réalité sera la plateforme/service clients/support !

68tjs:
Normes de gamme de température :
Gamme Basique : 0°C +70°C
Gamme Industrielle : - 20°C + 80°C. Actuellement plutôt - 40°C + 85°C
Gamme Militaire : - 40°C +125°C

Merci pour ses précisions ! Je vais aller lire tout ça :slight_smile: