HYT 939 Feuchtesensor über NRF24L01 senden

Hallo,

ich benutze einen Arduino MRKZERO um die daten von einem HYT939 Feuchtesensor auszulesen und dann mit einem NRF24L01 an einen Arduino Mega zu senden.
Leider bekomme ich im Ausgabefester nur 0.00 zu sehen..

Hier meine Codes:

Zero:

#include <nRF24L01.h>
#include <RF24.h>
#include <SPI.h>
#include <Wire.h>

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

const byte address[6] = "00001";

#define HYT939_ADDR 0x28



void setup()
{  
  Serial.begin(9000);  
  Wire.begin();        
  
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_HIGH);
  radio.stopListening();
}


void loop()
{
#define TFACTOR 99.2909       //Skalierungsfaktoren laut Datenblatt
#define TDELTA  40.0
#define HFACTOR 163.83

  unsigned int traw;
  unsigned int hraw;
    
  double temp;
  double 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=(double)traw/TFACTOR;
temp=temp-TDELTA;

hum=(double)hraw/HFACTOR;

float tempout = temp;
  radio.write(&temp, sizeof(temp));

float humout = hum;
  radio.write(&hum, sizeof(hum));

delay(50);
}

Mega:

#include <nRF24L01.h>
#include <RF24.h>
#include <SPI.h>  


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

const byte address[6] = "00001";


void setup() {
  
  Serial.begin(9000);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_HIGH);
  radio.startListening();
}

void loop() {
  
  float got_tempout;
  if (radio.available()) {
    radio.read(&got_tempout, sizeof(got_tempout));
  }
  Serial.print(got_tempout);
  //Serial.print("\t");
  

  float got_humout;
  if (radio.available()) {
    radio.read(&got_humout, sizeof(got_humout));
  }
  Serial.print(got_humout);
  //Serial.print("");

delay (1000);
}

LG Flo

Warum machst du jetzt einen neuen Beitrag auf? Nicht zufrieden mit den Antworten in Serial Monitor Werte richtig anzeigen lassen - Deutsch - Arduino Forum? :wink:

Ich dachte da es ein anderes Thema behandelt mache ich einen neuen post?

LG Flo

Bist du den sicher, dass dein MRKZero auch die richtigen Daten mit dem NRF auch aussendet ?
Wenn der Sender nicht richtig arbeitet, kannst du auch nichts empfangen.

Ich denke schon..

Ich übergbebe ihm ja die Daten temp und hum.

Das sind doch die Werte die ich mir auch ausgeben lasse wenn ich den arduino direkt am pc antsecke und da funktioniert es auch...

LG Flo

Du schickst einen Double auf den Sender und empfängst einen Float.

Du machst hier die Zuweisung : float tempout = temp; aber schickst trotzdem
den Double temp auf den Sender. Der float tempout wird gar nicht benutzt. Hätte der
Compiler eigentlich was zu sagen müssen!

Ulli

Flo3107:
Ich denke schon..

Ich übergbebe ihm ja die Daten temp und hum.

Das sind doch die Werte die ich mir auch ausgeben lasse wenn ich den arduino direkt am pc antsecke und da funktioniert es auch...

Wenn du wissen willst, ob Sender un Empfänger "RICHTIG" mit einander Quatschen, dann solltest du das
Ack Payload aktivieren, nutzen und auch prüfen.

Denn Vermutungen, helfen dir keinen Fitzel weiter.

Auch würde ich mal prüfen ob die Fließkommaformate von MRKZERO und Mega identisch sind.
Dein fester Glaube, dass dem so ist, kann dich in die Irre leiten.

Zumindest könnte man den Rückgabewert von write() überprüfen.
Im aktuellen Sketch ist Acknowledge aktiviert,
du kannst also testen ob dein Ziel bestätigt hat.

Und, wie ich kürzlich schon jemandem riet,
übertrage deine Daten gemeinsam in einem Paket,
das ist wesentlich einfacher.
Float als Datentyp auf beiden Seiten sollte gehen,
Endianness musst du checken.

Also etwa so (Tippfehler sind möglich)

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

#define HYT939_ADDR 0x28

const byte address[] = "00001";

struct DPacket {
  float temperature;
  float humidity;
} data;

RF24 radio(6, 7);

void setup() {
  Serial.begin(250000);
  Wire.begin();
  radio.begin();
  radio.openWritingPipe(address);
  radio.enableDynamicPayloads();
  radio.setPALevel(RF24_PA_HIGH);
}

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

void loop() {
  unsigned int traw;
  unsigned int hraw;

  unsigned char buffer[4];

  Wire.beginTransmission(HYT939_ADDR);
  Wire.endTransmission();
  delay(100);
  Wire.requestFrom(HYT939_ADDR, 4, true);    //4 Bytes vom Sensor lesen
  for (byte i = 0; Wire.available(); i++) {
    buffer[i] = Wire.read();
  }
  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;
  /*
     Serial.print("\r\nTemp Raw:");
    Serial.println(traw);
    Serial.print("Hum Raw:");
    Serial.println(hraw);
  */
  data.temperature = ((double)traw) / TFACTOR - TDELTA;
  data.humidity = ((double)hraw) / HFACTOR;

  bool result = radio.write(&data, sizeof(data));
  if (!result) {
    Serial.println(F("Ups, Senden fehlgeschlagen"));
  }

  delay(50);
}

und so

#include <RF24.h>

const byte address[6] = "00001";

struct DPacket {
  float temperature;
  float humidity;
} data;

RF24 radio(6, 7);

void setup() {
  Serial.begin(250000);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.enableDynamicPayloads();
  radio.setPALevel(RF24_PA_HIGH);
  radio.startListening();
}

void loop() {
  if (radio.available()) {
    radio.read(&data, sizeof(data));
    Serial.print(F("Temp "));
    Serial.print(data.temperature);
    Serial.print(F(", Hum "));
    Serial.println(data.humidity);
  }
}

Vieln Dank für die Hilfe.

Es hat funktioniert. :slight_smile:

Jetzt hätte ich noch eine weitere Frage:

Ich würde gerne einen zweiten HYT939 an meine Zero anschließen und mir dann die Werte von beiden Sensoren ausgeben lassen.

Den ersten habe ich am SCL und SDA Port angeschlossen.. wo schließe ich den zweiten an bzw. wie verweise ich im code darauf, dass es jetzt zwei semsoren zum auslesen gibt?

LG Flo

Wenn die I2C Adresse eingestellt werden kann, kannst du den gleichen I2C Bus benutzen,
sonst einen eventuell vorhandenen zweiten I2C Bus,
ansonsten kann ein I2C Multiplexer den ersten I2C Bus erweitern.

SCL und SDA sagt mir dass es was mit I²C zu tun hat.
Dann könnte man suchen wie man I²C Gerätschaften verbindet.
zB hier gibts einige Infos:
https://www.elv.de/Arduino-verstehen-und-anwenden-Teil-22-I%C2%B2C-der-Inter-IC-Bus-Grundlagen-und-Anwendungen/x.aspx/cid_726/detail_60435

Was denkst du was hier passiert:
#define HYT939_ADDR 0x28

Hallo Flo,

HIER Datenblatt ist ab Seite 16 beschrieben , wie die I2C Adresse des HYT 939 geändert werden kann.
Geht bei diesen Sensoren nur via sketch.
Zum programieren der Adresse ist es am besten, die Betriebsspannungsleitung des sensors an einen digitalpin des arduinos zu hängen, da 10ms nach Power-On des Sensors dieser auf Command-Mode gesetzt werden muss. Dazu muss aber der Arduino bereits stabil hochgefahren sein.
Ach ja, der Sensor sollte während der Programierung als einzige i2c komponente am I2c-Bus hängen und nur 1! Sensosor.
Nach erfolgreicher Änderung kannst du dann jeden Sensor über ne eigene Adresse ansprechen.

Viel Erfolg.

LG Stefan

Vielen Dank für eure Rückmeldungen. Das hat meine Frage beantwortet.

Ich habe jetzt allerdings noch etwas anderes ausprobiert und und bräuchte wiedermal eure Hilfe..:slight_smile:

Ich sende von zwei Arduino Zero an denen jeweils ein Feuchtesensor HYT 939 angeschlossen ist an einen Arduino Mega.

Ich kann die Daten empfangen, aber das Problem ist wieder einmal die Darstellung im Seriellen Monitor. Die Werte werden wieder durcheinander angezeigt..
Ich hätte gerne 4 Spalten in denen die Temperatur und Feuchte des ersten und die Temperatur und Feuchte des zweiten Sensors angezeigt werden.

Die Daten werden jeweils in einem float array versendet. Ich glaube mein Fehler liegt irgendwo im Empfänger Code.. Ev. bei den if oder for Befehlen oder die Klammern nicht richtig gesetzt?
Oder gibt es noch irgendwelche speziellen Dinge die ich berücksichtigen wenn ich von zwei arduinos auf einen sende?

Codes:

ZERO 1:

#include <RF24.h>
#include <Wire.h>
#define HYT939_ADDR 0x28

const byte address[6] = "00001";

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


void setup()
{  
  Serial.begin(9600);  
  Wire.begin();        
  
  radio.begin();
  radio.openWritingPipe(address);
  radio.enableDynamicPayloads();
  radio.setPALevel(RF24_PA_HIGH);
}


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 humoutj[2];
float j;

    humoutj[0] = temp;
    humoutj[1] = hum;

radio.write(humoutj, sizeof(humoutj));

delay(1500);
}

ZERO 2:

#include <RF24.h>
#include <Wire.h>
#define HYT939_ADDR 0x28

const byte address[6] = "00001";

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


void setup()
{  
  Serial.begin(9600);  
  Wire.begin();        
  
  radio.begin();
  radio.openWritingPipe(address);
  radio.enableDynamicPayloads();
  radio.setPALevel(RF24_PA_HIGH);
}


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 humoutk[2];
float k;

    humoutk[0] = temp;
    humoutk[1] = hum;

radio.write(humoutk, sizeof(humoutk));

delay(1500);
}

MEGA:

#include <RF24.h>  

const byte address[6] = "00001";


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


void setup() {
  
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.enableDynamicPayloads();
  radio.setPALevel(RF24_PA_HIGH);
  radio.startListening();
}

void loop() {

  float got_humoutj[2];
  float j;
  
  if (radio.available()) {
    
    radio.read(got_humoutj, sizeof(got_humoutj));
    for (byte j = 0; j < 2; j = j + 1){
    Serial.print(got_humoutj[j]);
    Serial.print("\t");}
  
      float got_humoutk[2];
      float k; 
  
      radio.read(got_humoutk, sizeof(got_humoutk));
      for (byte k = 0; k < 2; k = k + 1){
      Serial.print(got_humoutk[k]);
      Serial.print("\t");}
      
  Serial.println("");
  }
 
}

Danke und LG Flo

  if (radio.available()) {   
      radio.read(got_humoutj, sizeof(got_humoutj)); 
      radio.read(got_humoutk, sizeof(got_humoutk));
   }

Zwei reads für ein available? Ziemlich 'unsensibel'.

In diesem Fall würde ich keinen float Array senden, sondern eine struct, etwa

struct DPacket {
  byte senderId;
  float humidity;
  float temperature;
};

dann kannst du im Empfänger feststellen von wem das Paket kam, anstatt das nur anzunehmen.

Das mit dem struct hab ich nicht so ganz hinbekommen aber ich habe nochmal ein paar änderungen am code gemacht und die Werte der Sensoren werden jetzt schön untereinander angezeigt.

Das Problem ist nur zuerst werden die Daten des ersten Sensors in eine Zeile geschrieben und dann die des zweiten direkt darunter usw...

Ich hätte gerne das die zwei sensoren nebeneinander stehen.. da muss ich doch bestimmt nur eine kleinigkeit bei den printbefehlen ändern oder?
aber ich weiß nicht genau was..

Code:

#include <RF24.h>  

const byte address[6] = "00001";


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


void setup() {
  
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.enableDynamicPayloads();
  radio.setPALevel(RF24_PA_HIGH);
  radio.startListening();
}

void loop() {  

  if (radio.available()) {
    float got_humoutj[2];
    float j;
    radio.read(got_humoutj, sizeof(got_humoutj));
    for (byte j = 0; j < 2; j = j + 1){
    Serial.print(got_humoutj[j]);
    Serial.print("\t");
    }
     
  if (radio.available()) {
    float got_humoutk[2];
    float k; 
    radio.read(got_humoutk, sizeof(got_humoutk));
    for (byte k = 0; k < 2; k = k + 1){
    Serial.print(got_humoutk[k]);
    Serial.print("\t");
    }}
    
    Serial.println(" ");
    }
  
}

LG Flo

Was du da verzapfst ist einfach nur Quatsch.

Ohne Identifikation im Paket und bei gleicher Pipe kannst du die Sendungen nicht unterscheiden,
es ist also völlig irrelevant wen du rechts oder links hin druckst, untereinander ist da sogar logischer.

Ich habe dir gesagt wie man es machen kann, wenn du das nicht willst, dann lass es halt.

Wegen Beratungsresistenz verabschiede ich mich, viel Erfolg mit deinem Projekt.