nrf24, lire deux adresses de transmetteurs en même temps

Bonjour,

voici mon problème : je tente de lire les données issues de deux transmetteurs nrf24 situés à deux endroits différents, un dans une serre (avec trois données de température) et un sous une ruche (avec une donnée de poids et une de température). Le receveur est un nrf24.

Je définis pour cela deux tableaux :

float dataS[3];
float dataR[2];

et deux adresses de transmetteurs différents que je reçois sur 2 pipes différents :

const uint64_t pipe1 = {0xE8E8F0F0E1LL};
const uint64_t pipe2 = {0xE8E8F0F0E2LL};

puis j'ouvre les deux pipes :

Serial.begin(115200);
  radio.begin();     // initialisation du NRF24.
  Wire.begin();
  radio.openReadingPipe(1, pipe1); //ouverture du pipe 1
  radio.openReadingPipe(2, pipe2); //ouverture du pipe 2
  radio.startListening(); // ecoute de l'emetteur

enfin, j'attends la transmission des deux sites :

void receiveinfo() {

 if (radio.available(pipe2)) // si transmission de la ruche (pipe 2) on lit les donnees
 {
  radio.read(dataR, sizeof(dataR)); // lit les trames envoyees 
  delay(500);
  Serial.println("Envoi des donnees de la ruche");
  temp_ruche = (dataR[0]); // on enregistre la temperature ds la ruche
  poids =  (dataR[1]); // on enregistre le poids de la ruche 
  Serial.print("Poids de la ruche:");
  Serial.println(poids,2);
  Serial.print("temperature dans la ruche :");
  Serial.println(temp_ruche,2);
  delay(5000);
  
}
  else{
  Serial.println("Attente de transmission depuis la ruche");
  delay(200);}


 if (radio.available(pipe1)) // si transmission de la serre (pipe 1) on lit les donnees
 {
  delay(500);
  radio.read(dataS, sizeof(dataS)); // lit les trames envoyees 
  delay(200);
  Serial.println("Envoi des donnees de la serre");
  tempSerre = (dataS[0]); // on enregistre la temperature ds la serre
  tempBacext = (dataS[1]); // on enregistre la temperature ds le bac externe
  tempBacint = (dataS[2]); // on enregistre la temperature ds le bac interne 
  delay(200); 
  Serial.print("temperature dans la serre :");
  Serial.println(tempSerre,2);
  Serial.print("temperature dans le bac interne :");
  Serial.println(tempBacint,2);
  Serial.print("temperature dans le bac externe :");
  Serial.println(tempBacext,2);
  delay(5000);
  
}

else{
  Serial.println("Attente de transmission depuis la serre");
  delay(1000);}
}

Mon problème est que les données de la ruche arrivent alternativement dans les deux tableaux

voilà ce que donne la sortie :

1) quand aucune donnée n'est émise :

Attente de transmission depuis la ruche Attente de transmission depuis la serre 23 December 2017 11:35:50 35

2) première donnée transmise, tout va bien...

Envoi des donnees de la ruche Poids de la ruche:6.17 temperature dans la ruche :6.25 Attente de transmission depuis la serre 23 December 2017 11:35:17 35

3) deuxième donnée transmise, ça se gâte...

Envoi des donnees de la ruche Poids de la ruche:16.06 temperature dans la ruche :11.50 Attente de transmission depuis la serre 23 December 2017 11:37:14 37

Les données correspondent aux températures dans la serre (moins une car le tableau la tronque)

4) troisième donnée ça continue à se gâter...

Attente de transmission depuis la ruche Envoi des donnees de la serre temperature dans la serre :6.25 temperature dans le bac interne :0.00 temperature dans le bac externe :6.17 23 December 2017 11:38:16 38

Là, ce sont les données de la ruche qui sont envoyées dans le tableau censé recueillir les données de la ruche.

Bref, je tourne en rond, les émetteurs fonctionnent parfaitement, mon recepteur itou. Je me plante sans doute dans la gestion des tableaux ou des channels ou ou...

J'attends votre coup de main.

de mémoire je crois que radio.available()attend un pointeur vers le N° du pipe

essayez avec if(radio.available([color=red](uint8_t *) &pipe1[/color])) {

(ou retrouvez la doc - c'est encore le mieux :)) )

Bonsoir,

et merci du coup de main.

En fait j'avais lu la doc et j'avais tenté d'utuliser la commande "radio.available(uint8_t * pipe1)" c’est-à-dire ce qui est recommandé dans RF24 Class Reference mais ça ne compilait pas et je ne comprenais pas le message d'erreur d'où ma simplification.

L'écriture qui semble correcte est plutôt donc :

if (radio.available((uint8_t *) pipe1)) le "&" semble inutile.

En fait, il faut bien les parenthèses entourant le pointeur comme vous l'avez écrit. Donc de ce côté, ça compile et ça tourne bien mais, si les 3 premières mesures sont correctes (mesure ruche, mesure serre, mesure ruche) ensuite la mesure ruche suivante donne les deux premières valeurs de la serre et la mesure serre suivante le poids et la température dans la ruche...

donc j'ai un peu avancé mais il y a une erreur dans mon programme et je ne la vois toujours pas.

cordialement

Non il faut le & !!!

Bonsoir,

OK, mais avec ou sans & j'ai le même résultat : seul un tableau se remplit.

voici le bout de programme en question;

void receiveinfo() {

 if (radio.available((uint8_t *) &pipeR)) // si transmission de la ruche (pipeR canal R) on lit les donnees
 {
 // delay(1000); 
  radio.read(dataR, sizeof(dataR)); // lit les trames envoyees 
  delay(100);
  Serial.println("Envoi des donnees de la ruche");
  temp_ruche = (dataR[0]); // on enregistre la temperature ds la ruche
  poids =  (dataR[1]); // on enregistre le poids de la ruche 
  delay(100);
  Serial.print("Poids de la ruche:");
  Serial.println(poids,2);
  Serial.print("temperature dans la ruche :");
  Serial.println(temp_ruche,2);
 // delay(2000);
  }
   else{
   Serial.println("Attente de transmission depuis la ruche");
 }

 if (radio.available((uint8_t *) &pipeS)) // si transmission de la serre (pipeS canal S) on lit les donnees

 {
  radio.read(dataS, sizeof(dataS)); // lit les trames envoyees 
  delay(100);
  Serial.println("Envoi des donnees de la serre");
  tempSerre = (dataS[0]); // on enregistre la temperature ds la serre
  tempBacext = (dataS[1]); // on enregistre la temperature ds le bac interne
  tempBacint = (dataS[2]); // on enregistre la temperature ds le bac interne 
  delay(100); 
  Serial.print("temperature dans la serre :");
  Serial.println(tempSerre,2);
  Serial.print("temperature dans le bac interne :");
  Serial.println(tempBacint,2);
  Serial.print("temperature dans le bac externe :");
  Serial.println(tempBacext,2);
  
}

else{
 Serial.println("Attente de transmission depuis la serre");
 }

}

Si la fonction démarre avec :

if (radio.available((uint8_t *) &pipeS))

seul le tableau dataS se remplit à partir des deux canaux. Si la fonction démarre avec :

if (radio.available((uint8_t *) &pipeR))

c'est le tableau dataR qui se charge.

et ça donne par exemple :

Envoi des donnees de la serre

temperature dans la serre :3.00

temperature dans le bac interne :0.00

temperature dans le bac externe :3.30

Envoi des donnees de la serre

temperature dans la serre :9.50

temperature dans le bac interne :12.69

temperature dans le bac externe :32.94

Envoi des donnees de la serre

temperature dans la serre :3.00

temperature dans le bac interne :0.00

temperature dans le bac externe :3.30

Les 3 premières données concernent la ruche (d'où une valeur zér0). Les 3 suivantes concernent la serre et sont correctes Les suivantes sont à nouveau incorrectes.

Cordialement

Bon les vapeurs de champagne.... J’ai relu la doc pour vous :)

On donne en fait à available() l’adresse mémoire d’une case dans laquelle on aura le N° du pipe qui a reçu des infos, donc Une fois les 2 pipes ouverts, Il faut en fait appeler juste

uint8_t pipe_num;
if (radio.available(&pipe_num)) { // cet appel retourne vrai si on a des données et initialise pipe_num à la valeur de pipe qui a reçu des données

   // ici on sait qu’une info est dispo sur un des pipes ouverts et son N° est dans pipe_num
   if (pipe_num == 1) {
      // la ruche (suivant celui affecté à pipe 1)

   } else

   if (pipe_num == 2) {
      // la serre (suivant celui affecté à pipe 2)

   }
}

Ce serait bien d’avoir des constantes / variables qui sont compréhensibles

const uint8_t pipeRuche = 1;
const uint8_t pipeSerre = 2;

const uint64_t pipeRucheID = 0xE8E8F0F0E1LL;
const uint64_t pipeSerreID = 0xE8E8F0F0E2LL;
...

radio.openReadingPipe(pipeRuche, pipeRucheID); //ouverture du pipe de la ruche 
radio.openReadingPipe(pipeSerre, pipeSerreID); //ouverture du pipe de la Serre

...


uint8_t pipe_num;
if (radio.available(&pipe_num)) { // cet appel retourne vrai si on a des données et initialise pipe_num à la valeur de pipe qui a reçu des données

   // ici on sait qu’une info est dispo sur un des pipes ouverts et son N° est dans pipe_num
   if (pipe_num == pipeRuche) {
      // la ruche

   } else

   if (pipe_num == pipeSerre) {
      // la Serre

   }
}

histoire de ne pas trimballer des valeurs magiques 1 et 2 et on ne sait plus qui est qui

Bonsoir

et merci pour l'aide décisive. Je viens de modifier mon programme et ça tourne parfaitement. En fait, indépendamment des choix de variables plus compréhensibles c'est la première condition " retourne vrai si on a des données et initialise pipe_num à la valeur de pipe qui a reçu des données" que j'avais omise et qui change tout...

Encore merci pour le travail effectué pour moi.

Très cordialement et bonne fin d'année.

Super!

Bonnes fêtes de fin d’année

Bonjour,

me revoici un an plus tard...avec un autre projet utilisant plusieurs emetteurs

J'avais crié victoire un peu vite car en fait le programme semble fonctionner sur les premières acquisitions, alternant la détection d'un émetteur puis celle du second, mais au bout de trois à quatre détections, il ne détecte plus qu'un des deux émetteurs..

Le bout de programme est le suivant :

void loop() {
 delay(50);
  uint8_t pipe_num;
  if (radio.available(&pipe_num)) {
    /* cet appel retourne vrai si on a des données
      et initialise pipe_num à la valeur de pipe qui a reçu des données
      ici on sait qu'une info est dispo sur un des pipes ouverts et son N°
      est dans pipe_num*/
      //delay(4);
  if (pipe_num == pipePserre) {
      radio.read(dataPS, sizeof(dataPS)); // lit les trames envoyees
      delay(4);
      tempPserre = (dataPS[0]); // on enregistre la temperature ds la petite serre
      tempRTC = (dataPS[1]); // // on enregistre la temperature du chipset RTC
      delay(4); //origine delay(4);
      Serial.print("Temperature dans la petite serre :");
      Serial.println(tempPserre, 2);
      Serial.print("Temperature du chipset :");
      Serial.println(tempRTC, 2);
      delay(500);
    }
    else 
    if (pipe_num == pipeGserre) {
      radio.read(dataGS, sizeof(dataGS)); // lit les trames envoyees
      delay(4); //origine delay(4);
      tempGserre = (dataGS[0]); // on enregistre la temperature ds la serre
      tempBacExt = (dataGS[1]); // on enregistre la temperature ds le bac externe
      tempBacInt = (dataGS[2]); // on enregistre la temperature ds le bac interne
      delay(4); //origine delay(4);
      Serial.print("Temperature dans la grande serre :");
      Serial.println(tempGserre, 2);
      Serial.print("Temperature dans le bac interne :");
      Serial.println(tempBacInt, 2);
      Serial.print("Temperature dans le bac externe :");
      Serial.println(tempBacExt, 2);
      delay(500);
    }
  }

J'ai essayé pas mal de solutions, changer les délais, fermer le canal (pipe) après chaque acquisition(radio.closeOpenPipe), clore la lecture (radio.stopListening), le résultat est toujours le même, il finit par ne détecter qu'un émetteur.

De guerre lasse, j'ai changé de stratégie et ai utilisé la combinaison "switch/case" et là ça marche au poil.

Voici le bout de code :

void loop() {

  uint8_t pipe_num;
  while (radio.available(&pipe_num)) { // On lit tous les paquets de données disponibles
    switch (pipe_num) {
      case 1:
        // Grande serre
        radio.read(&dataGS, sizeof(dataGS)); // On lit les paquets de données provenant de la grande serre
        tempGserre = (dataGS[0]); // on enregistre la temperature ds la grande serre
        tempBacExt = (dataGS[1]); // on enregistre la temperature ds le bac externe
        tempBacInt = (dataGS[2]); // on enregistre la temperature ds le bac interne
        delay(4);
        Serial.print("Temperature dans la grande serre :");
        Serial.println(tempGserre, 2);
        Serial.print("Temperature dans le bac interne :");
        Serial.println(tempBacInt, 2);
        Serial.print("Temperature dans le bac externe :");
        Serial.println(tempBacExt, 2);
        delay(4);
        break;
      case 2:
        // Petite serre
        radio.read(&dataPS, sizeof(dataPS)); // On lit les paquets de données provenant de la petite serre
        tempPserre = (dataPS[0]); // on enregistre la temperature ds la petite serre
        tempRTC = (dataPS[1]); // // on enregistre la temperature du chipset RTC
        delay(4);
        Serial.print("Temperature dans la petite serre :");
        Serial.println(tempPserre, 2);
        Serial.print("Temperature du chipset :");
        Serial.println(tempRTC, 2);
        delay(4);
        break;
      default:
        Serial.print("DEFAULT, pipe:"); // pas necessaire
        Serial.println(pipe_num);
        break;
    }
  }

Voilà un problème de réglé, mais si quelqu'un peut m'expliquer pourquoi l'approche utilisant les "if/else if" ne marche pas, je suis preneur...

Cordialement

bizarre - disons que si pipe_num n'est pas 1 ou 2 (j'imagine que ce sont bien les valeurs déclarées pour pipePserre et pipeGserre) vous ne dépilez pas les data (pas de radio.read())

est-ce que ça vous arrive de voir "DEFAULT, pipe: xx" avec la nouvelle version?

Est ce qu'on peut utiliser un seul canal ? même avec 2 émetteurs ? En envoyant dans la trame un code pour les identifier ..

Par exemple pour 2 thermomètres :

ThermoN°1 : envoi de "1 22.87" ThermoN°2 : envoi de "2 22.87"

Dans l'idée , il faudrait faire émettre les 2 à des moments différents ..

techniquement oui si les messages ne se superposent pas. mais les canaux sont faits pour cela donc autant les utiliser

J-M-L: bizarre - disons que si pipe_num n'est pas 1 ou 2 (j'imagine que ce sont bien les valeurs déclarées pour pipePserre et pipeGserre) vous ne dépilez pas les data (pas de radio.read())

est-ce que ça vous arrive de voir "DEFAULT, pipe: xx" avec la nouvelle version?

oui ce sont les valeurs déclarées :

//Parametrage NRF24

const uint64_t pipeGserreID = {0xE8E8F0F0E1LL}; // le premier pipe est celui des donnees grande serre
const uint64_t pipePserreID = {0xE8E8F0F0E3LL}; // le deuxieme pipe est celui des donnees petite serre
const uint8_t pipeGserre = 1;
const uint8_t pipePserre = 2;

Je viens de vérifier sur une vingtaine d'acquisitions, non il n'y a pas de default mentionné.

Je vais reprendre quand même le code précédent et y réfléchir encore car moi non plus je ne vois pas où est le problème.

En tout cas merci pour vos réponses.

Cordialement

La différence entre les 2 ce sont les delay()... je ne sais pas à quelle fréquence vous émettez mais dans des codes asynchrones c’est une mauvaise idée de tout bloquer. Laisser la loop() tourner

Bonjour,

au départ, j'avais laissé les "delay" à 4ms comme conseillé et ça marchait puis se bloquait sur un émetteur comme expliqué plus haut. J'ai alors fait des essais variés en changeant la valeur des "delay".

Je ne crois pas avoir purement et simplement supprimé les retards, je vais faire un essai sans "delay" et sans délai.

et je vous tiens au courant.

je vais aussi faire des essais avec un autre circuit qui fonctionne sans faille sur un seul émetteur, au cas où l'électronique serait en cause.

La fréquence est 80 MHz

Cordialement

me revoici,

j'ai supprimé tous les delay() dans la boucle, le résultat reste le même :

Temperature dans la petite serre :13.000
Temperature du chipset :10.813
Temperature dans la grande serre :12.500
Temperature dans le bac interne :10.625
Temperature dans le bac externe :9.563
Temperature dans la petite serre :12.750
Temperature du chipset :10.875
Temperature dans la grande serre :12.500
Temperature dans le bac interne :10.625
Temperature dans le bac externe :9.563
Temperature dans la grande serre :12.500
Temperature dans le bac interne :10.625
Temperature dans le bac externe :9.563
Temperature dans la grande serre :12.000
Temperature dans le bac interne :10.625
Temperature dans le bac externe :9.563
Temperature dans la grande serre :12.000
Temperature dans le bac interne :10.625
Temperature dans le bac externe :9.563
Temperature dans la grande serre :12.000

Il démarre bien, alterne deux fois les détections puis boucle sur un seul détecteur, ici la grande serre.

Je continue à creuser...

vous avez moyen de voir si les émetteurs plantent ?

J-M-L: vous avez moyen de voir si les émetteurs plantent ?

Oui, je peux surveiller car je dispose de trois autres récepteurs, associés chacun à l'émetteur situé dans chaque serre donc je contrôle régulièrement via un récepteur autonome (lecture sur LCD) pour l'un et via thingspeak pour les deux autres que mes émetteurs fonctionnent correctement.

C'est pour me débarrasser de ces deux derniers que je souhaitais utiliser les capacités des nrf24 pour détecter plusieurs émetteurs avec un seul récepteur.

Donc ça émet sans souci (plus stable depuis que j'ai remplacé le duo uno(ou nano)/nrf24 par pro mini3.3v/nrf24).

J'ajoute qu'avant de les mettre en situation, j'ai testé l'émission avec printdetails.

Pour en revenir à mon problème, il reste entier (enfin à moitié puisque ça marche avec switch/case.)

Merci encore du coup de main.

Pour en revenir à mon problème, il reste entier (enfin à moitié puisque ça marche avec switch/case.)

oui et non - c'est encore pire de savoir que ça marche avec le switch.. vous n'avez rien changé d'autre?

une autre différence c'est que vous faites un while() dans un cas et dans l'autre avec le if vous dépendez de la loop() pour boucler. que faites vous d'autre dans la loop? ce serait bien de voir tout le code (vous avez bien j'imagine des openReadingPipe() (pas plus de 5) et un startListening() ?)

J’ai “résolu” le problème (???) de la manière suivante :

  uint8_t pipe_num;
  if (radio.available(&pipe_num)) {
     if (pipe_num == pipePserre) {
      radio.read(dataPS, sizeof(dataPS)); // lit les trames envoyees
      tempPserre = (dataPS[0]); // on enregistre la temperature ds la petite serre
      tempRTC = (dataPS[1]); // // on enregistre la temperature du chipset RTC
      Serial.print("Temperature dans la petite serre :");
      Serial.println(tempPserre, 3);
      Serial.print("Temperature du chipset :");
      Serial.println(tempRTC, 3);
      radio.closeReadingPipe(2);
      radio.openReadingPipe(pipeGserre, pipeGserreID);
    }
    if (pipe_num == pipeGserre) {
      radio.read(dataGS, sizeof(dataGS)); // lit les trames envoyees
      // delay(4); //origine delay(4);
      tempGserre = (dataGS[0]); // on enregistre la temperature ds la serre
      tempBacExt = (dataGS[1]); // on enregistre la temperature ds le bac externe
      tempBacInt = (dataGS[2]); // on enregistre la temperature ds le bac interne
      //   delay(4); //origine delay(4);
      Serial.print("Temperature dans la grande serre :");
      Serial.println(tempGserre, 3);
      Serial.print("Temperature dans le bac interne :");
      Serial.println(tempBacInt, 3);
      Serial.print("Temperature dans le bac externe :");
      Serial.println(tempBacExt, 3);
      radio.closeReadingPipe(1);
      radio.openReadingPipe(pipePserre, pipePserreID);
    }
  }

c’est-à-dire en ouvrant seulement le canal 1 quand je lis le canal 2 --(sauf pour la première acquisition où les 2 canaux sont ouverts au départ)-- que je ferme en fin de lecture, idem pour le pipe 2. C’est plus clair dans le programme.

Dans ces conditions, la lecture s’opère alternativement. Bon c’est pas très joli, ça n’explique pas pourquoi il faut forcer les canaux en les ouvrant et en les fermant à chaque opération.

Pour répondre à votre question, c’est vrai que l’erreur est peut-être ailleurs, voici la majeure partie de mon programme :

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <ThingSpeak.h>void loop() {



//Parametrage NRF24

const uint64_t pipeGserreID = {0xE8E8F0F0E1LL}; // le premier pipe est celui des donnees grande serre
const uint64_t pipePserreID = {0xE8E8F0F0E3LL}; // le deuxieme pipe est celui des donnees petite serre
const uint8_t pipeGserre = 1;
const uint8_t pipePserre = 2;

/*RF24 radio(2, 15); // Attention utiliser les numeros des GPIO
  soit 2 et 15 pour D4,D8*/

RF24 radio(D4, D8); // ou leur equivalent en broche ESP8266 NodeMCU

//Parametrage du WiFi, le mot de passe est la cle WIFI
const char* ssid = "XXXXXXXX"; // Le nom de la box
const char* password = "xxxxxxxxxxxx"; // Le mot de passe

WiFiClient client;

// Parametrages ThingSpeak
const int channelID =  12312312;
String writeAPIKey = "XXXXXXXXXXXXX"; // API key pour le canal ThingSpeak en question
const char* server = "api.thingspeak.com"; // Adresse du serveur ThingSpeak
const int mininterval = 5; // intervalle de temps en minutes, entre deux enregistrements
const int postingInterval = mininterval * 60000; // idem en millieme de seconde

float tempGserre = 20;
float tempBacInt = 20;
float tempBacExt = 20;
float tempPserre = 20;
float tempRTC = 20;
float dataGS[3];
float dataPS[2];
int TM = 5;
int Tm = 40;


void setup() {

  Serial.begin(115200);
  radio.begin();     // initialisation du NRF24.
  //radio.setPALevel(HIGH);
  //radio.setChannel(108); // choisit un canal peu encombre
  radio.setPALevel(RF24_PA_MAX);
  radio.openReadingPipe(pipeGserre, pipeGserreID); //ouverture du pipe de la grande serre
  radio.openReadingPipe(pipePserre, pipePserreID); //ouverture du pipe de la petite serre
  radio.startListening(); // ecoute de l'emetteur
  radio.setDataRate(RF24_250KBPS);
  //delay(50);

  WiFi.begin(ssid, password);

}

void loop() {

  uint8_t pipe_num;
  if (radio.available(&pipe_num)) {
    /* cet appel retourne vrai si on a des données
      et initialise pipe_num à la valeur de pipe qui a reçu des données
      ici on sait qu'une info est dispo sur un des pipes ouverts et son N°
      est dans pipe_num*/
    if (pipe_num == pipePserre) {
      radio.read(dataPS, sizeof(dataPS)); // lit les trames envoyees
      tempPserre = (dataPS[0]); // on enregistre la temperature ds la petite serre
      tempRTC = (dataPS[1]); // // on enregistre la temperature du chipset RTC
      Serial.print("Temperature dans la petite serre :");
      Serial.println(tempPserre, 3);
      Serial.print("Temperature du chipset :");
      Serial.println(tempRTC, 3);
      
    }
    else
    if (pipe_num == pipeGserre) {
      radio.read(dataGS, sizeof(dataGS)); // lit les trames envoyees
      // delay(4); //origine delay(4);
      tempGserre = (dataGS[0]); // on enregistre la temperature ds la serre
      tempBacExt = (dataGS[1]); // on enregistre la temperature ds le bac externe
      tempBacInt = (dataGS[2]); // on enregistre la temperature ds le bac interne
      //   delay(4); //origine delay(4);
      Serial.print("Temperature dans la grande serre :");
      Serial.println(tempGserre, 3);
      Serial.print("Temperature dans le bac interne :");
      Serial.println(tempBacInt, 3);
      Serial.print("Temperature dans le bac externe :");
      Serial.println(tempBacExt, 3);
      
    }
  }

  if (client.connect(server, 80)) {
    //Mesure la force du signal de la connexion WiFi (RSSI)
    long rssi = WiFi.RSSI();
    // Construction du corps de l'API (le contenu des menus)
    String body = "field1=";
    body += String(rssi);
    body += "&field2=";
    body += String(tempGserre);
    body += "&field3=";
    body += String(tempBacExt);
    body += "&field4=";
    body += String(tempBacInt);
    body += "&field5=";
    body += String(tempPserre);
    body += "&field6=";
    body += String(tempRTC);

    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: " + writeAPIKey + "\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(body.length());
    client.print("\n\n");
    client.print(body);
    client.print("\n\n");
  }
  client.stop();
  // attente et renvoi
  delay(postingInterval);
}