5

I'm building a weather station with two UNOs, using NRF24l01+ radios. Communications are fine. I'm sending a struct from one to the other. The struct has three elements:

 struct weather {
 float tempData;
 float humData;
 float pressData;
 };
 weather wData = {0, 0, 0};

I then populate the struct with values from my DHT22 Temperature Sensor and my BMP085 pressure sensor.

 float c = dht.readTemperature();
 wData.tempData = (c * 9/5) + 32;
 wData.humData = dht.readHumidity();
 sensors_event_t event;
 bmp.getEvent(&event);
 wData.pressData = (0.0295 * event.pressure);

Now I send it via the NRF24L01+.

 radio.write(&wData, sizeof(wData);

On the receiving Uno I have this.

 struct weather {
 float tempData;
 float humData;
 float pressData;
 };
 weather wData = {0, 0, 0};
 radio.read( &wData, sizeof(wData) );
 Serial.println(wData.tempData);
 Serial.println(wData.humData);
 Serial.println(wData.pressData);

I get results similar to this:

 Temp = 75.43
 Hum = 35.76
 Press = 0.00

The first two are correct. The final one is not. I can change the order and the first two will always be correct, but the last element is always 0.00. For example:

 Hum = 35.76
 Press = 30.14
 Temp = 0.00

I know I'm missing something here with my code but I can't find it. Anyone have some suggestions?

8
  • read() and write() return a bool, did you try to get it and print it to Serial, just to check both functions consider everything's OK? That might help. Commented Feb 25, 2014 at 5:59
  • Also, did you check that the weather on the emiiter contained a non-0 pressure before write()? Commented Feb 25, 2014 at 6:05
  • The line with radio.write(... is missing a closing parenthesis. Commented Feb 25, 2014 at 6:25
  • read() and write() return 1. Missed the closing parenthesis while moving code here but it's there in my code. Commented Feb 25, 2014 at 14:57
  • 1
    After taking a look at the RF24 library source code, I wonder if you have changed the payload size before read or write. To know about it, you should Serial.println() of radio.getPayloadSize() in both sketches; normally that should be 32 by default, but I wonder about it... Commented Feb 25, 2014 at 19:50

1 Answer 1

2

Modified my struct by changing the first two elements from float to int.

struct weather {
 int tempData;
 int humData;
 float pressData;
}
weather wData;

Everything transmits fine now. I don't really need the precision of a float for temperature and humidity. However, I would still like to find the problem. Could there be some problem with the size of three floats versus two ints and a float? Serial.print(sizeof(wData)) is 12 when all elements are floats and 8 when using two int and a float. My understanding is the NRF24L01+ has a transmit and receive buffer of 32 bytes.

answered Feb 25, 2014 at 16:08
4
  • Have you tried the opposite, ie putting 4 floats instead of just 2? Maybe transmission is done by pack of 8 bytes? Commented Feb 25, 2014 at 18:06
  • Have not tried that. Will try soon and report back. Commented Feb 26, 2014 at 3:33
  • Did you try testing with a known strings of different lengths instead of your struct. Commented Feb 28, 2014 at 20:53
  • Have note tried anything else as of yet. Work and life getting in the way! Commented Mar 1, 2014 at 23:53

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.