NRF24L01 Sende Probleme

Hallo,

ich wollte die Messwerte von einem Arduino zum anderen Arduino übertragen per NRF24L01. Dafür habe ich folgenden Code der noch nicht ganz vollständig ist.

Mein Code

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Wire.h>
#include "SparkFunBME280.h"
BME280 mySensor;

RF24 radio(9, 10);

char empftext[32];
unsigned long start;
const byte neben[6][6] = {"00000", "00001", "00010", "00011"};

float wert;
char wertchar[10];

template<typename T, typename U> void senden(T &sendetext, U &adresse)
{
  radio.stopListening();
  radio.openWritingPipe(adresse);
  radio.write(&sendetext, sizeof(sendetext));
  Serial.println(sendetext);
}

float empfangenfloat (const byte* adresse, int laenge)
{
  empftext[32] = {0};
  radio.startListening();
  radio.openReadingPipe(0, adresse);
  start = millis();
  while (millis() - start < laenge * 1000)
  {
    if (radio.available())
    {
    radio.read(&empftext, sizeof(empftext));
    wert = atof(empftext);
    return wert;
    }
  }
}

char empfangentext (const byte* adresse, int laenge)
{
  empftext[32] = {0};
  radio.startListening();
  radio.openReadingPipe(0, adresse);
  start = millis();
  while (millis() - start < laenge * 1000)
  {
    if (radio.available())
    {
    radio.read(&empftext, sizeof(empftext));
    return empftext;
    }
  }
  return "exit";
}

bool A000111 ()
{
  delay(100);
  wert = mySensor.readTempC();
  dtostrf(wert, 10, 4, wertchar);
  senden(wertchar, neben[0]);
  if (empfangentext(neben[1], 4) == "ok")
  {
    delay(100);
    wert = mySensor.readFloatHumidity();
    dtostrf(wert, 10, 4, wertchar);
    senden(wertchar, neben[2]);
  }
  else {
    return false;
  }
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  
  radio.begin();
  radio.setPALevel(RF24_PA_MAX);
  radio.setChannel(90);
  radio.setDataRate(RF24_250KBPS);
  radio.enableDynamicPayloads();
  radio.powerUp();
  radio.setRetries(15, 15);
  
  Wire.begin();
  Wire.setClock(400000);
  mySensor.beginI2C();
}

void loop() {
  // put your main code here, to run repeatedly:
  if (empfangentext(neben[1], 4) == "000111") {
    A000111();
  }
}
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8);

char empftext[32];
unsigned long start;
const byte neben[6][6] = {"00000", "00001", "00010", "00011"};

float wert;
float temperatur;
float luftfeuchtigkeit;
float hoehe;
float luftdruck;

template<typename T, typename U> void senden(T &sendetext, U &adresse)
{
  radio.stopListening();
  radio.openWritingPipe(adresse);
  radio.write(&sendetext, sizeof(sendetext));
  Serial.println(sendetext);
}

float empfangenfloat (const byte* adresse, int laenge)
{
  empftext[32] = {0};
  radio.startListening();
  radio.openReadingPipe(0, adresse);
  start = millis();
  while (millis() - start < laenge * 1000)
  {
    if (radio.available())
    {
    radio.read(&empftext, sizeof(empftext));
    wert = atof(empftext);
    return wert;
    }
  }
  return 0;
}

char empfangentext (const byte* adresse, int laenge)
{
  empftext[32] = {0};
  radio.startListening();
  radio.openReadingPipe(0, adresse);
  start = millis();
  while (millis() - start < laenge * 1000)
  {
    if (radio.available())
    {
    radio.read(&empftext, sizeof(empftext));
    return empftext;
    }
  }
  return "exit";
}

bool F000111 ()
{
  senden("000111", neben[1]);
  temperatur = empfangenfloat(neben[0], 4);
  if (temperatur == 0.0) {
    return false;
  }
  Serial.println(temperatur);
  delay(100);
  senden("ok", neben[1]);
  luftfeuchtigkeit = empfangenfloat(neben[2], 4);
  if (luftfeuchtigkeit == 0.0) {
    return false;
  }
  Serial.println(luftfeuchtigkeit);
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  
  radio.begin();
  radio.setPALevel(RF24_PA_MAX);
  radio.setChannel(90);
  radio.setDataRate(RF24_250KBPS);
  radio.enableDynamicPayloads();
  radio.powerUp();
  radio.setRetries(15, 15);
}

void loop() {
  // put your main code here, to run repeatedly:
  F000111();
  delay(1000);
}

Wenn ich diese Zeilen auskommentiere funktiniert es

  //luftfeuchtigkeit = empfangenfloat(neben[2], 4);
  //if (luftfeuchtigkeit == 0.0) {
  //  return false;
  //}
  //Serial.println(luftfeuchtigkeit);

float auf == prüfen ist keine gute Idee.

Überlege Dir, welche Werte sinnvoll sind und prüfe auf <= untere sinnvolle Grenze.

Gruß Tommy

Blockierend programmierte Kommunikation funktioniert nicht gut.

Was heißt das?

Whandall:
Blockierend programmierte Kommunikation funktioniert nicht gut.

Was heißt das?

The_Snapdragon:

Blockierend programmierte Kommunikation funktioniert nicht gut.
Was heißt das?

Blockierend programmieren heißt: Funktionen und Konstrukte verwenden, die den Programmablauf (unnötig) anhalten und verzögern, wie zum Beispiel delay oder "lange" while-Schleifen (beides kommt in den gezeigten Programmen vor).
Die Loop sollte so schnell wie nur möglich "durchlaufen", also am besten nur nur wenige Millisekunden brauchen. Sonst ist die Wahrscheinlichkeit groß, dass man was verpasst.

uxomm:
Die Loop sollte so schnell wie nur möglich "durchlaufen", also am besten nur nur wenige Millisekunden brauchen.

Ich würde noch weiter gehen, 'wenige Millisekunden' sind noch zu langsam.
Ein Schleifendurchlauf der etwas Zeitaufwändiges macht kann schon mal (auch viel) länger dauern,
es geht hier um den Durchschnittswert.

Grunsätzlich halte ich die Philosphie "ich weiss welches Paket als nächstes kommt" für sehr unglücklich.

Baue in die Pakete etwas ein an dem man den Inhalt unterscheiden kann (etwas wie ein Typfeld),
dann kannst du nach dem Empfang eines Paketes entscheiden was da ankam und evtl. ob es zeitgerecht ankam,
Ganz ohne delays und while...