Demonstration TTN OTAA node
Dependencies: BME280 DS1820 libmDot mbed-rtos mbed
This is an example application for the MultiTech mDot and connects to The Things Network using Over The Air Activation (OTAA). It sends data from a Dallas Semiconductors DS18B20 OneWire temperature sensor.
Register a device and generate a random AppKey for the currently used application Id: (You need to use your own device IDs, the ones shown here are examples only)
./ttnctl devices register 0080000000000000 INFO Generating random AppKey... INFO Registered device AppKey=000102030405060708090A0B0C0D0E0F DevEUI=0080000000000000
or to specify the same AppKey for a new device or to reregister the same device again:
./ttnctl devices register 0080000000000000 000102030405060708090A0B0C0D0E0F
./ttnctl devices info 0080000000000000 Dynamic device:
AppEUI: 70B3D50000000000 {0x70, 0xB3, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x00}
DevEUI: 0080000000000000 {0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
AppKey: 000102030405060708090A0B0C0D0E0F {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}
Copy the AppEUI and AppKey values provided in hex array notation above to the AppEUI and AppKey parameters below.
Diff: main.cpp
- Revision:
- 2:9db840d12557
- Parent:
- 1:45cec6aea002
- Child:
- 3:367aa95f9771
diff -r 45cec6aea002 -r 9db840d12557 main.cpp --- a/main.cpp Thu Sep 03 23:36:45 2015 +0000 +++ b/main.cpp Mon Sep 21 18:45:15 2015 +0000 @@ -1,5 +1,5 @@ -/** mDot_display - Uses 160x128 SPI LCD display to show results of message - * sending and receiving. +/** mDot_DS18B20 - Simple mDot temperature sensor using Dallas Semiconductors DS18B20 OneWire temperature sensor. + * * Uses MultiTech mDot developer board http://www.multitech.com/models/94558010LF * Requires a MultiTech MultiConnect Conduit http://www.multitech.com/models/94557203LF * @@ -7,7 +7,7 @@ { "chan": 5, "codr": "4/5", "datr": "SF9BW125", "freq": "869.5", "lsnr": "8.8", "modu": "LORA", "rfch": 1, "rssi": -41, "seqn": 13, "size": 12, "timestamp": "2015-07-22T21:19:11Z", "tmst": 517590990, - "payload": "{\"temperature\":21.3}", "eui": "00:80:00:00:00:00:9a:63", "_msg + "payload": "{\"tmp\":21.3}", "eui": "00:80:00:00:00:00:9a:63", "_msg id": "73bcd8dd.8c4328" } * */ @@ -30,20 +30,13 @@ // mDot/dev board activity LED //#define ACTIVITY_LED PA_0 -// D13 + +// DS18B20 OneWire pin +// D13 on Dev Board, pin x on mDot #define DATA_PIN PA_5 -// A0 +// A0 on Dev Board, pin x on mDot //#define DATA_PIN PB_1 -// must use the hardware SPI pins -//SPI device(SPI_MOSI, SPI_MISO, SPI_SCK); - -// SPI device defines -#define MDOT_MOSI PA_7 -#define MDOT_MISO PA_6 -#define MDOT_SCK PA_5 -#define MDOT_TFT_CS PA_4 - DS1820 probe(DATA_PIN); //void log_error(mDot* dot, const char* msg, int32_t retval); @@ -58,39 +51,11 @@ std::vector<uint8_t> send_data; std::vector<uint8_t> recv_data; -// int32_t next_tx; -// int32_t wait_time = 2; -// uint8_t iterations = 99; -// uint16_t txCount = 0; -// uint16_t txFailCount = 0; -// uint16_t rxCount = 0; -// uint16_t rxOkCount = 0; -// uint16_t noRxCount = 0; -// uint16_t rxFailCount = 0; -// bool initStatus = true; // All intialised OK until told otherwise float temperature = 0.0; pc.baud(115200); pc.printf("mDot LoRa Temperature sensor\n\r"); - /* wait_ms(5000); - for(int i=0; i<10; i++ ) - pc.printf("."); - pc.printf("\n\r"); - */ - /* - while( 1 ) { - // This takes upto 750mS, way too long. Change to 9 bit resolution if not already used. - probe.convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until ready - // printf("It is %3.1fC\r\n", probe.temperature()); - // Output data as JSON e.g. {"temperature":"21.3"} - temperature = probe.temperature(); - pc.printf("Temperature %3.1f\r\n", temperature ); - wait_ms(2000); - } - - #ifdef bollocks - */ // get a mDot handle dot = mDot::getInstance(); @@ -102,8 +67,11 @@ std::string configNetworkName = dot->getNetworkName(); // Check pin, if low then reset config. - - +// if ((ret = dot->setJoinMode( mDot::AUTO_OTA )) != mDot::MDOT_OK) { +// logError("failed to set join mode %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); +// } + + if( config_network_name.compare(configNetworkName) != 0 ) { // Not saved config, reset logInfo("Setting Config"); @@ -125,11 +93,16 @@ // dot->setActivityLedPin( ACTIVITY_LED ); // dot->setActivityLedEnable(false); - dot->setJoinRetries( 5 ); - dot->setTxDataRate( mDot::SF_9 ); + // Have a decent nubmer of retries in connecting to LoRaWAN + dot->setJoinRetries( 3 ); + + // Set Spreading Factor, higher is lower data rate, smaller packets but longer range + // Lower is higher data rate, larger packets and shorter range. +// dot->setTxDataRate( mDot::SF_9 ); + dot->setTxDataRate( mDot::SF_12 ); dot->setTxPower( 14 ); dot->setAck( 0 ); // 1 retries on Ack, 0 to disable - + // Not applicable for 868MHz in EU // if ((ret = dot->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) { // initStatus = false; @@ -146,6 +119,10 @@ logError("failed to set network password %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); } + if ((ret = dot->setJoinMode( mDot::AUTO_OTA )) != mDot::MDOT_OK) { + logError("failed to set join mode %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); + } + logInfo("Saving Config"); // Save config @@ -155,8 +132,6 @@ } else { logInfo("Using existing Config"); } -// wait_ms(2000); - // Display protocol/connection info while ((ret = dot->joinNetwork()) != mDot::MDOT_OK) { logError("failed to join network [%d][%s]", ret, mDot::getReturnCodeString(ret).c_str()); @@ -183,20 +158,17 @@ if ((ret = dot->send(send_data)) != mDot::MDOT_OK) { logError("failed to send: [%d][%s]", ret, mDot::getReturnCodeString(ret).c_str()); - } else { - logInfo("send data: %s", Text::bin2hexString(send_data).c_str()); - } // Should sleep here and wakeup after a set interval. - - uint32_t sleep_time = 60; //(dot->getNextTxMs() / 1000) + 10; - logInfo("going to sleep..."); + uint32_t sleep_time = (dot->getNextTxMs() / 1000) + 60; + logInfo("going to sleep for %d seconds", sleep_time); // go to sleep and wake up automatically sleep_time seconds later - dot->sleep(sleep_time, mDot::RTC_ALARM, false); + dot->sleep(sleep_time, mDot::RTC_ALARM); + /* next_tx = dot->getNextTxMs() + 1; logInfo("waiting %ld ms to transmit again", next_tx); @@ -205,12 +177,6 @@ wait(wait_time); */ } -//#endif + return 0; } -/* -void log_error(mDot* dot, const char* msg, int32_t retval) -{ - printf("%s - %ld:%s, %s\r\n", msg, retval, mDot::getReturnCodeString(retval).c_str(), dot->getLastError().c_str()); -} -*/ \ No newline at end of file