my actual project involves atleast 5-6 of the above
and this is what i got to do
broadcast a msg to all the xbees
record the signal strength for each packet so that i can get a rough measurement of distance of each module
now from what i've read the API packets have the rss values and can also transmit data... so i thought may be the data transmitted can be used to identify the individual module by manually setting it.
the problem:
im not even able to get two boards communicating in API mode... i've been at it for three days now, gone thru numerous tutorials...
have even installed the xbee.h library... still nothing works :(... and since im new to this whole thing, i think im missing something basic
which might be trivial to ppl that they havent mentioned newhere :(....
would help me a ton if someone could post the code for a simple api data transfer with the initial steps...
record the signal strength for each packet so that i can get a rough measurement of distance of each module
There is no good correlation between signal strength and distance. Signal strength is a function of too many variables - battery voltage and current of the sender, distance, material that the signal passed through, interference, etc.
well i used the xbee.h library's example tx program, and i only get an error
initial setup
connected an xbee to my laptop
ATMY FFFF
ATAP 2
here is the code on my arduino
i jus changed the address in txrequest to FFFF
and the value to be transmitted to r (pin5)
#include <XBee.h>
XBee xbee = XBee();
unsigned long start = millis();
// allocate two bytes for to hold a 10-bit analog reading
uint8_t payload[] = { 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(0xFFFF, payload, sizeof(payload));
TxStatusResponse txStatus = TxStatusResponse();
int pin5 = 0;
int statusLed = 11;
int errorLed = 12;
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);
}
}
}
void setup() {
pinMode(statusLed, OUTPUT);
pinMode(errorLed, OUTPUT);
xbee.begin(9600);
}
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)
{
// break down 10-bit reading into two bytes and place in payload
pin5 = 20;
payload[0] = pin5 >> 8 & 0xff;
payload[1] = pin5 & 0xff;
xbee.send(tx);
// flash TX indicator
flashLed(statusLed, 1, 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);
}
}
}
else
{
// local XBee did not provide a timely TX Status Response -- should not happen
flashLed(errorLed, 2, 50);
}
delay(1000);
}
when i run the code, my arduino serial monitor displays garbage value, the same one over and over again--> (~ yE- ~ yE- ~ yE-)
is the abve changes sufficient or is there something i missed out on???
What kind of XBees are you using? I have the Pros and I had to set one up as a coordinator and the other as a router.
I also have a version of the XBee.h and XBee.cpp that uses NewSoftSerial so you can talk to the computer from your arduino board while communicating with the XBee, really helps to debug.