This program connects to the The Things Network backend in OTAA Mode. It logs sensor values from a BME 280 to the backend. Tried adding support for Grove GPS using SerialGPS library but it is not working - conflicting with mbed-rtos, so it commented. Deep Sleep for mDot implemented BUT avoiding reprogramming of the mDot config is NOT working.
Dependencies: BME280 SerialGPS libmDot mbed-rtos mbed
main.cpp@4:97f9ad3f2566, 2016-07-07 (annotated)
- Committer:
- AshuJoshi
- Date:
- Thu Jul 07 00:07:45 2016 +0000
- Revision:
- 4:97f9ad3f2566
- Parent:
- 3:5c2bcba214b5
- Child:
- 5:4bc6ba66f28e
Had added SerialGPS, removed it to make it stable again.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AshuJoshi | 0:3ec6a7645098 | 1 | /****************************************************** |
AshuJoshi | 0:3ec6a7645098 | 2 | * A Program to interface the Grove Base Shielf V2 |
AshuJoshi | 0:3ec6a7645098 | 3 | * to the mDot UDK. |
AshuJoshi | 0:3ec6a7645098 | 4 | * Additionally sample code to compress the data |
AshuJoshi | 0:3ec6a7645098 | 5 | * for use with LPWANs such as LoRa |
AshuJoshi | 0:3ec6a7645098 | 6 | *****************************************************/ |
AshuJoshi | 0:3ec6a7645098 | 7 | |
AshuJoshi | 0:3ec6a7645098 | 8 | #include "mbed.h" |
AshuJoshi | 0:3ec6a7645098 | 9 | #include <math.h> |
AshuJoshi | 2:866a72c3c3bf | 10 | #include <string> |
AshuJoshi | 2:866a72c3c3bf | 11 | #include "mDot.h" |
AshuJoshi | 2:866a72c3c3bf | 12 | #include "MTSLog.h" |
AshuJoshi | 2:866a72c3c3bf | 13 | #include "MTSText.h" |
AshuJoshi | 1:36e336869699 | 14 | #include "BME280.h" |
AshuJoshi | 4:97f9ad3f2566 | 15 | |
AshuJoshi | 0:3ec6a7645098 | 16 | |
AshuJoshi | 2:866a72c3c3bf | 17 | using namespace mts; |
AshuJoshi | 2:866a72c3c3bf | 18 | |
AshuJoshi | 2:866a72c3c3bf | 19 | #define MIN(a,b) (((a)<(b))?(a):(b)) |
AshuJoshi | 2:866a72c3c3bf | 20 | #define MAX(a,b) (((a)>(b))?(a):(b)) |
AshuJoshi | 2:866a72c3c3bf | 21 | |
AshuJoshi | 1:36e336869699 | 22 | // mDot UDK Specific |
AshuJoshi | 1:36e336869699 | 23 | // MDot Pinout: https://developer.mbed.org/platforms/MTS-mDot-F411/#pinout-diagram |
AshuJoshi | 0:3ec6a7645098 | 24 | // Uncomment this line if using a full sized UDK2.0 instead of a Micro UDK |
AshuJoshi | 1:36e336869699 | 25 | |
AshuJoshi | 0:3ec6a7645098 | 26 | #define UDK2 1 |
AshuJoshi | 0:3ec6a7645098 | 27 | #ifdef UDK2 |
AshuJoshi | 0:3ec6a7645098 | 28 | DigitalOut led(LED1); |
AshuJoshi | 0:3ec6a7645098 | 29 | #else |
AshuJoshi | 0:3ec6a7645098 | 30 | DigitalOut led(XBEE_RSSI); |
AshuJoshi | 0:3ec6a7645098 | 31 | #endif |
AshuJoshi | 0:3ec6a7645098 | 32 | |
AshuJoshi | 1:36e336869699 | 33 | //BME280 sensor(I2C_SDA, I2C_SCL) |
AshuJoshi | 1:36e336869699 | 34 | // MDot UDK - I2C_SDA and I2C_SCL connected to PC_9/PA_* |
AshuJoshi | 1:36e336869699 | 35 | BME280 b280(PC_9, PA_8); |
AshuJoshi | 1:36e336869699 | 36 | |
AshuJoshi | 1:36e336869699 | 37 | |
AshuJoshi | 0:3ec6a7645098 | 38 | // Globals |
AshuJoshi | 0:3ec6a7645098 | 39 | Ticker tick; |
AshuJoshi | 2:866a72c3c3bf | 40 | mDot* dot; |
AshuJoshi | 2:866a72c3c3bf | 41 | |
AshuJoshi | 0:3ec6a7645098 | 42 | |
AshuJoshi | 0:3ec6a7645098 | 43 | // Function Declarations |
AshuJoshi | 0:3ec6a7645098 | 44 | void endLessTestLoop(); |
AshuJoshi | 0:3ec6a7645098 | 45 | void setUpLEDBlink(); |
AshuJoshi | 0:3ec6a7645098 | 46 | void blink(); |
AshuJoshi | 1:36e336869699 | 47 | void readandprintBME280(); |
AshuJoshi | 2:866a72c3c3bf | 48 | void mDotConfig(); |
AshuJoshi | 2:866a72c3c3bf | 49 | void mDotGotoDeepSleep(int seconds); |
AshuJoshi | 3:5c2bcba214b5 | 50 | void mDotConfigPrint(); |
AshuJoshi | 4:97f9ad3f2566 | 51 | void initSerialGPS(); |
AshuJoshi | 2:866a72c3c3bf | 52 | |
AshuJoshi | 0:3ec6a7645098 | 53 | |
AshuJoshi | 0:3ec6a7645098 | 54 | |
AshuJoshi | 0:3ec6a7645098 | 55 | /***************************************************** |
AshuJoshi | 0:3ec6a7645098 | 56 | * MAIN |
AshuJoshi | 0:3ec6a7645098 | 57 | *****************************************************/ |
AshuJoshi | 0:3ec6a7645098 | 58 | int main(){ |
AshuJoshi | 0:3ec6a7645098 | 59 | |
AshuJoshi | 0:3ec6a7645098 | 60 | // Simple Test Functions, "Hello World on UDK |
AshuJoshi | 0:3ec6a7645098 | 61 | setUpLEDBlink(); |
AshuJoshi | 2:866a72c3c3bf | 62 | mDotConfig(); |
AshuJoshi | 3:5c2bcba214b5 | 63 | mDotConfigPrint(); |
AshuJoshi | 4:97f9ad3f2566 | 64 | |
AshuJoshi | 0:3ec6a7645098 | 65 | endLessTestLoop(); |
AshuJoshi | 0:3ec6a7645098 | 66 | |
AshuJoshi | 0:3ec6a7645098 | 67 | return 0; |
AshuJoshi | 0:3ec6a7645098 | 68 | } |
AshuJoshi | 0:3ec6a7645098 | 69 | |
AshuJoshi | 2:866a72c3c3bf | 70 | /***************************************************** |
AshuJoshi | 2:866a72c3c3bf | 71 | * mDot Functions |
AshuJoshi | 2:866a72c3c3bf | 72 | ****************************************************/ |
AshuJoshi | 2:866a72c3c3bf | 73 | |
AshuJoshi | 2:866a72c3c3bf | 74 | |
AshuJoshi | 2:866a72c3c3bf | 75 | void mDotConfig() { |
AshuJoshi | 2:866a72c3c3bf | 76 | // get a mDot handle |
AshuJoshi | 2:866a72c3c3bf | 77 | dot = mDot::getInstance(); |
AshuJoshi | 2:866a72c3c3bf | 78 | //dot->setLogLevel(mts::MTSLog::INFO_LEVEL); |
AshuJoshi | 2:866a72c3c3bf | 79 | dot->setLogLevel(mts::MTSLog::TRACE_LEVEL); |
AshuJoshi | 2:866a72c3c3bf | 80 | // print library version information |
AshuJoshi | 2:866a72c3c3bf | 81 | logInfo("version: %s", dot->getId().c_str()); |
AshuJoshi | 2:866a72c3c3bf | 82 | } |
AshuJoshi | 2:866a72c3c3bf | 83 | |
AshuJoshi | 2:866a72c3c3bf | 84 | void mDotGotoDeepSleep(int seconds) { |
AshuJoshi | 2:866a72c3c3bf | 85 | // logInfo("input to sleep routine %d", seconds); |
AshuJoshi | 2:866a72c3c3bf | 86 | // Should sleep here and wakeup after a set interval. |
AshuJoshi | 2:866a72c3c3bf | 87 | uint32_t sleep_time = MAX((dot->getNextTxMs() / 1000), seconds); |
AshuJoshi | 2:866a72c3c3bf | 88 | logInfo("going to sleep for %d seconds", sleep_time); |
AshuJoshi | 2:866a72c3c3bf | 89 | // go to sleep and wake up automatically sleep_time seconds later |
AshuJoshi | 4:97f9ad3f2566 | 90 | //dot->sleep(sleep_time, mDot::RTC_ALARM, false); |
AshuJoshi | 4:97f9ad3f2566 | 91 | dot->sleep(sleep_time, mDot::RTC_ALARM); |
AshuJoshi | 2:866a72c3c3bf | 92 | |
AshuJoshi | 2:866a72c3c3bf | 93 | } |
AshuJoshi | 0:3ec6a7645098 | 94 | |
AshuJoshi | 3:5c2bcba214b5 | 95 | void mDotConfigPrint() { |
AshuJoshi | 3:5c2bcba214b5 | 96 | |
AshuJoshi | 3:5c2bcba214b5 | 97 | // Display what is set |
AshuJoshi | 3:5c2bcba214b5 | 98 | printf("\r\n"); |
AshuJoshi | 3:5c2bcba214b5 | 99 | printf(" ********** mDot Configuration ************ \n"); |
AshuJoshi | 3:5c2bcba214b5 | 100 | std::vector<uint8_t> tmp = dot->getNetworkSessionKey(); |
AshuJoshi | 3:5c2bcba214b5 | 101 | printf("Network Session Key: "); |
AshuJoshi | 3:5c2bcba214b5 | 102 | printf("%s\n", mts::Text::bin2hexString(tmp, " ").c_str()); |
AshuJoshi | 3:5c2bcba214b5 | 103 | |
AshuJoshi | 3:5c2bcba214b5 | 104 | tmp = dot->getDataSessionKey(); |
AshuJoshi | 3:5c2bcba214b5 | 105 | printf("Data Session Key: "); |
AshuJoshi | 3:5c2bcba214b5 | 106 | printf("%s\n", mts::Text::bin2hexString(tmp, " ").c_str()); |
AshuJoshi | 3:5c2bcba214b5 | 107 | |
AshuJoshi | 3:5c2bcba214b5 | 108 | // App EUI |
AshuJoshi | 3:5c2bcba214b5 | 109 | tmp = dot->getNetworkId(); |
AshuJoshi | 3:5c2bcba214b5 | 110 | printf("App EUI: "); |
AshuJoshi | 3:5c2bcba214b5 | 111 | printf("%s\n", mts::Text::bin2hexString(tmp, " ").c_str()); |
AshuJoshi | 3:5c2bcba214b5 | 112 | |
AshuJoshi | 3:5c2bcba214b5 | 113 | // App Key |
AshuJoshi | 3:5c2bcba214b5 | 114 | tmp = dot->getNetworkKey(); |
AshuJoshi | 3:5c2bcba214b5 | 115 | printf("App Key: "); |
AshuJoshi | 3:5c2bcba214b5 | 116 | printf("%s\n", mts::Text::bin2hexString(tmp, " ").c_str()); |
AshuJoshi | 3:5c2bcba214b5 | 117 | |
AshuJoshi | 3:5c2bcba214b5 | 118 | |
AshuJoshi | 3:5c2bcba214b5 | 119 | printf("Device ID "); |
AshuJoshi | 3:5c2bcba214b5 | 120 | std::vector<uint8_t> deviceId; |
AshuJoshi | 3:5c2bcba214b5 | 121 | deviceId = dot->getDeviceId(); |
AshuJoshi | 3:5c2bcba214b5 | 122 | for (std::vector<uint8_t>::iterator it = deviceId.begin() ; it != deviceId.end(); ++it) |
AshuJoshi | 3:5c2bcba214b5 | 123 | printf("%2.2x",*it ); |
AshuJoshi | 3:5c2bcba214b5 | 124 | printf("\n"); |
AshuJoshi | 3:5c2bcba214b5 | 125 | |
AshuJoshi | 3:5c2bcba214b5 | 126 | std::vector<uint8_t> netAddress; |
AshuJoshi | 3:5c2bcba214b5 | 127 | |
AshuJoshi | 3:5c2bcba214b5 | 128 | printf("Network Address "); |
AshuJoshi | 3:5c2bcba214b5 | 129 | netAddress = dot->getNetworkAddress(); |
AshuJoshi | 3:5c2bcba214b5 | 130 | for (std::vector<uint8_t>::iterator it = netAddress.begin() ; it != netAddress.end(); ++it) |
AshuJoshi | 3:5c2bcba214b5 | 131 | printf("%2.2x",*it ); |
AshuJoshi | 3:5c2bcba214b5 | 132 | |
AshuJoshi | 3:5c2bcba214b5 | 133 | printf("\n"); |
AshuJoshi | 3:5c2bcba214b5 | 134 | |
AshuJoshi | 3:5c2bcba214b5 | 135 | // Display LoRa parameters |
AshuJoshi | 3:5c2bcba214b5 | 136 | // Display label and values in different colours, show pretty values not numeric values where applicable |
AshuJoshi | 3:5c2bcba214b5 | 137 | printf("Public Network: %s\n", (char*)(dot->getPublicNetwork() ? "Yes" : "No") ); |
AshuJoshi | 3:5c2bcba214b5 | 138 | printf("Frequency: %s\n", (char*)mDot::FrequencyBandStr(dot->getFrequencyBand()).c_str() ); |
AshuJoshi | 3:5c2bcba214b5 | 139 | printf("Sub Band: %s\n", (char*)mDot::FrequencySubBandStr(dot->getFrequencySubBand()).c_str() ); |
AshuJoshi | 3:5c2bcba214b5 | 140 | printf("Join Mode: %s\n", (char*)mDot::JoinModeStr(dot->getJoinMode()).c_str() ); |
AshuJoshi | 3:5c2bcba214b5 | 141 | printf("Join Retries: %d\n", dot->getJoinRetries() ); |
AshuJoshi | 3:5c2bcba214b5 | 142 | printf("Join Byte Order: %s\n", (char*)(dot->getJoinByteOrder() == 0 ? "LSB" : "MSB") ); |
AshuJoshi | 3:5c2bcba214b5 | 143 | printf("Link Check Count: %d\n", dot->getLinkCheckCount() ); |
AshuJoshi | 3:5c2bcba214b5 | 144 | printf("Link Check Thold: %d\n", dot->getLinkCheckThreshold() ); |
AshuJoshi | 3:5c2bcba214b5 | 145 | printf("Tx Data Rate: %s\n", (char*)mDot::DataRateStr(dot->getTxDataRate()).c_str() ); |
AshuJoshi | 3:5c2bcba214b5 | 146 | printf("Tx Power: %d\n", dot->getTxPower() ); |
AshuJoshi | 3:5c2bcba214b5 | 147 | printf("TxWait: %s, ", (dot->getTxWait() ? "Y" : "N" )); |
AshuJoshi | 3:5c2bcba214b5 | 148 | printf("CRC: %s, ", (dot->getCrc() ? "Y" : "N") ); |
AshuJoshi | 3:5c2bcba214b5 | 149 | printf("Ack: %s\n", (dot->getAck() ? "Y" : "N") ); |
AshuJoshi | 3:5c2bcba214b5 | 150 | |
AshuJoshi | 3:5c2bcba214b5 | 151 | |
AshuJoshi | 3:5c2bcba214b5 | 152 | |
AshuJoshi | 3:5c2bcba214b5 | 153 | } |
AshuJoshi | 3:5c2bcba214b5 | 154 | |
AshuJoshi | 0:3ec6a7645098 | 155 | |
AshuJoshi | 0:3ec6a7645098 | 156 | |
AshuJoshi | 1:36e336869699 | 157 | /***************************************************** |
AshuJoshi | 1:36e336869699 | 158 | * Sensor Functions |
AshuJoshi | 1:36e336869699 | 159 | ****************************************************/ |
AshuJoshi | 0:3ec6a7645098 | 160 | |
AshuJoshi | 1:36e336869699 | 161 | void readandprintBME280() { |
AshuJoshi | 2:866a72c3c3bf | 162 | float temperature; |
AshuJoshi | 2:866a72c3c3bf | 163 | float pressure; |
AshuJoshi | 2:866a72c3c3bf | 164 | float humidity; |
AshuJoshi | 2:866a72c3c3bf | 165 | char string_buffer[64]; |
AshuJoshi | 4:97f9ad3f2566 | 166 | time_t secs; |
AshuJoshi | 4:97f9ad3f2566 | 167 | |
AshuJoshi | 4:97f9ad3f2566 | 168 | secs = time(NULL); |
AshuJoshi | 4:97f9ad3f2566 | 169 | printf("Seconds since January 1, 1970: %d\n", secs); |
AshuJoshi | 4:97f9ad3f2566 | 170 | printf("Time as a basic string = %s", ctime(&secs)); |
AshuJoshi | 2:866a72c3c3bf | 171 | |
AshuJoshi | 2:866a72c3c3bf | 172 | // Temperature |
AshuJoshi | 2:866a72c3c3bf | 173 | temperature = b280.getTemperature(); |
AshuJoshi | 2:866a72c3c3bf | 174 | sprintf(string_buffer, "%s%3.2f", "TC:", temperature); |
AshuJoshi | 2:866a72c3c3bf | 175 | logInfo("The temperature is %s", string_buffer); |
AshuJoshi | 2:866a72c3c3bf | 176 | // Pressure |
AshuJoshi | 2:866a72c3c3bf | 177 | pressure = b280.getPressure(); |
AshuJoshi | 2:866a72c3c3bf | 178 | sprintf(string_buffer, "%s%04.2f", "hPa:", pressure); |
AshuJoshi | 2:866a72c3c3bf | 179 | logInfo("The pressure is %s", string_buffer); |
AshuJoshi | 2:866a72c3c3bf | 180 | // Humidity |
AshuJoshi | 2:866a72c3c3bf | 181 | humidity = b280.getHumidity(); |
AshuJoshi | 2:866a72c3c3bf | 182 | sprintf(string_buffer, "%s%03.2f", "H%:", humidity); |
AshuJoshi | 2:866a72c3c3bf | 183 | logInfo("The humidty is %s", string_buffer); |
AshuJoshi | 2:866a72c3c3bf | 184 | |
AshuJoshi | 2:866a72c3c3bf | 185 | // printf("%2.2f degC, %04.2f hPa, %2.2f %%\n", temperature, pressure, humidity); |
AshuJoshi | 1:36e336869699 | 186 | } |
AshuJoshi | 0:3ec6a7645098 | 187 | |
AshuJoshi | 0:3ec6a7645098 | 188 | |
AshuJoshi | 0:3ec6a7645098 | 189 | |
AshuJoshi | 0:3ec6a7645098 | 190 | /***************************************************** |
AshuJoshi | 1:36e336869699 | 191 | * FUNCTIONS for Simple Testing |
AshuJoshi | 1:36e336869699 | 192 | ****************************************************/ |
AshuJoshi | 0:3ec6a7645098 | 193 | |
AshuJoshi | 0:3ec6a7645098 | 194 | void setUpLEDBlink(){ |
AshuJoshi | 0:3ec6a7645098 | 195 | // configure the Ticker to blink the LED on 500ms interval |
AshuJoshi | 0:3ec6a7645098 | 196 | tick.attach(&blink, 0.5); |
AshuJoshi | 0:3ec6a7645098 | 197 | } |
AshuJoshi | 0:3ec6a7645098 | 198 | |
AshuJoshi | 0:3ec6a7645098 | 199 | void endLessTestLoop() { |
AshuJoshi | 0:3ec6a7645098 | 200 | while(true) { |
AshuJoshi | 1:36e336869699 | 201 | // printf("Hello world!\r\n"); |
AshuJoshi | 1:36e336869699 | 202 | printf("BME280 Sensor: \n"); |
AshuJoshi | 1:36e336869699 | 203 | readandprintBME280(); |
AshuJoshi | 2:866a72c3c3bf | 204 | |
AshuJoshi | 4:97f9ad3f2566 | 205 | mDotGotoDeepSleep(60); |
AshuJoshi | 4:97f9ad3f2566 | 206 | //wait(5); |
AshuJoshi | 2:866a72c3c3bf | 207 | |
AshuJoshi | 0:3ec6a7645098 | 208 | } |
AshuJoshi | 0:3ec6a7645098 | 209 | } |
AshuJoshi | 0:3ec6a7645098 | 210 | |
AshuJoshi | 0:3ec6a7645098 | 211 | // Callback function to change LED state |
AshuJoshi | 0:3ec6a7645098 | 212 | void blink() { |
AshuJoshi | 0:3ec6a7645098 | 213 | led = !led; |
AshuJoshi | 4:97f9ad3f2566 | 214 | } |
AshuJoshi | 4:97f9ad3f2566 | 215 | |
AshuJoshi | 4:97f9ad3f2566 | 216 |