|
Hi, i'm working with 5 Waspmote boards, i want to capture Sensirion's temperature and humidity values from 4 boards, and then send the messages through wireless Xbee module to a unic node (the other board). This node need also to capture the temperature and humidity values too, and then save the messages in different *.txt files in a micro SD plugged to this. Here are the codes both for the 4 slaves and for the master:
SLAVE (the same code for 4 boards) packetXBee* paq_sent; int8_t state=0; long previous=0; char* macHigh=" "; char* macLow=" "; int aux_1 = 0; int aux_2 = 0; uint8_t PANID[2]={0x12,0x34}; float value_temperature=0; float value_humidity=0; char svalue_temperature[100]; char svalue_humidity[100]; char aux[200]; char* MAC_sender =" ";
void setup() {
RTC.ON(); SensorAgr.setBoardMode(SENS_ON); //Set tinme RTC.setTime("11:09:01:05:12:00:00"); XBee.setMode(XBEE_ON); XBee.begin(38400); delay(1000); XBee.print("+++"); delay(2000); XBee.println("ATBD5,AP2,WR,CN"); delay(150); XBee.setMode(XBEE_OFF); XBee.close(); // Inits the XBee 802.15.4 library xbee.init(XBEE_802_15_4,FREQ2_4G,NORMAL); // Powers XBee xbee.ON(); // Get the XBee MAC address
delay(500); int counter = 0; while(xbee.getOwnMac()==1&&counter<4){ xbee.getOwnMac(); counter++; } // Get the XBee firmware version xbee.getSoftVersion();
Utils.hex2str(xbee.sourceMacHigh,macHigh,4);
Utils.hex2str(xbee.sourceMacLow,macLow,4);
if (xbee.softVersion[0]==0x10){ if (xbee.softVersion[1]==0x02){ xbee.init(XBEE_900,FREQ900M,NORMAL); } if (xbee.softVersion[1]==0x20){ xbee.init(XBEE_XSC,FREQ900M,PRO); } if (xbee.softVersion[1]==0x25||xbee.softVersion[1]==0x27){ xbee.init(XBEE_868,FREQ868M,PRO); } if (xbee.softVersion[1]>=0x81){ xbee.init(XBEE_802_15_4,FREQ2_4G,NORMAL); } } else { xbee.init(ZIGBEE,FREQ2_4G,NORMAL); } Utils.setLED(LED0, LED_ON); Utils.setLED(LED1, LED_ON); delay(5000); Utils.setLED(LED0, LED_OFF); Utils.setLED(LED1, LED_OFF); for (int i=0;i<24;i++){ Utils.blinkLEDs(125); } } void loop() { RTC.ON(); PWR.deepSleep("00:00:00:30",RTC_OFFSET,RTC_ALM1_MODE4,ALL_OFF); if( intFlag & RTC_INT ) { RTC.ON(); xbee.ON(); SensorAgr.setBoardMode(SENS_ON); SensorAgr.setSensorMode(SENS_ON, SENS_AGR_SENSIRION); delay(10000); value_temperature=SensorAgr.readValue(SENS_AGR_SENSIRION,SENSIRION_TEMP); delay(100); value_humidity= SensorAgr.readValue(SENS_AGR_SENSIRION,SENSIRION_HUM); Utils.float2String(value_temperature,svalue_temperature,2); Utils.float2String(value_humidity,svalue_humidity,2); sprintf(aux,"-mac:%s%s -time:%s -bat: %d -AgrTemp: %s -AgrHum: %s%c%c%c",macHigh,macLow,RTC.getTime(),PWR.getBatteryLevel(),svalue_temperature,svalue_humidity,'%','\r','\n'); sprintf(MAC_sender,"%s%s%c",macHigh,macLow,'/n'); paq_sent=(packetXBee*) calloc(1,sizeof(packetXBee)); paq_sent->mode=BROADCAST; paq_sent->MY_known=0; paq_sent->packetID=0x52; paq_sent->opt=0; xbee.hops=0; xbee.setOriginParams(paq_sent,MAC_sender,MAC_TYPE);// mac address sensore emittente xbee.setDestinationParams(paq_sent,"0013A200406916C2", aux, MAC_TYPE, DATA_ABSOLUTE); // mac address sensore ricevente xbee.sendXBee(paq_sent); free(paq_sent); paq_sent = NULL; xbee.OFF();
delay(100); } }
MASTER packetXBee* paq_sent; long previous=0 ,time; char buffer[200]; int n=0; int packet = 0; int i=1; uint8_t rssi; int g=0; uint8_t PANID[2]={0x12,0x34}; const char* filename="Folder_1.txt"; const char* filename2="Folder_2.txt"; const char* filename3="Folder_3.txt"; const char* filename4="Folder_4.txt"; const char* filename5="Folder_5.txt"; char* macHigh2="0013A200"; char* macLow2= "406916C2"; float value_temperature2=0; float value_humidity2=0; char svalue_temperature2[100]; char svalue_humidity2[100]; char out_m[200];
void setup() { // Inits the XBee 802.15.4 library xbee802.init(XBEE_802_15_4,FREQ2_4G,NORMAL); // Powers XBee XBee.setMode(XBEE_ON); XBee.begin(9600); delay(1000); XBee.print("+++"); delay(2000); XBee.println("ATBD5,AP2,WR,CN"); delay(150); XBee.setMode(XBEE_OFF); XBee.close(); delay(100); SD.ON(); // resets the SD card memory if (SD.isFile(filename)) {SD.del(filename);} if (SD.isFile(filename2)) {SD.del(filename2);} if (SD.isFile(filename3)) {SD.del(filename3);} if (SD.isFile(filename4)) {SD.del(filename4);} if (SD.isFile(filename5)) {SD.del(filename5);} //Setting RTC USB.println("Init RTC"); RTC.ON(); //Setting time where dow start from 1 (sunday) RTC.setTime("11:09:01:05:12:00:00"); }
void wireless() { previous=millis(); while( (millis()-previous) < 20000 ) { if( XBee.available() ) { xbee802.treatData(); if( !xbee802.error_RX ) { // Writing the parameters of the packet received while(xbee802.pos>0) { if(xbee802.packet_finished[xbee802.pos-1]->data[20]=='8' || xbee802.packet_finished[xbee802.pos-1]->data[21]=='8') SD.appendln(filename,xbee802.packet_finished[xbee802.pos-1]->data); else if(xbee802.packet_finished[xbee802.pos-1]->data[20]=='A' || xbee802.packet_finished[xbee802.pos-1]->data[21]=='A') SD.appendln(filename2,xbee802.packet_finished[xbee802.pos-1]->data); else if(xbee802.packet_finished[xbee802.pos-1]->data[20]=='C' || xbee802.packet_finished[xbee802.pos-1]->data[21]=='C') SD.appendln(filename3,xbee802.packet_finished[xbee802.pos-1]->data); else SD.appendln(filename4,xbee802.packet_finished[xbee802.pos-1]->data); free(xbee802.packet_finished[xbee802.pos-1]); xbee802.packet_finished[xbee802.pos-1]=NULL; xbee802.pos--; } if( millis()-previous < 0 ) previous=millis(); } } } }
void sensor() { delay(3000); value_temperature2=SensorAgr.readValue(SENS_AGR_SENSIRION,SENSIRION_TEMP); delay(100); value_humidity2= SensorAgr.readValue(SENS_AGR_SENSIRION,SENSIRION_HUM); Utils.float2String(value_temperature2,svalue_temperature2,2); Utils.float2String(value_humidity2,svalue_humidity2,2); sprintf(out_m,"-mac:%s%s -time:%s -bat: %d -AgrTemp: %s -AgrHum: %s%c%c%c",macHigh2,macLow2,RTC.getTime(),PWR.getBatteryLevel(),svalue_temperature2,svalue_humidity2,'%','\r','\n'); SD.appendln(filename5,out_m); }
void loop() { SD.ON(); SD.create(filename); SD.create(filename2); SD.create(filename3); SD.create(filename4); SD.create(filename5); Utils.setLED(LED0, LED_ON); Utils.setLED(LED1, LED_ON); xbee.ON(); delay(3000); wireless(); //USB.flush(); delay(2000); xbee.OFF(); SensorAgr.setBoardMode(SENS_ON); Utils.setLED(LED1, LED_OFF); delay(1000); sensor(); delay(1000); SensorAgr.setBoardMode(SENS_OFF); delay(1000); SD.OFF(); Utils.setLED(LED0, LED_OFF); delay(2000); }
The problems i have are: -if i use both wireless and sensor functions the only part of the code that runs correctly is the sensor one (only a file *.txt is correctly created and written); -if i use only one of the two functions all works fine, i capture the values and save correctly in different *.txt files.
What i have to add or modify in the master code? Regards, FP
|