Hello,
Below are some sketches I'm using for wireless sending integer values (with auto ack) from one Uno to another using NRF24L01 tranceivers. I copy/ pasted them from this site: Auto Ack completely fixed – Just Electronics
I'm using the NRF24 library by TMRh20 version 1.2.0 and Arduino (Windows store) version 1.8.1.0.
Similar examples are available (inside the library and on this forum) and have basically the same approach. I tried many of them but with the same strange results: the radio modules seem to be working properly (as verified with library "Gettingstarted" example) but the integer values which I send are most of the time received as a different but close to the original integer value. No matter how often I send the same integer, it will always be received as the wrong but equally wrong value. Even after reapplying power, the results are always the same. Some values are however properly received. Here are some examples:
Integer sent= 1; integer received=1
Integer sent= 2; integer received=3
Integer sent= 3; integer received=3
Integer sent= 4; integer received=6
Integer sent= 5; integer received=7
Integer sent= 6; integer received=7
Integer sent= 7; integer received=7
Integer sent= 8; integer received=12
Integer sent= 9; integer received=13
Integer sent= 10; integer received=15
...
Integer sent= 25; integer received=29
...
Integer sent= 30; integer received=31
Integer sent= 31; integer received=31
...
Integer sent= 115; integer received=123
...
Integer sent= 255; integer received=255
The acknowledge payload values which the receiver sends back is always correct as I tried several different values for rec[1].
Does someone recognize this behavior and explain to me what could be causing this difference between the values? Thank you for your help in advance!
The transmitter code:
#include<SPI.h>
#include<nRF24L01.h>
#include<RF24.h>
int msg[1] = {1};
int rec[1] = {5};
bool stat = true;
RF24 radio(9,10);
const uint64_t pipe[1] = {0xF0F0F0F0E1LL};
void setup()
{
Serial.begin(57600);
radio.begin();
delay(100);
radio.setAutoAck(true);
radio.enableAckPayload();
radio.enableDynamicPayloads();
radio.stopListening();
radio.openWritingPipe(pipe[0]);
radio.setRetries(15,15);
}
void loop()
{
if(stat)
{
if(radio.write(msg,sizeof(msg)))
{
Serial.print( msg[0] );
Serial.println("...tx success");
if(radio.isAckPayloadAvailable())
{
radio.read(rec,sizeof(int));
Serial.print("received ack payload is : ");
Serial.println(rec[0]);
}
else
{
stat = false; //doing this completely shuts down the transmitter if an ack payload is not received !!
Serial.println("status has become false so stop here....");
}
msg[0]+=3;;
if(msg[0]>=100)
{msg[0]=1;}
}
}
}
The receiver code:
#include<SPI.h>
#include<nRF24L01.h>
#include<RF24.h>
const uint64_t pipe[1]= {0xF0F0F0F0E1LL};
RF24 radio(9,10);
int rec[1] = {2};
int red;
void setup()
{
Serial.begin(57600);
radio.begin();
delay(100);
radio.setAutoAck(true);
radio.enableAckPayload();
radio.enableDynamicPayloads();
radio.openReadingPipe(1,pipe[0]);
radio.startListening();
radio.setRetries(15,15);
}
void loop()
{
if ( radio.available() ) {
radio.writeAckPayload( 1, rec, sizeof(int) );
radio.read( &red,sizeof(red) );rec[0]+=2;
Serial.print("integer got is : ");
Serial.println(red);
}
}