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

Committer:
AshuJoshi
Date:
Mon Jul 04 22:42:27 2016 +0000
Revision:
3:5c2bcba214b5
Parent:
2:866a72c3c3bf
Child:
4:97f9ad3f2566
Added support to print mDot Config

Who changed what in which revision?

UserRevisionLine numberNew 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 0:3ec6a7645098 15
AshuJoshi 2:866a72c3c3bf 16 using namespace mts;
AshuJoshi 2:866a72c3c3bf 17
AshuJoshi 2:866a72c3c3bf 18 #define MIN(a,b) (((a)<(b))?(a):(b))
AshuJoshi 2:866a72c3c3bf 19 #define MAX(a,b) (((a)>(b))?(a):(b))
AshuJoshi 2:866a72c3c3bf 20
AshuJoshi 1:36e336869699 21 // mDot UDK Specific
AshuJoshi 1:36e336869699 22 // MDot Pinout: https://developer.mbed.org/platforms/MTS-mDot-F411/#pinout-diagram
AshuJoshi 0:3ec6a7645098 23 // Uncomment this line if using a full sized UDK2.0 instead of a Micro UDK
AshuJoshi 1:36e336869699 24
AshuJoshi 0:3ec6a7645098 25 #define UDK2 1
AshuJoshi 0:3ec6a7645098 26 #ifdef UDK2
AshuJoshi 0:3ec6a7645098 27 DigitalOut led(LED1);
AshuJoshi 0:3ec6a7645098 28 #else
AshuJoshi 0:3ec6a7645098 29 DigitalOut led(XBEE_RSSI);
AshuJoshi 0:3ec6a7645098 30 #endif
AshuJoshi 0:3ec6a7645098 31
AshuJoshi 1:36e336869699 32 //BME280 sensor(I2C_SDA, I2C_SCL)
AshuJoshi 1:36e336869699 33 // MDot UDK - I2C_SDA and I2C_SCL connected to PC_9/PA_*
AshuJoshi 1:36e336869699 34 BME280 b280(PC_9, PA_8);
AshuJoshi 1:36e336869699 35
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 2:866a72c3c3bf 51
AshuJoshi 0:3ec6a7645098 52
AshuJoshi 0:3ec6a7645098 53
AshuJoshi 0:3ec6a7645098 54 /*****************************************************
AshuJoshi 0:3ec6a7645098 55 * MAIN
AshuJoshi 0:3ec6a7645098 56 *****************************************************/
AshuJoshi 0:3ec6a7645098 57 int main(){
AshuJoshi 0:3ec6a7645098 58
AshuJoshi 0:3ec6a7645098 59 // Simple Test Functions, "Hello World on UDK
AshuJoshi 0:3ec6a7645098 60 setUpLEDBlink();
AshuJoshi 2:866a72c3c3bf 61 mDotConfig();
AshuJoshi 3:5c2bcba214b5 62 mDotConfigPrint();
AshuJoshi 3:5c2bcba214b5 63 wait(15);
AshuJoshi 0:3ec6a7645098 64 endLessTestLoop();
AshuJoshi 0:3ec6a7645098 65
AshuJoshi 0:3ec6a7645098 66 return 0;
AshuJoshi 0:3ec6a7645098 67 }
AshuJoshi 0:3ec6a7645098 68
AshuJoshi 2:866a72c3c3bf 69 /*****************************************************
AshuJoshi 2:866a72c3c3bf 70 * mDot Functions
AshuJoshi 2:866a72c3c3bf 71 ****************************************************/
AshuJoshi 2:866a72c3c3bf 72
AshuJoshi 2:866a72c3c3bf 73
AshuJoshi 2:866a72c3c3bf 74 void mDotConfig() {
AshuJoshi 2:866a72c3c3bf 75 // get a mDot handle
AshuJoshi 2:866a72c3c3bf 76 dot = mDot::getInstance();
AshuJoshi 2:866a72c3c3bf 77 //dot->setLogLevel(mts::MTSLog::INFO_LEVEL);
AshuJoshi 2:866a72c3c3bf 78 dot->setLogLevel(mts::MTSLog::TRACE_LEVEL);
AshuJoshi 2:866a72c3c3bf 79 // print library version information
AshuJoshi 2:866a72c3c3bf 80 logInfo("version: %s", dot->getId().c_str());
AshuJoshi 2:866a72c3c3bf 81 }
AshuJoshi 2:866a72c3c3bf 82
AshuJoshi 2:866a72c3c3bf 83 void mDotGotoDeepSleep(int seconds) {
AshuJoshi 2:866a72c3c3bf 84 // logInfo("input to sleep routine %d", seconds);
AshuJoshi 2:866a72c3c3bf 85 // Should sleep here and wakeup after a set interval.
AshuJoshi 2:866a72c3c3bf 86 uint32_t sleep_time = MAX((dot->getNextTxMs() / 1000), seconds);
AshuJoshi 2:866a72c3c3bf 87 logInfo("going to sleep for %d seconds", sleep_time);
AshuJoshi 2:866a72c3c3bf 88 // go to sleep and wake up automatically sleep_time seconds later
AshuJoshi 2:866a72c3c3bf 89 dot->sleep(sleep_time, mDot::RTC_ALARM, false);
AshuJoshi 2:866a72c3c3bf 90
AshuJoshi 2:866a72c3c3bf 91 }
AshuJoshi 0:3ec6a7645098 92
AshuJoshi 3:5c2bcba214b5 93 void mDotConfigPrint() {
AshuJoshi 3:5c2bcba214b5 94
AshuJoshi 3:5c2bcba214b5 95 // Display what is set
AshuJoshi 3:5c2bcba214b5 96 printf("\r\n");
AshuJoshi 3:5c2bcba214b5 97 printf(" ********** mDot Configuration ************ \n");
AshuJoshi 3:5c2bcba214b5 98 std::vector<uint8_t> tmp = dot->getNetworkSessionKey();
AshuJoshi 3:5c2bcba214b5 99 printf("Network Session Key: ");
AshuJoshi 3:5c2bcba214b5 100 printf("%s\n", mts::Text::bin2hexString(tmp, " ").c_str());
AshuJoshi 3:5c2bcba214b5 101
AshuJoshi 3:5c2bcba214b5 102 tmp = dot->getDataSessionKey();
AshuJoshi 3:5c2bcba214b5 103 printf("Data Session Key: ");
AshuJoshi 3:5c2bcba214b5 104 printf("%s\n", mts::Text::bin2hexString(tmp, " ").c_str());
AshuJoshi 3:5c2bcba214b5 105
AshuJoshi 3:5c2bcba214b5 106 // App EUI
AshuJoshi 3:5c2bcba214b5 107 tmp = dot->getNetworkId();
AshuJoshi 3:5c2bcba214b5 108 printf("App EUI: ");
AshuJoshi 3:5c2bcba214b5 109 printf("%s\n", mts::Text::bin2hexString(tmp, " ").c_str());
AshuJoshi 3:5c2bcba214b5 110
AshuJoshi 3:5c2bcba214b5 111 // App Key
AshuJoshi 3:5c2bcba214b5 112 tmp = dot->getNetworkKey();
AshuJoshi 3:5c2bcba214b5 113 printf("App Key: ");
AshuJoshi 3:5c2bcba214b5 114 printf("%s\n", mts::Text::bin2hexString(tmp, " ").c_str());
AshuJoshi 3:5c2bcba214b5 115
AshuJoshi 3:5c2bcba214b5 116
AshuJoshi 3:5c2bcba214b5 117 printf("Device ID ");
AshuJoshi 3:5c2bcba214b5 118 std::vector<uint8_t> deviceId;
AshuJoshi 3:5c2bcba214b5 119 deviceId = dot->getDeviceId();
AshuJoshi 3:5c2bcba214b5 120 for (std::vector<uint8_t>::iterator it = deviceId.begin() ; it != deviceId.end(); ++it)
AshuJoshi 3:5c2bcba214b5 121 printf("%2.2x",*it );
AshuJoshi 3:5c2bcba214b5 122 printf("\n");
AshuJoshi 3:5c2bcba214b5 123
AshuJoshi 3:5c2bcba214b5 124 std::vector<uint8_t> netAddress;
AshuJoshi 3:5c2bcba214b5 125
AshuJoshi 3:5c2bcba214b5 126 printf("Network Address ");
AshuJoshi 3:5c2bcba214b5 127 netAddress = dot->getNetworkAddress();
AshuJoshi 3:5c2bcba214b5 128 for (std::vector<uint8_t>::iterator it = netAddress.begin() ; it != netAddress.end(); ++it)
AshuJoshi 3:5c2bcba214b5 129 printf("%2.2x",*it );
AshuJoshi 3:5c2bcba214b5 130
AshuJoshi 3:5c2bcba214b5 131 printf("\n");
AshuJoshi 3:5c2bcba214b5 132
AshuJoshi 3:5c2bcba214b5 133 // Display LoRa parameters
AshuJoshi 3:5c2bcba214b5 134 // Display label and values in different colours, show pretty values not numeric values where applicable
AshuJoshi 3:5c2bcba214b5 135 printf("Public Network: %s\n", (char*)(dot->getPublicNetwork() ? "Yes" : "No") );
AshuJoshi 3:5c2bcba214b5 136 printf("Frequency: %s\n", (char*)mDot::FrequencyBandStr(dot->getFrequencyBand()).c_str() );
AshuJoshi 3:5c2bcba214b5 137 printf("Sub Band: %s\n", (char*)mDot::FrequencySubBandStr(dot->getFrequencySubBand()).c_str() );
AshuJoshi 3:5c2bcba214b5 138 printf("Join Mode: %s\n", (char*)mDot::JoinModeStr(dot->getJoinMode()).c_str() );
AshuJoshi 3:5c2bcba214b5 139 printf("Join Retries: %d\n", dot->getJoinRetries() );
AshuJoshi 3:5c2bcba214b5 140 printf("Join Byte Order: %s\n", (char*)(dot->getJoinByteOrder() == 0 ? "LSB" : "MSB") );
AshuJoshi 3:5c2bcba214b5 141 printf("Link Check Count: %d\n", dot->getLinkCheckCount() );
AshuJoshi 3:5c2bcba214b5 142 printf("Link Check Thold: %d\n", dot->getLinkCheckThreshold() );
AshuJoshi 3:5c2bcba214b5 143 printf("Tx Data Rate: %s\n", (char*)mDot::DataRateStr(dot->getTxDataRate()).c_str() );
AshuJoshi 3:5c2bcba214b5 144 printf("Tx Power: %d\n", dot->getTxPower() );
AshuJoshi 3:5c2bcba214b5 145 printf("TxWait: %s, ", (dot->getTxWait() ? "Y" : "N" ));
AshuJoshi 3:5c2bcba214b5 146 printf("CRC: %s, ", (dot->getCrc() ? "Y" : "N") );
AshuJoshi 3:5c2bcba214b5 147 printf("Ack: %s\n", (dot->getAck() ? "Y" : "N") );
AshuJoshi 3:5c2bcba214b5 148
AshuJoshi 3:5c2bcba214b5 149
AshuJoshi 3:5c2bcba214b5 150
AshuJoshi 3:5c2bcba214b5 151 }
AshuJoshi 3:5c2bcba214b5 152
AshuJoshi 0:3ec6a7645098 153
AshuJoshi 0:3ec6a7645098 154
AshuJoshi 1:36e336869699 155 /*****************************************************
AshuJoshi 1:36e336869699 156 * Sensor Functions
AshuJoshi 1:36e336869699 157 ****************************************************/
AshuJoshi 0:3ec6a7645098 158
AshuJoshi 1:36e336869699 159 void readandprintBME280() {
AshuJoshi 2:866a72c3c3bf 160 float temperature;
AshuJoshi 2:866a72c3c3bf 161 float pressure;
AshuJoshi 2:866a72c3c3bf 162 float humidity;
AshuJoshi 2:866a72c3c3bf 163 char string_buffer[64];
AshuJoshi 2:866a72c3c3bf 164
AshuJoshi 2:866a72c3c3bf 165 // Temperature
AshuJoshi 2:866a72c3c3bf 166 temperature = b280.getTemperature();
AshuJoshi 2:866a72c3c3bf 167 sprintf(string_buffer, "%s%3.2f", "TC:", temperature);
AshuJoshi 2:866a72c3c3bf 168 logInfo("The temperature is %s", string_buffer);
AshuJoshi 2:866a72c3c3bf 169 // Pressure
AshuJoshi 2:866a72c3c3bf 170 pressure = b280.getPressure();
AshuJoshi 2:866a72c3c3bf 171 sprintf(string_buffer, "%s%04.2f", "hPa:", pressure);
AshuJoshi 2:866a72c3c3bf 172 logInfo("The pressure is %s", string_buffer);
AshuJoshi 2:866a72c3c3bf 173 // Humidity
AshuJoshi 2:866a72c3c3bf 174 humidity = b280.getHumidity();
AshuJoshi 2:866a72c3c3bf 175 sprintf(string_buffer, "%s%03.2f", "H%:", humidity);
AshuJoshi 2:866a72c3c3bf 176 logInfo("The humidty is %s", string_buffer);
AshuJoshi 2:866a72c3c3bf 177
AshuJoshi 2:866a72c3c3bf 178 // printf("%2.2f degC, %04.2f hPa, %2.2f %%\n", temperature, pressure, humidity);
AshuJoshi 1:36e336869699 179 }
AshuJoshi 0:3ec6a7645098 180
AshuJoshi 0:3ec6a7645098 181
AshuJoshi 0:3ec6a7645098 182
AshuJoshi 0:3ec6a7645098 183 /*****************************************************
AshuJoshi 1:36e336869699 184 * FUNCTIONS for Simple Testing
AshuJoshi 1:36e336869699 185 ****************************************************/
AshuJoshi 0:3ec6a7645098 186
AshuJoshi 0:3ec6a7645098 187 void setUpLEDBlink(){
AshuJoshi 0:3ec6a7645098 188 // configure the Ticker to blink the LED on 500ms interval
AshuJoshi 0:3ec6a7645098 189 tick.attach(&blink, 0.5);
AshuJoshi 0:3ec6a7645098 190 }
AshuJoshi 0:3ec6a7645098 191
AshuJoshi 0:3ec6a7645098 192 void endLessTestLoop() {
AshuJoshi 0:3ec6a7645098 193 while(true) {
AshuJoshi 1:36e336869699 194 // printf("Hello world!\r\n");
AshuJoshi 1:36e336869699 195 printf("BME280 Sensor: \n");
AshuJoshi 1:36e336869699 196 readandprintBME280();
AshuJoshi 2:866a72c3c3bf 197
AshuJoshi 2:866a72c3c3bf 198 mDotGotoDeepSleep(10);
AshuJoshi 2:866a72c3c3bf 199
AshuJoshi 0:3ec6a7645098 200 }
AshuJoshi 0:3ec6a7645098 201 }
AshuJoshi 0:3ec6a7645098 202
AshuJoshi 0:3ec6a7645098 203 // Callback function to change LED state
AshuJoshi 0:3ec6a7645098 204 void blink() {
AshuJoshi 0:3ec6a7645098 205 led = !led;
AshuJoshi 0:3ec6a7645098 206 }