XBee Receiver polling two XBee Transmitters
hi guys,
i have configured 3 xbees communicate tx1 <==> rx , tx2 <==> rx. , tested them individually, point point temperature sensor code. having troubling actual code point multipoint now.
i think problem polling signals. using "*" , "(" polling signals , start characters data each of sensors. first sensor tx1 sending 2 bytes of temperature data, second 1 tx2 sending 2 bytes (unsigned int) of rpm data.
my intention -- rx broadcasts polling signal tx1, tx1 sends data, after read rx, rx broadcasts polling signal tx2, tx2 sends data rx, after read cycle repeats.
i have 3 codes : 1 receiver, 1 transmitter of hall sensor , 1 transmitter of temperature sensor.
i have used '*' , '(' data_start signals, , same polling signals. hall sensor sends data (starting '(' character) when polled '(', , temperature sensor sends data starting '*' when polled '*'..
i think polling signals messing up. can me this?
temperature sensor code (tx 1)
hall sensor code (tx 2)
receiver code
okay, here messed in xbeerx.print(poll_1) , xbeerx.print(poll_2), signals.
ps : moderators, modified version of in arduino forum. thought better post here under "programming questions", because actually. guys remove other post, shifted here because wasn't getting responses in other one.
i have configured 3 xbees communicate tx1 <==> rx , tx2 <==> rx. , tested them individually, point point temperature sensor code. having troubling actual code point multipoint now.
i think problem polling signals. using "*" , "(" polling signals , start characters data each of sensors. first sensor tx1 sending 2 bytes of temperature data, second 1 tx2 sending 2 bytes (unsigned int) of rpm data.
my intention -- rx broadcasts polling signal tx1, tx1 sends data, after read rx, rx broadcasts polling signal tx2, tx2 sends data rx, after read cycle repeats.
i have 3 codes : 1 receiver, 1 transmitter of hall sensor , 1 transmitter of temperature sensor.
i have used '*' , '(' data_start signals, , same polling signals. hall sensor sends data (starting '(' character) when polled '(', , temperature sensor sends data starting '*' when polled '*'..
i think polling signals messing up. can me this?
temperature sensor code (tx 1)
code: [select]
#include <softwareserial.h>
#include <i2cmaster.h>
softwareserial xbeetx(2, 3); // rx, tx
const byte dev = 0x5a<<1;
const char data_start = '*';
const char data_format[] = "%c%02x%02x";
char datastream[6]; // data_format result in 5 characters plus 1 null character automatically applied sprintf() function need 6 element array buffer
byte data_low;
byte data_high;
byte pec;
char data_in;
void setup()
{
serial.begin(9600);
xbeetx.begin(9600);
i2c_init(); //initialise i2c bus
portc = (1 << portc4) | (1 << portc5);//enable pullups
}
void loop()
{
i2c_start_wait(dev+i2c_write);
i2c_write(0x07);
// read
i2c_rep_start(dev+i2c_read);
data_low = i2c_readack(); //read 1 byte , send ack
data_high = i2c_readack(); //read 1 byte , send ack
pec = i2c_readnak();
i2c_stop();
if (xbeetx.available())
{
data_in = xbeetx.read();
if (data_in == data_start)
{
sprintf(datastream, data_format, data_start, data_high, data_low);
xbeetx.print(datastream);
serial.print(datastream);
serial.println(f(" sent on xbee."));
delay(100); // adjust ever delay want.
}
}
}
hall sensor code (tx 2)
code: [select]
#include <softwareserial.h>
softwareserial xbeetx(2, 3); // rx, tx
const char data_start = '(';
const char data_format[] = "%c%04x";
char datastream[6];
volatile byte revolutions;
unsigned int rpm;
unsigned int rpm_send;
unsigned long timeold;
unsigned long k;
char data_in;
void setup()
{
serial.begin(9600);
xbeetx.begin(9600);
attachinterrupt(0, rpm_fun, falling);
revolutions = 0;
rpm = 0;
timeold = 0;
k = 0;
}
void loop()
{
if (revolutions >= 10) //** update rpm every 10 counts**
{
k = millis() - timeold;
rpm = 60000/k*revolutions; // **calculate revolutions per minute
timeold = millis();
revolutions = 0;
}
if (xbeetx.available())
{
data_in = xbeetx.read();
if(data_in == data_start) // if polling signal has arrived
{ // send data
sprintf(datastream, data_format, data_start, rpm);
xbeetx.print(datastream);
serial.println(f("sent on xbee"));
delay(100);
}
}
}
void rpm_fun()
{
revolutions++;
}
receiver code
okay, here messed in xbeerx.print(poll_1) , xbeerx.print(poll_2), signals.
code: [select]
#include <softwareserial.h>
softwareserial xbeerx(2, 3); // rx, tx
const char poll_1 = '*'; // constant, use const keyword allow compiler decide how best optimize
const char poll_2 = '(';
const char data_format_1[] = "%c%02x%02x"; // sprintf() %c single character , %02x 2 character ascii encoded hex number representing 1 byte
const char data_format_2[] = "%c%02x%02x";
char datastream_1[6]; // data_format result in 5 characters plus 1 null character automatically applied sprintf() function need 6 element array buffer
char datastream_2[6];
boolean newreading_1 = false; // because use before explicitly setting it, make sure default false set here.
boolean newreading_2 = false;
byte readposition_1;
byte readposition_2;
byte data_temp_1;
byte data_temp_2;
byte data_rpm_1;
byte data_rpm_2;
char data_in;
void setup()
{
serial.begin(9600);
xbeerx.begin(9600);
}
void loop()
{
xbeerx.print(poll_2) // sends polling signal 1 later
delay(1000);
// reading data
if (xbeerx.available())
{
data_in = xbeerx.read();
switch (readposition_1)
{
case 0:
{
if (data_in == poll_1)
readposition_1++;
break;
}
case 1:
{
data_temp_1 = hexchartovalue(data_in)<<4;
readposition_1++;
break;
}
case 2:
{
data_temp_1 = hexchartovalue(data_in)+data_temp_1;
readposition_1++;
break;
}
case 3:
{
data_temp_2 = hexchartovalue(data_in)<<4;
readposition_1++;
break;
}
case 4:
{
data_temp_2 = hexchartovalue(data_in)+data_temp_2;
readposition_1 = 0;
newreading_1 = true;
}
}
// reading hall sensor data
switch(readposition_2)
{
case 0:
{
if (data_in == poll_2)
readposition_2++;
break;
}
case 1:
{
data_rpm_1 = hexchartovalue(data_in)<<4;
readposition_2++;
break;
}
case 2:
{
data_rpm_1 = hexchartovalue(data_in)+data_rpm_1;
readposition_2++;
break;
}
case 3:
{
data_rpm_2 = hexchartovalue(data_in)<<4;
readposition_2++;
break;
}
case 4:
{
data_rpm_2 = hexchartovalue(data_in)+data_rpm_2;
readposition_2 = 0;
newreading_2 = true;
}
}
}
if (newreading_1 == true) // newreading boolean type
{
sprintf(datastream_1, data_format_1, poll_1, data_temp_1, data_temp_2);
//serial.print(datastream); // diagnostics
double tempfactor = 0.02;
unsigned int tempdata;
float kelvin;
float celsius;
tempdata = ((data_temp_1 & 0x007f) << 8) + data_temp_2;
kelvin = (tempdata * tempfactor);
celsius = kelvin - 273.15;
serial.print(f(" celsius: ")); // save sram using f() macro constant text messages
serial.println(celsius);
newreading_1 = false;
}
if (newreading_2 == true) // newreading boolean type
{
sprintf(datastream_2, data_format_2, poll_2, data_rpm_1, data_rpm_2);
unsigned int rpm;
rpm = ((data_rpm_1 & 0x007f) << 8) + data_rpm_2;
serial.print(f("rpm: ")); // save sram using f() macro constant text messages
serial.println(rpm);
xbee.print(poll_1); // rx polls tx1 after data 2 has been read
delay(100);
newreading_2 = false;
}
}
byte hexchartovalue (char x)
{
byte value;
char upper; // should match x, make char. (will save 1 byte of stack space in process).
byte first_result;
if (isxdigit(x))
{
upper = toupper(x);
first_result = upper - 0x30;
if (first_result < 0x0a)
{
value = first_result;
}
else
{
value = first_result - 0x10;
value = value + 9;
}
}
else
{
value = 0;
}
return value;
}
ps : moderators, modified version of in arduino forum. thought better post here under "programming questions", because actually. guys remove other post, shifted here because wasn't getting responses in other one.
quote
the hall sensor sends data
no, doesn't. there arduino involved doing something. doubt hall sensor has radio built in.
code: [select]
const char data_format_1[] = "%c%02x%02x"; // sprintf() %c single character , %02x 2 character ascii encoded hex number representing 1 byte
const char data_format_2[] = "%c%02x%02x";
are these somehow different? why need two?
code: [select]
char datastream_1[6]; // data_format result in 5 characters plus 1 null character automatically applied sprintf() function need 6 element array buffer
char datastream_2[6];
why need two?
that code reading data complete nonsense. reading , storing data in both arrays after polling #2.
code: [select]
delay(100); // adjust ever delay want.
how 0? there no reason wait time before reading sensor again or before checking see if arduino being paged again.
it lot simpler send data in base 10. combine high , low bytes on transmitters, , send value 7 bytes (id , 6 (max) value, allow -32768.) yes, take longer, don't have deal hex dec conversion , byte manipulation on receiver. sending kind of end-of-data marker better relying on fixed length string, too.
Arduino Forum > Using Arduino > Programming Questions > XBee Receiver polling two XBee Transmitters
arduino
Comments
Post a Comment