Go Down

Topic: Float array über NRF24L01 senden und empfangen (Read 377 times) previous topic - next topic

Flo3107

Hallo,

ich will einen Datensatz von 10 float Werten mit einem float array von einem Arduino Zero zu einem Mega senden. (über einen NRF24L01)
Dabei handeltes sich um 8 Temp. Werte von einem MAX31856 Sensor und den Temp. und Feuchte Wert von einem HYT939 Feuchtesensor.

Mein Problem ist, dass nur 8 Wert korrekt ausgegeben werden, beim Wert 9 und 10 bekomme ich nur 0.00.

Hier meine Sketches:

TX (Zero):
Code: [Select]

// TX für Daten


#include <Wire.h>
#include <Adafruit_MAX31856.h>
#include <RF24.h>

#define HYT939_ADDR 0x28

RF24 radio(6,7);
const byte address[6] = "00001";

Adafruit_MAX31856 tc1 = Adafruit_MAX31856(A3, 1, 2, 3);
Adafruit_MAX31856 tc2 = Adafruit_MAX31856(A2, 1, 2, 3);
Adafruit_MAX31856 tc3 = Adafruit_MAX31856(A1, 1, 2, 3);
Adafruit_MAX31856 tc4 = Adafruit_MAX31856(A0, 1, 2, 3);
Adafruit_MAX31856 tc5 = Adafruit_MAX31856(5, 1, 2, 3);
Adafruit_MAX31856 tc6 = Adafruit_MAX31856(4, 1, 2, 3);
Adafruit_MAX31856 tc7 = Adafruit_MAX31856(A5, 1, 2, 3);
Adafruit_MAX31856 tc8 = Adafruit_MAX31856(A4, 1, 2, 3);



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

  tc1.begin();
  tc1.setThermocoupleType(MAX31856_TCTYPE_K);
  tc2.begin();
  tc2.setThermocoupleType(MAX31856_TCTYPE_K);
  tc3.begin();
  tc3.setThermocoupleType(MAX31856_TCTYPE_K);
  tc4.begin();
  tc4.setThermocoupleType(MAX31856_TCTYPE_K);
  tc5.begin();
  tc5.setThermocoupleType(MAX31856_TCTYPE_K);
  tc6.begin();
  tc6.setThermocoupleType(MAX31856_TCTYPE_K);
  tc7.begin();
  tc7.setThermocoupleType(MAX31856_TCTYPE_K);
  tc8.begin();
  tc8.setThermocoupleType(MAX31856_TCTYPE_K);
 
  Wire.begin();

  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_HIGH);     //Transmit Power (MAX,HIGH,LOW,MIN)
  radio.setDataRate( RF24_250KBPS );  //Transmit Speeed (250 Kbits per second, maximal 2 Mb/s)
  //radio.enableDynamicPayloads();
}

void loop() {

#define TFACTOR 99.2909       //Skalierungsfaktoren laut Datenblatt
#define TDELTA  40.0
#define HFACTOR 163.83

  unsigned int traw;
  unsigned int hraw;
   
  float temp;
  float hum;
  int i;
  unsigned char buffer[4];
 
 Wire.beginTransmission(HYT939_ADDR);
 Wire.endTransmission();
 
  delay(100);   //100ms warten
 
  Wire.requestFrom(HYT939_ADDR, 4,true);     //4 Bytes vom Sensor lesen
 
  i=0;
 
while(Wire.available()) {
   
    char c = Wire.read();
 
    buffer[i]=c;
       
    i++;
 
    }
   
  traw=buffer[2]*256+buffer[3];     //Rohdaten aus Puffer lesen
  hraw=buffer[0]*256+buffer[1];
 
 
traw&=0xfffc;
hraw&=0x3fff;        //Daten laut Datenblatt maskieren
traw>>=2;

/*
//Rohdaten ausgeben, zur eventuellen Fehlersuche
Serial.print("\r\nTemp Raw:");
Serial.println(traw);
Serial.print("Hum Raw:");
Serial.println(hraw);
*/

//Rohdaten Umrechnen

temp=(float)traw/TFACTOR;
temp=temp-TDELTA;

hum=(float)hraw/HFACTOR;


  float dataout[10];
  float j;
 
  dataout[0] = temp;
  dataout[1] = hum;
  dataout[2] = tc1.readThermocoupleTemperature();
  dataout[3] = tc2.readThermocoupleTemperature();
  dataout[4] = tc3.readThermocoupleTemperature();
  dataout[5] = tc4.readThermocoupleTemperature();
  dataout[6] = tc5.readThermocoupleTemperature();
  dataout[7] = tc6.readThermocoupleTemperature();
  dataout[8] = tc7.readThermocoupleTemperature();
  dataout[9] = tc8.readThermocoupleTemperature();
 

  radio.write(dataout, sizeof(dataout));
}



RX (Mega):
Code: [Select]

// RX für Daten


#include <RF24.h>

RF24 radio(6, 7);                    // CNS, CE

const byte address[6] = "00001";


void setup() {
 
  Serial.begin(115200);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_HIGH);       //Transmit Power (MAX,HIGH,LOW,MIN)
  radio.setDataRate( RF24_250KBPS );    //Transmit Speeed (250 Kbits per second, maximal 2Mb/s)
  //radio.enableDynamicPayloads();
  radio.startListening();
}


void loop() {

float got_dataout[10];

float j;

if (radio.available()) {
  radio.read(got_dataout, sizeof(got_dataout));

for (byte j = 0; j < 10; ++j ) {
  Serial.print(got_dataout[j]);
  Serial.print("\t");
}

Serial.println("");
}

}


hat vll jemand eine Idee wo mein Fehler ist?

LG

combie

Quote
hat vll jemand eine Idee wo mein Fehler ist?
Ja, eine Ahnung....

Die Payloadsize ist maximal 32 Byte.
Ein float ist 4 Byte groß
Also passen exakt 8 float Values in ein Datenpaket.


 :o  :o  :o  :o  :o  :o

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Flo3107

Aaah, ja das macht Sinn..

Dann müsste ich einen zweiten array senden.. oder hättest du irgend eine idee wie ich die Daten gemeinsam als "Datenpaket" senden kann?

LG

combie

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Flo3107


combie

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

ElEspanol

Beispiele anschauen, analysieren, nachdenken, umsetzen.

Whandall

Code: [Select]
struct Paket {
  byte ersterIndex;
  byte anzahlElemente;
  float element[7];
};

Damit könntest du Arrays bis zu 256 Elementen in bis zu 7 Element langen Stücken übertragen.
Wenn du nur jetzt mal schnell 10 Elemente haben willst, ist das vielleicht praktischer

Code: [Select]
struct Paket {
  bool ersterTeil;
  float element[5];
};
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Tommy56

Ich glaube, ihm haben Eure Antworten nicht gefallen. Crossposting.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Whandall

Vielleicht hat ja sonst jemand etwas davon.  ;)
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

postmaster-ino

Hi

Quote from: HotSystems ... im Nachbar-Universum
Aber wenn man fertige Lösungen haben möchte, ist doch Mikrocontroller.net das richtige Forum, oder ?
Du böhöser Mensch, Du :)
Ich höre schon den Teer blubbern ;)

MfG

combie

Ich glaube, ihm haben Eure Antworten nicht gefallen. Crossposting.
Ja, das tut mir auch ein bisschen leid.

Aber nun, wenn denn meine Wühlkiste sowas nicht ad hoc hergibt, dann mache ich mir auch nicht unbedingt die Arbeit.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Tommy56

Zumal der Vorschlag von Whandall mit etwas Überlegung durch den TO auch direkt einsetzbar ist.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

combie

Quote
durch den TO auch direkt einsetzbar
Glaube ich eher nicht....

ca 5 Minuten hat der TO benötigt um festzustellen, das er mit der von mir genannten Lib nicht weiterkommt. Das reicht noch nicht mal um die Doku zu finden und die erste Seite zu lesen.

Schade eigentlich ...

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Tommy56

Ja, da war mein Ansatz mit Überlegung von seiner Seite wohl zu optimistisch.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Go Up