XBee in API mode, preparing data to be send and parsing received data

Thanks to you Paul, I got it all to work.

I am attaching both sketches, hoping that someone else can learn from it.

Tx sketch

/**
 * Basis communication text for xBEEe-Arduino.
 * set the ADDRESS for the destination xBee 
 * LED will flash to confirm the test or the error
 */
 
#include <XBee.h>


/*
This example is for Series 1 XBee
Sends a TX16 or TX64 request with the value of analogRead(pin5) and checks the status response for success
*/

XBee xbee = XBee();

unsigned long start = millis();

// allocate two bytes for to hold a 10-bit analog reading
uint8_t payload[] = { 0, 0,0,0,0,0,0,0 };

// with Series 1 you can use either 16-bit or 64-bit addressing

// 16-bit addressing: Enter address of remote XBee, typically the coordinator
Tx16Request tx = Tx16Request(0x1111, payload, sizeof(payload));

// 64-bit addressing: This is the SH + SL address of remote XBee
//XBeeAddress64 addr64 = XBeeAddress64(0x0013a200, 0x4008b490);
// unless you have MY on the receiving radio set to FFFF, this will be received as a RX16 packet
//Tx64Request tx = Tx64Request(addr64, payload, sizeof(payload));

TxStatusResponse txStatus = TxStatusResponse();

int pin5 = 0;

int statusLed = 13;

union {
      float f;
      byte b[4];
   } stuff;

void setup() {
  pinMode(statusLed, OUTPUT);
  
  xbee.begin(9600);  // start serial
  
  flashLed(statusLed, 30, 50);
}

void loop() {
   
   // start transmitting after a startup delay.  Note: this will rollover to 0 eventually so not best way to handle
    if (millis() - start > 15000) {
      
      // Sending a byte 
      byte test_byte = 9;
      payload[0] = test_byte;
      // Sending a char
      char test_char  = 'a';
      payload[1] = test_char;                 // Non conversion needed, just sent the ASCII value
      // Sending an int
      int test_int = 1232;
      payload[2] = test_int >> 8 & 0xff;      // Converting int to hex could also used highByte() lowByte()
      payload[3] = test_int & 0xff;
      // Sending a float
      stuff.f = 3.14159;
      payload[4] = stuff.b[0];                // Converting using the data type defined in "union"
      payload[5] = stuff.b[1];
      payload[6] = stuff.b[2];
      payload[7] = stuff.b[3];
      
      xbee.send(tx);
      delay(2000);               // Delay to allow reading of the message

      // flash TX indicator
      flashLed(statusLed, 5, 100);
    }
  
    // after sending a tx request, we expect a status response
    // wait up to 5 seconds for the status response
    if (xbee.readPacket(5000)) {
        // got a response!

        // should be a znet tx status            	
    	if (xbee.getResponse().getApiId() == TX_STATUS_RESPONSE) {
    	   xbee.getResponse().getZBTxStatusResponse(txStatus);
    		
    	   // get the delivery status, the fifth byte
           if (txStatus.getStatus() == SUCCESS) {
            	// success.  time to celebrate
             	flashLed(statusLed, 5, 50);
           } else {
            	// the remote XBee did not receive our packet. is it powered on?
             	//flashLed(errorLed, 3, 500);
               flashLed(statusLed, 3, 1000);
           }
        }      
    } else if (xbee.getResponse().isError()) {
      //nss.print("Error reading packet.  Error code: ");  
      //nss.println(xbee.getResponse().getErrorCode());
      // or flash error led
    } else {
      // local XBee did not provide a timely TX Status Response.  Radio is not configured properly or connected
      //flashLed(errorLed, 2, 50);
      flashLed(statusLed, 5, 1000);
    }
    
    delay(3000);
}

void flashLed(int pin, int times, int wait) {
    
    for (int i = 0; i < times; i++) {
      digitalWrite(pin, HIGH);
      delay(wait);
      digitalWrite(pin, LOW);
      
      if (i + 1 < times) {
        delay(wait);
      }
    }
}

Rx

/**
 * Basis communication text for xBEEe-Arduino.
 * LED will flash to confirm the test or the error 
 */
 

#include <XBee.h>
#include <SoftwareSerial.h> // to be used for LCD Display

/*
This example is for Series 1 XBee (802.15.4)
Receives either a RX16 or RX64 packet and sets a PWM value based on packet data.
Error led is flashed if an unexpected packet is received
*/

XBee xbee = XBee();
XBeeResponse response = XBeeResponse();
// create reusable response objects for responses we expect to handle 
Rx16Response rx16 = Rx16Response();
Rx64Response rx64 = Rx64Response();

int statusLed = 13;


uint8_t option = 0;
uint8_t data = 0;

union {
      float f;
      byte b[4];
   } stuff;

SoftwareSerial myLCD(9,10);

void setup() {
  pinMode(statusLed, OUTPUT);
  
 
  xbee.begin(9600);  // start serial
  myLCD.begin(9600);
  flashLed(statusLed, 30, 50);
}

// continuously reads packets, looking for RX16 or RX64
void loop() {
    
    xbee.readPacket();
    
    if (xbee.getResponse().isAvailable()) {
      // got something
      flashLed(statusLed, 10, 50);
      if (xbee.getResponse().getApiId() == RX_16_RESPONSE || xbee.getResponse().getApiId() == RX_64_RESPONSE) {
        // got a rx packet
        
        if (xbee.getResponse().getApiId() == RX_16_RESPONSE) {
                xbee.getResponse().getRx16Response(rx16);
        	option = rx16.getOption();
        	data = rx16.getData(0);
        } else {
                xbee.getResponse().getRx64Response(rx64);
        	option = rx64.getOption();
        	data = rx64.getData(0);
        }
        
        flashLed(statusLed, 10, 50);
        
        myLCD.write(0xFE); myLCD.write(0x01);  // Clear Screen
        myLCD.print("Getting message");
          delay(15);  
        myLCD.write(0x0A); // Line Feed 
        
        // Receiving and printing a byte
        myLCD.print(rx16.getData(0));  myLCD.print(" ");
        
        // Receiving and printing a char
        myLCD.print(char(rx16.getData(1))); myLCD.print(" ");
        
        // Receiving and printing an int
         byte unite1 = rx16.getData(2);
         byte unite2 = rx16.getData(3);
         myLCD.print(word(unite1,unite2)); myLCD.print(" ");
         
         // Receiving and printing a float
         stuff.b[0] = rx16.getData(4);
         stuff.b[1] = rx16.getData(5);
         stuff.b[2] = rx16.getData(6);
         stuff.b[3] = rx16.getData(7);
         myLCD.print(stuff.f);
         
         

         flashLed(statusLed, 10, 50);
        myLCD.write(0xFE); myLCD.write(0x01);  // Clear Screen
        
      } else {
      	// not something we were expecting
        flashLed(statusLed, 3, 1000);    
      }
    } else if (xbee.getResponse().isError()) {
      flashLed(statusLed, 3, 1000);    
    } 
}

void flashLed(int pin, int times, int wait) {
    
    for (int i = 0; i < times; i++) {
      digitalWrite(pin, HIGH);
      delay(wait);
      digitalWrite(pin, LOW);
      
      if (i + 1 < times) {
        delay(wait);
      }
    }
}

Thanks to Andrew Rapp for writing the XBee library and Paul for providing guidance how to use it.

1 Like