Home  >  Support  >  Support Forum  >  xbee s2 api transmission Question
Notice! We've recently migrated to using a new forum, we hope you enjoy it. If you are an existing member and this is your first time visiting our new forum, please reset your password to be able to sign in.

xbee s2 api transmission Question

0 votes
Hey guys, i have a question about my project with UNO R3 and XBEE S2 transmission. I use a couple of sensors like a RF temperature sensor, two SHT75 sensors, a 3-axis accelemeter and a illumination sensen. And after collect the data, we use XBEE(S2,API mode) to send the data to the gateway,every round is about 1 second.

1.the first problem is the data is about 16 bytes but the packet does not send successful every round. Sometime it works, and sometimes it does'nt. but the
payload of xbee can be 60 or 70 bytes in the datasheet...
but if i put the payload as some simply integer(like 1, 2, 3),not the data from sensor, and the transmission will be stable.

2.after meet the problem above, i divide the data into two packets(each with 8 bytes payload), and the first packet is very stable but the second is very unstable. as mentioned above, if i put some number into the second packets instead of the sensing data the second packet will become stable and send successfully every round.

so i think its the code problem but idk where is the problem. i try to change the baud rate or increasing the delay time between the two packets. does someone know where is the problem~thx~the following is my code:
Code:
#include <XBee.h> #include <i2cmaster.h> #include <string.h> #include <ctype.h> #include <Sensirion.h> #include "Wire.h" #include "MMA845XQ.h" /////////////////////////////XBEE setup////////////////////////////////// XBee xbee = XBee(); XBeeAddress64 remoteAddress = XBeeAddress64(0x00000000, 0x00000000); ZBRxResponse zbRx = ZBRxResponse(); ZBTxStatusResponse zbTxStus = ZBTxStatusResponse(); uint8_t payload[] = {0,0,0,0,0,0,0,0,0}; uint8_t payload1[] = {0,0,0,0,0,0,0,0,0}; /////////////////////////////accelemeter////////////////////////////////// MMA845XQ accel; ////////////////////////// SHT1 serial data and clock //////////////////// const byte dataPin = 2; const byte sclkPin = 3; Sensirion sht = Sensirion(dataPin, sclkPin); unsigned int rawData; float temperature; float humidity; byte stat; ////////////////////////// SHT2 serial data and clock //////////////////// const byte dataPin1 = 4; const byte sclkPin1 = 5; Sensirion sht1 = Sensirion(dataPin1, sclkPin1); unsigned int rawData1; float temperature1; float humidity1; byte stat1; ///////////////////////////////illumination sensor//////////////////////// int sensorPin = A0; // select the input pin for the potentiometer int sensorValue = 0; // variable to store the value coming from the sensor long int pardata, pardata_low, pardata_hi, real_pardata; uint16_t illumindata = 0; void setup () { i2c_init(); //Initialise the i2c bus PORTC = (1 << PORTC4) | (1 << PORTC5);//enable pullups Wire.begin(); accel.begin(false, 2); Serial.begin(115200); xbee.begin(Serial); } void loop () { payload[0]=10; payload1[0]=11; /////////////////////RF temperature sensor///////////////////////////// int dev = 0x5A<<1; int data_low = 0; int data_high = 0; int pec = 0; i2c_start_wait(dev+I2C_WRITE); i2c_write(0x07); i2c_rep_start(dev+I2C_READ); data_low = i2c_readAck(); //Read 1 byte and then send ack data_high = i2c_readAck(); //Read 1 byte and then send ack pec = i2c_readNak(); i2c_stop(); //This converts high and low bytes together and processes temperature, MSB is a error bit and is ignored for temps double tempFactor = 0.02; // 0.02 degrees per LSB (measurement resolution of the MLX90614) double tempData = 0x0000; // zero out the data int frac; // data past the decimal point // This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte. tempData = (double)(((data_high & 0x007F) << 8) + data_low); tempData = (tempData * tempFactor)-0.01; float celcius = tempData - 273.15; float fahrenheit = (celcius*1.8) + 32; celcius *= 100; int a = int(celcius)+1; payload[1] = a >> 8 & 0xff; payload[2] = a & 0xff; ////////////////////////////illumination sensor//////////////////////////////// sensorValue = analogRead(sensorPin); TSR(sensorValue); payload[3] = pardata_low >> 8 & 0xff; payload[4] = pardata_low & 0xff; ////////////////////////////3-axis accelemeter sensor//////////////////////////////// accel.update(); payload[5] = accel.getX()*10; payload[6] = accel.getY()*10; payload[7] = accel.getZ()*10; delay(100); //////////////////////////////xbee send first packet/////////////////////////////////////////////// xbee=XBee(); xbee.begin(Serial); ZBTxRequest zbTx = ZBTxRequest(remoteAddress,payload, sizeof(payload)); zbTx.setAddress16(0xfffe); xbee.send(zbTx); delay(500); //////////////////////////SHT 1x temperature and humidity sensor//////////////////////////////////// sht.readSR(&stat); // Read sensor status register sht.writeSR(LOW_RES); // Set sensor to low resolution sht.readSR(&stat); // Read sensor status register again sht.measTemp(&rawData); // sht.meas(TEMP, &rawData, BLOCK) sht.meas(TEMP, &rawData, NONBLOCK); temperature = sht.calcTemp(rawData); sht.measHumi(&rawData); // sht.meas(HUMI, &rawData, BLOCK) humidity = sht.calcHumi(rawData, temperature); sht.meas(HUMI, &rawData, NONBLOCK); humidity = sht.calcHumi(rawData, temperature); temperature *= 100; a = int(temperature)+1; payload1[1] = a >> 8 & 0xff; payload1[2] = a & 0xff; humidity *= 100; a = int(humidity)+1; payload1[3] = a >> 8 & 0xff; payload1[4] = a & 0xff; delay(10); sht1.readSR(&stat1); sht1.writeSR(LOW_RES); // Set sensor to low resolution sht1.readSR(&stat1); sht1.measTemp(&rawData1); // sht.meas(TEMP, &rawData, BLOCK) temperature1 = sht1.calcTemp(rawData1); sht1.measHumi(&rawData1); // sht.meas(HUMI, &rawData, BLOCK) humidity1 = sht1.calcHumi(rawData1, temperature1); delay(10); temperature1 *= 100; a = int(temperature1)+1; payload1[5] = a >> 8 & 0xff; payload1[6] = a & 0xff; humidity1 *= 100; a = int(humidity1)+1; payload1[7] = a >> 8 & 0xff; payload1[8] = a & 0xff; //////////////////////////////xbee send second packet/////////////////////////////////////////////// xbee=XBee(); xbee.begin(Serial); zbTx = ZBTxRequest(remoteAddress,payload1, sizeof(payload1)); zbTx.setAddress16(0xfffe); //NODE NUM UNKNOWN xbee.send(zbTx); delay(500); } void TSR(int sensorValue) { illumindata = (sensorValue * 4 * 5) / 1.5; pardata = 6250/6144*illumindata*10; if(pardata > 0) //add!!!! { if(pardata < 11500) { real_pardata = 0.0000000020561*pardata*pardata*pardata-0.00002255*pardata*pardata+0.25788*pardata-6.481; if (real_pardata < 0) { real_pardata = 0; } pardata_hi = real_pardata/65535; pardata_low = real_pardata%65535; } else { real_pardata = 0.0000049204*pardata*pardata*pardata-0.17114*pardata*pardata+1978.7*pardata-7596900; if (real_pardata < 0) { real_pardata = 0; } pardata_hi = real_pardata/65535; pardata_low = real_pardata%65535; } } else { pardata_hi = 0; pardata_low = 0; } }
asked Dec 19, 2013 in XBee Programmable Development by kobe82316 New to the Community (0 points)
edited Dec 19, 2013 by kobe82316

Please log in or register to answer this question.

1 Answer

0 votes
I am now having the same problem. In my opinion, that's the problem of payload.
ZBTxRequest zbTx = ZBTxRequest(addr64, payload, sizeof(payload));
There, the payload should be uint8_t and we couldn't change any data type. My accelerometer is giving data like 522 or above but when I transmit it, it could give maximum 255.
Have you already found any solution for this? Please kindly share me if you have already solved to transmit accelerometer data.

Thanks in advance.
answered Jul 7 by nyeinayemm New to the Community (6 points)
Contact a Digi expert and get started today! CONTACT US
...