Portado para mbed os 6
Dependencies: XBeeLib DigiLogger ALTIMU DHT MQ4 TinyGPSPlus
main.cpp@3:613cbcd98d0c, 2021-04-05 (annotated)
- 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?
User | Revision | Line number | New 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(¤t_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(¤t_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 | } |