Go Down

Topic: nrf24, lire deux adresses de transmetteurs en même temps (Read 1 time) previous topic - next topic

Lacuzon

me revoici,

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

Code: [Select]
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...

J-M-L

vous avez moyen de voir si les émetteurs plantent ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Lacuzon

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.




J-M-L

Quote
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() ?)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Lacuzon

J'ai "résolu" le problème (???) de la manière suivante :

Code: [Select]


  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 :


Code: [Select]


#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);
}



Lacuzon

Bonjour,

j'ajoute que mes nrf24L01+ c'est du chinois pas de l'original. Peut-être que la gestion interne des canaux est la cause de ce comportement étrange.

Cela dit, ça tourne rond avec la version modifiée (avec les ouvertures et fermeture des canaux à chaque boucle) parfaitement depuis ma modif d'hier.

Cordialement

J-M-L

OK... difficile de tester sans le montage sous la main... mais c'est bizarre
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up