Portado para mbed os 6

Dependencies:   XBeeLib DigiLogger ALTIMU DHT MQ4 TinyGPSPlus

Committer:
renanbmx123
Date:
Mon Apr 05 01:29:23 2021 +0000
Revision:
3:613cbcd98d0c
Parent:
2:48c18ad3673c
Tentando fazer funcionar o import no Mbed Studio.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
renanbmx123 0:c1eda8b76e10 1 // Main library's.
renanbmx123 0:c1eda8b76e10 2 #include "mbed.h"
renanbmx123 0:c1eda8b76e10 3 // Sensor library's.
renanbmx123 0:c1eda8b76e10 4 #include "ALTIMU.h"
renanbmx123 0:c1eda8b76e10 5 #include "TinyGPSPlus.h"
renanbmx123 0:c1eda8b76e10 6 #include "MQ4.h"
renanbmx123 0:c1eda8b76e10 7 #include "DHT.h"
renanbmx123 0:c1eda8b76e10 8 // Communication library.
renanbmx123 0:c1eda8b76e10 9 #include "XBeeLib.h"
renanbmx123 0:c1eda8b76e10 10 // Defines
renanbmx123 0:c1eda8b76e10 11 #define TIMEOUT 50 // Set ticker time, for time interrupt.
renanbmx123 0:c1eda8b76e10 12 #define NEW_PANID 0x1234 // Network Pan ID.
renanbmx123 0:c1eda8b76e10 13 #define NEW_CHANNEL_MASK 0x7FFF // Network Channel.
renanbmx123 0:c1eda8b76e10 14 #define SEARCH_NETWORK_RETRIES 20 // Numbers of retries search network.
renanbmx123 2:48c18ad3673c 15 //#define WRITE_LOCAL_DATA // For write local data on the board usb storage.
renanbmx123 0:c1eda8b76e10 16 //#define DEBUG_LEDS // USED FOR DEBUG.
renanbmx123 0:c1eda8b76e10 17 #define SAMPLES 10 // Read and send some samples to network.
renanbmx123 0:c1eda8b76e10 18 // State Machine
renanbmx123 0:c1eda8b76e10 19 #define SLEEP_STATE 2 // Sleep state, shutdown all modules and sensor then go to sleep.
renanbmx123 0:c1eda8b76e10 20 #define SEARCH_NETWORK_STATE 1 // Search for network, stays on this state if network doenst show up.
renanbmx123 0:c1eda8b76e10 21 #define READ_SEND_DATA_STATE 0 // This state send data after reading it.
renanbmx123 0:c1eda8b76e10 22 // Global objects.
renanbmx123 0:c1eda8b76e10 23 using namespace XBeeLib; // Namespace for XbeeLib
renanbmx123 0:c1eda8b76e10 24 DigitalOut* sleep_req = NULL; //Xbee sleep request pin.
renanbmx123 0:c1eda8b76e10 25 DigitalIn* on_sleep = NULL; // Xbee sleep read pin, for check sleep state.
renanbmx123 0:c1eda8b76e10 26 AnalogIn bat_pin(p16); // Batery level read analog pin 16.
renanbmx123 0:c1eda8b76e10 27 DigitalOut mq4_heater(p17); // MQ4 heater power pin control.
renanbmx123 0:c1eda8b76e10 28 DigitalOut GpsPwrPin(p15); // GPS power pin control`
renanbmx123 0:c1eda8b76e10 29 // This is used for debug, these leds are built in leds.
renanbmx123 0:c1eda8b76e10 30 #if defined(DEBUG_LEDS)
renanbmx123 0:c1eda8b76e10 31 DigitalOut led1(LED1); // Debug Led 1
renanbmx123 0:c1eda8b76e10 32 DigitalOut led2(LED2); // Debug Led 1
renanbmx123 0:c1eda8b76e10 33 DigitalOut led3(LED3); // Debug Led 1
renanbmx123 0:c1eda8b76e10 34 DigitalOut led4(LED4); // Debug Led 1
renanbmx123 0:c1eda8b76e10 35 #endif
renanbmx123 0:c1eda8b76e10 36 // Control variables
renanbmx123 0:c1eda8b76e10 37 uint8_t xbee_power_level = 0; //Xbee radio power level, set to minumun
renanbmx123 0:c1eda8b76e10 38 bool mcu_sleep = false; // microcontroler sleep control.
renanbmx123 0:c1eda8b76e10 39 Ticker tim; // Ticker, for timer interrupt .
renanbmx123 0:c1eda8b76e10 40 int conn_retries = 0; // Count numbers of trying to connect
renanbmx123 0:c1eda8b76e10 41 LocalFileSystem local("local");
renanbmx123 0:c1eda8b76e10 42 FILE *fp; // Logar dados no localfile da placa.
renanbmx123 0:c1eda8b76e10 43 // ---------------------------------
renanbmx123 0:c1eda8b76e10 44
renanbmx123 0:c1eda8b76e10 45 XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600);
renanbmx123 0:c1eda8b76e10 46 //Serial pc(USBTX, USBRX,9600);// Serial Debug.
renanbmx123 0:c1eda8b76e10 47 // Auxliar Function.
renanbmx123 0:c1eda8b76e10 48 float bat_level();
renanbmx123 0:c1eda8b76e10 49 bool is_radio_sleeping();
renanbmx123 0:c1eda8b76e10 50 void sleep_radio();
renanbmx123 0:c1eda8b76e10 51 void awake_radio();
renanbmx123 0:c1eda8b76e10 52 void sleepManager();
renanbmx123 0:c1eda8b76e10 53 TxStatus send_data_to_coordinator(XBeeZB& xbee, char *data);
renanbmx123 0:c1eda8b76e10 54 float bat_level();
renanbmx123 0:c1eda8b76e10 55 void XbeeNetworkSearch();
renanbmx123 0:c1eda8b76e10 56 void file_write(char* data_file);
renanbmx123 0:c1eda8b76e10 57 // Main function.
renanbmx123 0:c1eda8b76e10 58 int main(){
renanbmx123 0:c1eda8b76e10 59 // Serial Configuration.
renanbmx123 0:c1eda8b76e10 60 sleep_req = new DigitalOut(RADIO_SLEEP_REQ); // Xbee Sleep request pin
renanbmx123 0:c1eda8b76e10 61 on_sleep = new DigitalIn(RADIO_ON_SLEEP); // Xbee on sleep pin.
renanbmx123 0:c1eda8b76e10 62 uint8_t state;
renanbmx123 0:c1eda8b76e10 63 char gps_data;
renanbmx123 0:c1eda8b76e10 64 char data[200], // Data to send
renanbmx123 0:c1eda8b76e10 65 NorthSouth = 'F', // North South direction
renanbmx123 0:c1eda8b76e10 66 EastWest = 'F'; // East West direction
renanbmx123 0:c1eda8b76e10 67 uint16_t id; // Node identification
renanbmx123 0:c1eda8b76e10 68 uint8_t hour; //**********************
renanbmx123 0:c1eda8b76e10 69 uint8_t minute; //**********************
renanbmx123 0:c1eda8b76e10 70 uint8_t second; //**** Data and time UTC
renanbmx123 0:c1eda8b76e10 71 uint8_t day; //**** ,from gps module.
renanbmx123 0:c1eda8b76e10 72 uint8_t month; //**********************
renanbmx123 0:c1eda8b76e10 73 uint16_t year; //**********************
renanbmx123 0:c1eda8b76e10 74 float g[3], // Gyroscope
renanbmx123 0:c1eda8b76e10 75 acc[3] // Accelerometer
renanbmx123 0:c1eda8b76e10 76 ,mag[3], // Magnetrometer
renanbmx123 0:c1eda8b76e10 77 dht_t, // DHT22 temperature sensor
renanbmx123 0:c1eda8b76e10 78 dht_h, // DHT22 humidity sensor
renanbmx123 0:c1eda8b76e10 79 piezo, // Vibration sensor
renanbmx123 0:c1eda8b76e10 80 vbat, // Batery percentage.
renanbmx123 0:c1eda8b76e10 81 lat, // Latitude .
renanbmx123 0:c1eda8b76e10 82 lon, // Longitude.
renanbmx123 0:c1eda8b76e10 83 alt, // Altitude from gps module.
renanbmx123 0:c1eda8b76e10 84 Balt, // Altitude from barometer sensor.
renanbmx123 0:c1eda8b76e10 85 speed; // Speed over the ground
renanbmx123 0:c1eda8b76e10 86 float Bpress; // Barometric pressure
renanbmx123 0:c1eda8b76e10 87 // Instantiate objects.
renanbmx123 0:c1eda8b76e10 88 DHT dht_th(p23,DHT22); // Dht (Digital humidity temperature) sensor on digital pin 23.
renanbmx123 0:c1eda8b76e10 89 AnalogIn piezo_sensor(p20); // Piezo sensor on analog pin 20.
renanbmx123 0:c1eda8b76e10 90 MQ4 mq4(p18); // Gás sensor on analog pin 18.
renanbmx123 0:c1eda8b76e10 91 BufferedSerial GPSSerial(p9, p10,9600);
renanbmx123 0:c1eda8b76e10 92 Altimu lib_imu(p28,p27);
renanbmx123 0:c1eda8b76e10 93 TinyGPSPlus tgps;
renanbmx123 0:c1eda8b76e10 94 // Xbee object configuration.
renanbmx123 0:c1eda8b76e10 95 RadioStatus radioStatus = xbee.init();
renanbmx123 0:c1eda8b76e10 96 xbee.set_power_level(xbee_power_level);
renanbmx123 0:c1eda8b76e10 97
renanbmx123 0:c1eda8b76e10 98 // Configure radio and get id number.
renanbmx123 0:c1eda8b76e10 99 uint32_t serialn_low;
renanbmx123 0:c1eda8b76e10 100 uint64_t current_panid;
renanbmx123 0:c1eda8b76e10 101 uint16_t current_channel_mask;
renanbmx123 0:c1eda8b76e10 102 // Get 2 bytes of the address module, set Node id with it.
renanbmx123 0:c1eda8b76e10 103 xbee.get_param("SL", &serialn_low);
renanbmx123 0:c1eda8b76e10 104 id = (uint16_t)serialn_low;
renanbmx123 0:c1eda8b76e10 105 // Set PAN_ID if is not configured.
renanbmx123 0:c1eda8b76e10 106 xbee.get_operating_panid(&current_panid);
renanbmx123 0:c1eda8b76e10 107 if (current_panid != NEW_PANID) {
renanbmx123 0:c1eda8b76e10 108 xbee.set_panid(NEW_PANID);
renanbmx123 0:c1eda8b76e10 109 }
renanbmx123 0:c1eda8b76e10 110 // Set CN (channel mask) if its is not set.
renanbmx123 0:c1eda8b76e10 111 xbee.get_channel_mask(&current_channel_mask);
renanbmx123 0:c1eda8b76e10 112 if (current_channel_mask != NEW_CHANNEL_MASK) {
renanbmx123 0:c1eda8b76e10 113 xbee.set_channel_mask(NEW_CHANNEL_MASK);
renanbmx123 0:c1eda8b76e10 114 xbee.write_config();
renanbmx123 0:c1eda8b76e10 115 }
renanbmx123 0:c1eda8b76e10 116 mq4_heater = 1; // Set heater on, for Mq4 sensor set up.
renanbmx123 0:c1eda8b76e10 117 GpsPwrPin = 1; // Set gps on.
renanbmx123 0:c1eda8b76e10 118 #if defined(DEBUG_LEDS)
renanbmx123 0:c1eda8b76e10 119 led1 = 1;
renanbmx123 0:c1eda8b76e10 120 #endif
renanbmx123 0:c1eda8b76e10 121 //wait(30); // Wait sensor warm up on cold start, first start.
renanbmx123 0:c1eda8b76e10 122 ThisThread::sleep_for(chrono::milliseconds(20*1000));
renanbmx123 0:c1eda8b76e10 123 #if defined(DEBUG_LEDS)
renanbmx123 0:c1eda8b76e10 124 led1 = 0;
renanbmx123 0:c1eda8b76e10 125 #endif
renanbmx123 0:c1eda8b76e10 126 MQ4_data_t MQ4_data; // Store gas sensor information.
renanbmx123 0:c1eda8b76e10 127 mq4.begin(); // Begin te R0 calculation and sensor calibration.
renanbmx123 0:c1eda8b76e10 128 // Verify network connection at first start.
renanbmx123 0:c1eda8b76e10 129 XbeeNetworkSearch();
renanbmx123 0:c1eda8b76e10 130 state = READ_SEND_DATA_STATE;
renanbmx123 0:c1eda8b76e10 131
renanbmx123 0:c1eda8b76e10 132 while(1){
renanbmx123 0:c1eda8b76e10 133
renanbmx123 0:c1eda8b76e10 134 switch (state) {
renanbmx123 0:c1eda8b76e10 135 case READ_SEND_DATA_STATE:
renanbmx123 0:c1eda8b76e10 136 //Read data
renanbmx123 0:c1eda8b76e10 137 for (int j = 0; j < 10; j++){
renanbmx123 0:c1eda8b76e10 138 // Read 3 axis gyroscope sensor.
renanbmx123 0:c1eda8b76e10 139 lib_imu.read_L3GD20(&g[0],&g[1],&g[2]);
renanbmx123 0:c1eda8b76e10 140 // Read linear accleration and magnecti field.
renanbmx123 0:c1eda8b76e10 141 lib_imu.read_LSM303D(&acc[0],&acc[1],&acc[2],&mag[0],&mag[1],&mag[2]);
renanbmx123 0:c1eda8b76e10 142 // Read imu pressure in hPa and Altitude in metters.
renanbmx123 0:c1eda8b76e10 143 lib_imu.read_LPS25H(&Bpress, &Balt);
renanbmx123 0:c1eda8b76e10 144 // Read piezoeletric sensor.
renanbmx123 0:c1eda8b76e10 145 piezo = piezo_sensor.read();
renanbmx123 0:c1eda8b76e10 146 // Read 9V baterry charge.
renanbmx123 0:c1eda8b76e10 147 vbat = bat_level();
renanbmx123 0:c1eda8b76e10 148 dht_th.readData();
renanbmx123 0:c1eda8b76e10 149 // Read DHT22 temperature in celcius.
renanbmx123 0:c1eda8b76e10 150 dht_t = dht_th.ReadTemperature(CELCIUS);
renanbmx123 0:c1eda8b76e10 151 // Read DHT22 relative humidity
renanbmx123 0:c1eda8b76e10 152 dht_h = dht_th.ReadHumidity();
renanbmx123 0:c1eda8b76e10 153 // Read MQ4 gas sensor
renanbmx123 0:c1eda8b76e10 154 mq4.read(&MQ4_data);
renanbmx123 0:c1eda8b76e10 155 // Reading GPS data...
renanbmx123 0:c1eda8b76e10 156 for(int i =0;i<100;i++){
renanbmx123 0:c1eda8b76e10 157 if(GPSSerial.readable()){
renanbmx123 0:c1eda8b76e10 158 //while (!tgps.encode(GPSSerial.getc()));
renanbmx123 0:c1eda8b76e10 159 GPSSerial.read(&gps_data ,1);
renanbmx123 0:c1eda8b76e10 160 while (!tgps.encode(gps_data));
renanbmx123 0:c1eda8b76e10 161 i = 100;
renanbmx123 0:c1eda8b76e10 162 }
renanbmx123 0:c1eda8b76e10 163 }
renanbmx123 0:c1eda8b76e10 164 if(tgps.location.isValid()){
renanbmx123 0:c1eda8b76e10 165 lat = tgps.location.lat();
renanbmx123 0:c1eda8b76e10 166 lon = tgps.location.lng();
renanbmx123 0:c1eda8b76e10 167 }else{
renanbmx123 0:c1eda8b76e10 168 lat = 0;
renanbmx123 0:c1eda8b76e10 169 lon = 0;
renanbmx123 0:c1eda8b76e10 170 }
renanbmx123 0:c1eda8b76e10 171 if(tgps.altitude.isValid()){
renanbmx123 0:c1eda8b76e10 172 alt = tgps.altitude.meters();
renanbmx123 0:c1eda8b76e10 173 }else{
renanbmx123 0:c1eda8b76e10 174 alt = 0;
renanbmx123 0:c1eda8b76e10 175 }
renanbmx123 0:c1eda8b76e10 176 if(tgps.speed.isValid()){
renanbmx123 0:c1eda8b76e10 177 speed = tgps.speed.mps();
renanbmx123 0:c1eda8b76e10 178 }else{
renanbmx123 0:c1eda8b76e10 179 speed = 0;
renanbmx123 0:c1eda8b76e10 180 }
renanbmx123 0:c1eda8b76e10 181 if((tgps.NorthSouth == 'S') |
renanbmx123 0:c1eda8b76e10 182 (tgps.NorthSouth =='N')){
renanbmx123 0:c1eda8b76e10 183 NorthSouth = tgps.NorthSouth;
renanbmx123 0:c1eda8b76e10 184 }
renanbmx123 0:c1eda8b76e10 185 else{
renanbmx123 0:c1eda8b76e10 186 NorthSouth = 'F';
renanbmx123 0:c1eda8b76e10 187 }
renanbmx123 0:c1eda8b76e10 188 if ((tgps.EastWest == 'W') |
renanbmx123 0:c1eda8b76e10 189 (tgps.EastWest == 'E')){
renanbmx123 0:c1eda8b76e10 190 EastWest = tgps.EastWest;
renanbmx123 0:c1eda8b76e10 191 }else{
renanbmx123 0:c1eda8b76e10 192 EastWest = 'F';
renanbmx123 0:c1eda8b76e10 193 }
renanbmx123 0:c1eda8b76e10 194 if (tgps.time.isValid())
renanbmx123 0:c1eda8b76e10 195 {
renanbmx123 0:c1eda8b76e10 196 //second[1] = (tgps.time.second()%10)+48;
renanbmx123 0:c1eda8b76e10 197 //second[0] = (tgps.time.second()/10) +48;
renanbmx123 0:c1eda8b76e10 198 //minute[1] = (tgps.time.minute() %10)+48;
renanbmx123 0:c1eda8b76e10 199 second = tgps.time.second();//minute[0] = (tgps.time.minute()/10) +48;
renanbmx123 0:c1eda8b76e10 200 minute = tgps.time.minute();//hour[1] = (tgps.time.hour()%10)+48;
renanbmx123 0:c1eda8b76e10 201 hour = tgps.time.hour();//hour[0] = (tgps.time.hour()/10) +48;
renanbmx123 0:c1eda8b76e10 202 day = tgps.date.day();
renanbmx123 0:c1eda8b76e10 203 year = tgps.date.year();
renanbmx123 0:c1eda8b76e10 204 month = tgps.date.month();
renanbmx123 0:c1eda8b76e10 205
renanbmx123 0:c1eda8b76e10 206 }
renanbmx123 0:c1eda8b76e10 207 //Store data into a vector.
renanbmx123 0:c1eda8b76e10 208 sprintf(data,"%4x,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.2f,%.2f,%.2f,%.2f,%02d%02d%02d,%02d%02d%4d,%.3f,%.3f,%.2f,%c,%c,%.2f,%.2f,%.2f,%d",id,
renanbmx123 0:c1eda8b76e10 209 g[0], g[1], g[2],acc[0],acc[1], acc[2], mag[0], mag[1], mag[2],Bpress, dht_h,dht_t,MQ4_data.ch4,piezo, hour, minute,second,year,month,day, lon, lat, speed, NorthSouth, EastWest, Balt, alt,vbat,xbee_power_level);
renanbmx123 0:c1eda8b76e10 210 #if defined(WRITE_LOCAL_DATA)
renanbmx123 0:c1eda8b76e10 211 file_write(data);
renanbmx123 0:c1eda8b76e10 212 #endif
renanbmx123 0:c1eda8b76e10 213 while(send_data_to_coordinator(xbee, data) != TxStatusSuccess) // try to send data, every 100 ms
renanbmx123 0:c1eda8b76e10 214 {
renanbmx123 0:c1eda8b76e10 215 #if defined(DEBUG_LEDS)
renanbmx123 0:c1eda8b76e10 216 led1 = !led1;
renanbmx123 0:c1eda8b76e10 217 #endif
renanbmx123 0:c1eda8b76e10 218 //wait_ms(500);
renanbmx123 0:c1eda8b76e10 219 ThisThread::sleep_for(chrono::milliseconds(300));
renanbmx123 0:c1eda8b76e10 220 }
renanbmx123 0:c1eda8b76e10 221 //wait_ms(800);
renanbmx123 0:c1eda8b76e10 222 ThisThread::sleep_for(chrono::milliseconds(500));
renanbmx123 0:c1eda8b76e10 223 }
renanbmx123 0:c1eda8b76e10 224 state = SLEEP_STATE;
renanbmx123 0:c1eda8b76e10 225 break;
renanbmx123 0:c1eda8b76e10 226 case SLEEP_STATE:
renanbmx123 0:c1eda8b76e10 227 //Debug Led
renanbmx123 0:c1eda8b76e10 228 #if defined(DEBUG_LEDS)
renanbmx123 0:c1eda8b76e10 229 led2 = !led2;
renanbmx123 0:c1eda8b76e10 230 #endif
renanbmx123 0:c1eda8b76e10 231
renanbmx123 0:c1eda8b76e10 232 sleep_radio(); // Set radio to sleep.
renanbmx123 0:c1eda8b76e10 233 mq4_heater = 0; // Disable Mq4 sensor heater resistence.
renanbmx123 0:c1eda8b76e10 234 GpsPwrPin = 0;
renanbmx123 0:c1eda8b76e10 235 tim.attach(&sleepManager,TIMEOUT); // attach timeout function
renanbmx123 0:c1eda8b76e10 236 sleep();
renanbmx123 0:c1eda8b76e10 237 //Debug Led
renanbmx123 0:c1eda8b76e10 238 #if defined(DEBUG_LEDS)
renanbmx123 0:c1eda8b76e10 239 led2 = !led2;
renanbmx123 0:c1eda8b76e10 240 #endif
renanbmx123 0:c1eda8b76e10 241
renanbmx123 0:c1eda8b76e10 242 mq4_heater = 1; // Disable Mq4 sensor heater resistence.
renanbmx123 0:c1eda8b76e10 243 GpsPwrPin = 1; // Enable gps module.
renanbmx123 0:c1eda8b76e10 244 awake_radio();
renanbmx123 0:c1eda8b76e10 245 //wait(30);
renanbmx123 0:c1eda8b76e10 246 state = SEARCH_NETWORK_STATE;
renanbmx123 0:c1eda8b76e10 247 // whaiting for xbee join to network.
renanbmx123 0:c1eda8b76e10 248 break;
renanbmx123 0:c1eda8b76e10 249 case SEARCH_NETWORK_STATE: // Looking for network before
renanbmx123 0:c1eda8b76e10 250 XbeeNetworkSearch();
renanbmx123 0:c1eda8b76e10 251 state = READ_SEND_DATA_STATE;
renanbmx123 0:c1eda8b76e10 252 break;
renanbmx123 0:c1eda8b76e10 253 }
renanbmx123 0:c1eda8b76e10 254
renanbmx123 0:c1eda8b76e10 255 }
renanbmx123 0:c1eda8b76e10 256 }
renanbmx123 0:c1eda8b76e10 257
renanbmx123 0:c1eda8b76e10 258 // Auxliar Function.
renanbmx123 0:c1eda8b76e10 259 void file_write(char* data_file){
renanbmx123 0:c1eda8b76e10 260
renanbmx123 0:c1eda8b76e10 261 fp = fopen("/local/out.csv", "a");
renanbmx123 0:c1eda8b76e10 262 if(fp == NULL){
renanbmx123 0:c1eda8b76e10 263
renanbmx123 0:c1eda8b76e10 264 error("Arquivo nao encontrado\n\r");
renanbmx123 0:c1eda8b76e10 265 }
renanbmx123 0:c1eda8b76e10 266 fprintf(fp,"%s\n",data_file);
renanbmx123 0:c1eda8b76e10 267 fclose(fp);
renanbmx123 0:c1eda8b76e10 268 }
renanbmx123 0:c1eda8b76e10 269
renanbmx123 0:c1eda8b76e10 270 bool is_radio_sleeping() // Set radio to sleep, return 0 if radio sleep.
renanbmx123 0:c1eda8b76e10 271 {
renanbmx123 0:c1eda8b76e10 272 assert(on_sleep != NULL);
renanbmx123 0:c1eda8b76e10 273 return on_sleep->read() == 0;
renanbmx123 0:c1eda8b76e10 274 }
renanbmx123 0:c1eda8b76e10 275
renanbmx123 0:c1eda8b76e10 276 void sleep_radio() // Sleep xbee radio function.
renanbmx123 0:c1eda8b76e10 277 {
renanbmx123 0:c1eda8b76e10 278 assert(sleep_req != NULL);
renanbmx123 0:c1eda8b76e10 279 sleep_req->write(1);
renanbmx123 0:c1eda8b76e10 280 }
renanbmx123 0:c1eda8b76e10 281
renanbmx123 0:c1eda8b76e10 282 void awake_radio() // Wake up xbee radio funcion.
renanbmx123 0:c1eda8b76e10 283 {
renanbmx123 0:c1eda8b76e10 284 assert(sleep_req != NULL);
renanbmx123 0:c1eda8b76e10 285 sleep_req->write(0);
renanbmx123 0:c1eda8b76e10 286 /* Wait until radio awakes. Typically 14 mS */
renanbmx123 0:c1eda8b76e10 287 while(is_radio_sleeping());
renanbmx123 0:c1eda8b76e10 288 }
renanbmx123 0:c1eda8b76e10 289
renanbmx123 0:c1eda8b76e10 290 void sleepManager() // Sleep Manager function.
renanbmx123 0:c1eda8b76e10 291 {
renanbmx123 0:c1eda8b76e10 292 tim.detach(); // Deatach timer interrupt.
renanbmx123 0:c1eda8b76e10 293 #if defined(DEBUG_LEDS)
renanbmx123 0:c1eda8b76e10 294 led4 = !led4;
renanbmx123 0:c1eda8b76e10 295 #endif
renanbmx123 0:c1eda8b76e10 296 }
renanbmx123 0:c1eda8b76e10 297 TxStatus send_data_to_coordinator(XBeeZB& xbee, char *data)
renanbmx123 0:c1eda8b76e10 298 {
renanbmx123 0:c1eda8b76e10 299 const TxStatus txStatus = xbee.send_data_to_coordinator((const uint8_t *)data, strlen(data));
renanbmx123 0:c1eda8b76e10 300 return txStatus;
renanbmx123 0:c1eda8b76e10 301 }
renanbmx123 0:c1eda8b76e10 302
renanbmx123 0:c1eda8b76e10 303 float bat_level(){
renanbmx123 0:c1eda8b76e10 304 return bat_pin.read()*5;
renanbmx123 0:c1eda8b76e10 305 }
renanbmx123 0:c1eda8b76e10 306
renanbmx123 0:c1eda8b76e10 307 void XbeeNetworkSearch(){
renanbmx123 0:c1eda8b76e10 308 // whaiting for xbee join to network.
renanbmx123 0:c1eda8b76e10 309 while (!xbee.is_joined()) {
renanbmx123 0:c1eda8b76e10 310 xbee.set_power_level(xbee_power_level);
renanbmx123 0:c1eda8b76e10 311 //wait_ms(1000);
renanbmx123 0:c1eda8b76e10 312 ThisThread::sleep_for(1);
renanbmx123 0:c1eda8b76e10 313 conn_retries ++;
renanbmx123 0:c1eda8b76e10 314 if(conn_retries == SEARCH_NETWORK_RETRIES){
renanbmx123 0:c1eda8b76e10 315 if(xbee_power_level < 4)
renanbmx123 0:c1eda8b76e10 316 {
renanbmx123 0:c1eda8b76e10 317 xbee_power_level ++;
renanbmx123 0:c1eda8b76e10 318 }
renanbmx123 0:c1eda8b76e10 319 else{
renanbmx123 0:c1eda8b76e10 320
renanbmx123 0:c1eda8b76e10 321 sleep_radio(); // sleep radio
renanbmx123 0:c1eda8b76e10 322 tim.attach(&sleepManager,TIMEOUT); // Call this function every time when reach TIMEOUT value.
renanbmx123 0:c1eda8b76e10 323 sleep(); // Sleep for a while when network is not reach.
renanbmx123 0:c1eda8b76e10 324 awake_radio(); // wake up radio
renanbmx123 0:c1eda8b76e10 325 conn_retries = 0; // Reset the count variable.
renanbmx123 0:c1eda8b76e10 326 }
renanbmx123 0:c1eda8b76e10 327 }
renanbmx123 0:c1eda8b76e10 328 #if defined(DEBUG_LEDS)
renanbmx123 0:c1eda8b76e10 329 led3 = !led3;
renanbmx123 0:c1eda8b76e10 330 #endif
renanbmx123 0:c1eda8b76e10 331 }
renanbmx123 0:c1eda8b76e10 332 }