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?
1 Answer 1
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.
-
Have you tried the opposite, ie putting 4 floats instead of just 2? Maybe transmission is done by pack of 8 bytes?jfpoilpret– jfpoilpret2014年02月25日 18:06:00 +00:00Commented Feb 25, 2014 at 18:06
-
Have not tried that. Will try soon and report back.brorobw– brorobw2014年02月26日 03:33:04 +00:00Commented Feb 26, 2014 at 3:33
-
Did you try testing with a known strings of different lengths instead of your struct.Craig– Craig2014年02月28日 20:53:58 +00:00Commented Feb 28, 2014 at 20:53
-
Have note tried anything else as of yet. Work and life getting in the way!brorobw– brorobw2014年03月01日 23:53:07 +00:00Commented Mar 1, 2014 at 23:53
read()
andwrite()
return abool
, did you try to get it and print it toSerial
, just to check both functions consider everything's OK? That might help.weather
on the emiiter contained a non-0 pressure beforewrite()
?radio.write(...
is missing a closing parenthesis.read()
andwrite()
return 1. Missed the closing parenthesis while moving code here but it's there in my code.Serial.println()
ofradio.getPayloadSize()
in both sketches; normally that should be32
by default, but I wonder about it...