well im not really expert but if u want my example project 5 module xbee s2c comunnication.
my config xbee
pan id 123
//coordinator SH 13A200 SL 41630C48 DH 0 DL FFFF api mode 2
//end dev SH 13A200 SL 41554A03 DH 13A200 DL 41630C4B api mode 2
//router 1 SH 13A200 SL 41554A05 DH 0 DL 0 api mode 2
//router 2 SH 13A200 SL 41673405 DH 0 DL 0 api mode 2
//router 3 SH 13A200 SL 41630C4B DH 0 DL 0 api mode 2
end device
#include <XBee.h>
XBee xbee = XBee();
uint8_t data[] = {'H','I'};
// SH + SL Address of receiving XBee
XBeeAddress64 addr64 = XBeeAddress64(0x0013A200, 0x41630C4B);
ZBTxRequest zbTx = ZBTxRequest(addr64, payload, sizeof(data));
ZBTxStatusResponse txStatus = ZBTxStatusResponse();
int statusLed = 13;
int errorLed = 13;
void setup() {
Serial.begin(9600); //Baud rate: 9600
pinMode(statusLed, OUTPUT);
pinMode(errorLed, OUTPUT);
xbee.setSerial(Serial);
}
void loop {
xbee.send(zbTx);
// after sending a tx request, we expect a status response
flashLed(statusLed, 1, 100);
if (xbee.readPacket(500))// wait 500ms if true
{
if (xbee.getResponse().isAvailable()) {
// got a response! // trx packet from xbee to variable
if (xbee.getResponse().getApiId() == ZB_TX_STATUS_RESPONSE) {
xbee.getResponse().getZBTxStatusResponse(txStatus);
if (txStatus.getDeliveryStatus() == SUCCESS) {
// success. time to celebrate
flashLed(statusLed, 5, 100);
//zbTx.setFrameId(xbee.getNextFrameId());
}
else {
// the remote XBee did not receive our packet. is it powered on?
flashLed(errorLed, 3, 50);
}
}
else if (xbee.getResponse().isError()) {
//Serial.print("Error reading packet. Error code: ");
//Serial.println(xbee.getResponse().getErrorCode());
flashLed(errorLed, 6, 100);
}
} else {
flashLed(statusLed, 2, 100);
//no response
}
}//
else
{
//time out after 500ms for read packet
}
}
void flashLed(int pin, int jumlah, int wait) {
for (int i = 0; i < jumlah; i++) {
digitalWrite(pin, HIGH);
delay(wait);
digitalWrite(pin, LOW);
if (i + 1 < jumlah) {
delay(wait);
}
}
}
router
#include <XBee.h>
#include <AltSoftSerial.h>
AltSoftSerial xb;
uint8_t payload[] = {0,0} //iniate array byte for receive because 2 char H,I
ZBRxResponse zbRx = ZBRxResponse();
ModemStatusResponse msr = ModemStatusResponse();
// SH + SL Address of receiving XBee
XBeeAddress64 addr64 = XBeeAddress64(0x00000000, 0x41673405);// just change to other address you want forward
ZBTxRequest zbTx = ZBTxRequest(addr64, payload, sizeof(payload));
ZBTxStatusResponse txStatus = ZBTxStatusResponse();
void setup()
{
Serial.begin(9600);
xbee.setSerial(xb);
xb.begin(9600);
xb.println("ready");
}
void loop()
{
// 1. This will read any data that is available:
xbee.readPacket();
// 2. Now, to check if a packet was received:
if (xbee.getResponse().isAvailable())
{
// got packet from xbee
if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
{
// trx packet from xbee to variable
xb.print("Got an rx packet from: ");
XBeeAddress64 senderLongAddress = zbRx.getRemoteAddress64();
print32Bits(senderLongAddress.getMsb());
xb.print(" ");
print32Bits(senderLongAddress.getLsb());
xb.println();
xbee.getResponse().getZBRxResponse(zbRx);
if (zbRx.getOption() == ZB_PACKET_ACKNOWLEDGED) {
// the sender got an ACK
flashLed(statusLed, 5, 100);
xb.println("packet acknowledged");
}
else {
// we got it (obviously) but sender didn't get an ACK
flashLed(errorLed, 2, 100);
xb.println("packet not acknowledged");
}
xb.print("Packet length is ");
xb.print(zbRx.getPacketLength(), DEC);
xb.print(", data payload length is ");
xb.print(zbRx.getDataLength(),DEC);
xb.print(" checksum is ");
xb.println(zbRx.getChecksum(), HEX);
xb.println("Received Data: ");
for (int i = 0; i < zbRx.getDataLength(); i++) {
print8Bits(zbRx.getData()[i]);//
payload[i]=zbRx.getData()[i];
xb.print(' ');
}
xb.println();
//getFrame for format api start delimiter 0x7E bla bla
//dataOffset for payload packet
//getdatalength for data payload length
zbTx.setPayload(zbRx.getFrameData() + zbRx.getDataOffset(), zbRx.getDataLength());
xbee.send(zbTx);
xb.println("Forward packet");
} else {
xb.print("Not packet received, other status");
}
}
else if (xbee.getResponse().isError()){
Serial.print("error code:");
Serial.print(xbee.getResponse().getErrorCode());
if (xbee.getResponse().getErrorCode()==1){
xb.println(" Checksum error");
} else
if (xbee.getResponse().getErrorCode()==3){
xb.println(" Unexpected Start Byte");
}
}
else {
xb.println("packet loss");
}
delay(500);
}// END OF LOOP
coordinator
#include <XBee.h>
#include <AltSoftSerial.h>
AltSoftSerial xb;
uint8_t payload[] = {0,0} //iniate array byte for receive because 2 char H,I
ZBRxResponse zbRx = ZBRxResponse();
ModemStatusResponse msr = ModemStatusResponse();
void setup()
{
Serial.begin(9600);
xbee.setSerial(xb);
xb.begin(9600);
xb.println("ready");
}
void loop()
{
// 1. This will read any data that is available:
xbee.readPacket();
// 2. Now, to check if a packet was received:
if (xbee.getResponse().isAvailable())
{
// got packet from xbee
if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
{
// trx packet from xbee to variable
xb.print("Got an rx packet from: ");
XBeeAddress64 senderLongAddress = zbRx.getRemoteAddress64();
print32Bits(senderLongAddress.getMsb());
xb.print(" ");
print32Bits(senderLongAddress.getLsb());
xb.println();
xbee.getResponse().getZBRxResponse(zbRx);
if (zbRx.getOption() == ZB_PACKET_ACKNOWLEDGED) {
// the sender got an ACK
flashLed(statusLed, 5, 100);
xb.println("packet acknowledged");
}
else {
// we got it (obviously) but sender didn't get an ACK
flashLed(errorLed, 2, 100);
xb.println("packet not acknowledged");
}
xb.print("Packet length is ");
xb.print(zbRx.getPacketLength(), DEC);
xb.print(", data payload length is ");
xb.print(zbRx.getDataLength(),DEC);
xb.print(" checksum is ");
xb.println(zbRx.getChecksum(), HEX);
xb.println("Received Data: ");
for (int i = 0; i < zbRx.getDataLength(); i++) {
print8Bits(zbRx.getData()[i]);//
payload[i]=zbRx.getData()[i];
xb.print(' ');
}
xb.println();
c[0]= zbRx.getData(0);
c[1]= zbRx.getData(1);
xb.print("Value ");
xb.println(c);
} else {
xb.print("Not packet received, other status");
}
}
else if (xbee.getResponse().isError()){
Serial.print("error code:");
Serial.print(xbee.getResponse().getErrorCode());
if (xbee.getResponse().getErrorCode()==1){
xb.println(" Checksum error");
} else
if (xbee.getResponse().getErrorCode()==3){
xb.println(" Unexpected Start Byte");
}
}
else {
xb.println("packet loss");
}
delay(500);
}// END OF LOOP
void print32Bits(uint32_t dw){
print16Bits(dw >> 16);
print16Bits(dw & 0xFFFF);
}
void print16Bits(uint16_t w){
print8Bits(w >> 8);
print8Bits(w & 0x00FF);
}
void print8Bits(byte c){
uint8_t nibble = (c >> 4);
if (nibble <= 9)
Serial.write(nibble + 0x30);
else
Serial.write(nibble + 0x37);
nibble = (uint8_t) (c & 0x0F);
if (nibble <= 9)
Serial.write(nibble + 0x30);
else
Serial.write(nibble + 0x37);
}