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:
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?

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 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