Mike,
  Below is a sketch that demonstrates what i'm seeing. The system always stops after the send in the waitPacketSent()
  The debug it produces looks like this;
  Run 1
  ---------
250 Â Going to send... Â send started...packet sent
251 Â Going to send... Â send started...packet sent
***** Got a Non-zeo length message
252 Â Going to send... Â send started...packet sent
***** Got a Non-zeo length message
253 Â Going to send... Â send started...
  Run 2
  ---------
12503  Going to send...  send started...packet sent***** Got a Non-zeo length message12504  Going to send...  send started…
 It _seems_ to fail when sending after having received a message - but that may be a red herring, because it is likely that another message is being received at just about the same time as the send is happening.  I wonder if it is something to do with the timing of the send when messages are coming in as well.
 It seems to be worse (ie. fail more regularly) when there are lots of messages being transmitted in the air.
 As you can see from the debug above, it can sometimes take a considerable number of messages to fail. I had thought of adjusting the loop to send messages more frequently, but didn't want to disrupt the timing.
 Let me know if that makes any sense, and thanks for your assistance.
Mark
Â
//-----------------------------------------------------------------------------------------------------------------------------------------------------
#include <arduino.h>
#include <SPI.h>
#include <NRF24.h>
#define PreferredChannel     1
#define delay_interval      300
#define AddrLen          5
#define PayloadLen        17  // size of Message
//Message structure
struct Message
{
  long  msg1;
  long  msg2;
  byte  msg3;
  byte  msg4;
  byte  msg5;
  int  msg6; Â
  long  msg7;
};
NRF24 nrf24; // use this to be electrically compatible with Mirf
byte BroadcastAddr[AddrLen];
long counter = 0;
Message DataPacket;
void setup() {
 Â
 // set serial
 Serial.begin(57600);
 Â
 //set broadcast address
 BroadcastAddr[0] = 0xFF;
 BroadcastAddr[1] = 0xFF;
 BroadcastAddr[2] = 0xFF;
 BroadcastAddr[3] = 0xFF;
 BroadcastAddr[4] = 0xFF;
 Â
 Â
 // set up radio
 Serial.println("NRF24 Host");
 if (!nrf24.init())
  Serial.println("NRF24 init failed");
  Â
  Â
 // SET SPI DATA RATE TO SOMETHING RELIABLEÂ
 SPI.setClockDivider(SPI_CLOCK_DIV64);
 Â
 // Defaults after init are 2.402 GHz (channel 2)
 Â
 if (!nrf24.setChannel(PreferredChannel))
  Serial.println("setChannel failed");
  Â
 if (!nrf24.setThisAddress((uint8_t*)BroadcastAddr, AddrLen))
  Serial.println("setThisAddress failed");
  Â
 if (!nrf24.setPayloadSize(PayloadLen))
  Serial.println("setPayloadSize failed");
  Â
 if (!nrf24.setRF(NRF24::NRF24DataRate2Mbps, NRF24::NRF24TransmitPower0dBm))
  Serial.println("setRF failed");  Â
 // Enable the EN_DYN_ACK feature so we can use noack
 nrf24.spiWriteRegister(NRF24_REG_1D_FEATURE, NRF24_EN_DYN_ACK);
 Â
 Serial.println("initialised");
 Â
 //  seed the random number generator
 randomSeed(analogRead(0));
 Â
}
void Sendonoff(int nodeentry, boolean state)
{ Â Â Â Â Â Â Â Â
        // set my trasnmit address to something constant
        if (!nrf24.setThisAddress((uint8_t*)"Contr", 5))
             Serial.println("setThisAddress failed");
             Â
        // Need to set the address of the detination each time, since auto-ack changes the TX address
        if (!nrf24.setTransmitAddress((uint8_t*) BroadcastAddr, 5))
             Serial.println("setTransmitAddress failed");
           Â
           Â
        DataPacket.msg1 = 0x00;
        DataPacket.msg2 = 0x00;
        DataPacket.msg3 = 0x00;
        DataPacket.msg4 = 0x00;
        DataPacket.msg5 = 0x00;
        DataPacket.msg6 = 0x00;
        DataPacket.msg7 = 0x00;
        Â
        Serial.print(counter++);
        Serial.print("  Going to send...  ");
      Â
       Â
        // Send the data packet  Â
        if (!nrf24.send((uint8_t*)&DataPacket, sizeof(DataPacket), true))
             Serial.print("send failed"); Â
        else
             Serial.print("send started..."); Â
             Â
        //  **** this is where the execution seems to stop ****     Â
        if (!nrf24.waitPacketSent())
        {
         Â
             Serial.println("waitPacketSent failed"); Â
        }Â
        else
        {
          Â
             Serial.println("packet sent");
    Â
        }
}
void loop() {
        Â
 Â
   Sendonoff(0,true);
 Â
   Â
 //wait for radio for a random time to de-sync us with other nodes
 boolean  rxd = nrf24.waitAvailableTimeout(random(delay_interval)+150);
 Â
 // if we think we got something
 if (rxd)
 {
  Â
   uint8_t len;
   if (!nrf24.recv((uint8_t*)&DataPacket, &len))
     Serial.println("read failed");
   Â
   if ( len == 0)
   {
      Serial.println("***** Got zero length message ");
   }
   else
   {
    Â
     Serial.println("***** Got a Non-zeo length message");Â
  }  Â
 }
 Â
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------