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.

Revision:
8:8070e9d660e4
Parent:
7:2a704d1a30e1
Child:
9:086351e54b57
diff -r 2a704d1a30e1 -r 8070e9d660e4 main.cpp
--- a/main.cpp	Wed Oct 28 11:06:03 2015 +0000
+++ b/main.cpp	Tue Nov 10 21:46:38 2015 +0000
@@ -22,20 +22,22 @@
 #define MIN(a,b) (((a)<(b))?(a):(b))
 #define MAX(a,b) (((a)>(b))?(a):(b))
 
-// these options must match the settings on your Conduit in
-// /var/config/lora/lora-network-server.conf
-//static std::string config_network_name = "ThingInnovations";
-//static std::string config_network_pass = "donkey123";
-//
+// Values as used by The Things Network
 //const uint8_t AppKey[16]={0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C};
 // Application session key
 uint8_t AppSKey[16]= {0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C};
 // Network session key
 uint8_t NwkSKey[16]= {0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C};
-// Dev addr
-//uint8_t NodeAddr[4]= {0x23,0x05,0x19,0x67};
+
 // Network Address
-uint8_t NetworkAddr[4]= {0x23,0x05,0x19,0x67};
+//uint8_t NetworkAddr[4]= {0x02,0x01,0x2A,0x00};      // Dev board
+uint8_t NetworkAddr[4]= {0x02,0x01,0x2A,0x01};      // Temperature sensor/OxFloodNet sensor
+
+
+// Some defines for the LoRa configuration
+#define LORA_SF mDot::SF_12
+#define LORA_ACK 0
+#define LORA_TXPOWER 14
 
 // Ignoring sub band for EU modules.
 //static uint8_t config_frequency_sub_band = 1;
@@ -44,7 +46,7 @@
 //#define ACTIVITY_LED PA_0
 
 // DS18B20 OneWire pin
-// D13 on Dev Board, pin 18 on mDot
+// D13 on Dev Board, pin 18 on mDot, Compatible with Oxford Flood Network PCB temperature sensor.
 #define DATA_PIN     PA_5
 // A0 on Dev Board, pin 20 on mDot
 //#define DATA_PIN     PB_1
@@ -114,8 +116,8 @@
 //    }
 
     // Set byte order - AEP less than 1.0.30
-//    dot->setJoinByteOrder(mDot::MSB);
-    dot->setJoinByteOrder(mDot::LSB);
+//    dot->setJoinByteOrder(mDot::LSB);
+    dot->setJoinByteOrder(mDot::MSB);       // This is default for > 1.0.30 Conduit
 
 //    dot->setCrc(true);
 
@@ -133,13 +135,12 @@
     // Set Spreading Factor, higher is lower data rate, smaller packets but longer range
     // Lower is higher data rate, larger packets and shorter range.
     logInfo("Set SF");
-//    if((ret = dot->setTxDataRate( mDot::SF_9 )) != mDot::MDOT_OK) {
-    if((ret = dot->setTxDataRate( mDot::SF_12 )) != mDot::MDOT_OK) {
+    if((ret = dot->setTxDataRate( LORA_SF )) != mDot::MDOT_OK) {
         logError("Failed to set SF %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
     }
 
     logInfo("Set TxPower");
-    if((ret = dot->setTxPower( 14 )) != mDot::MDOT_OK) {
+    if((ret = dot->setTxPower( LORA_TXPOWER )) != mDot::MDOT_OK) {
         logError("Failed to set Tx Power %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
     }
 
@@ -155,7 +156,7 @@
 
     logInfo("Set Ack");
     // 1 retries on Ack, 0 to disable
-    if((ret = dot->setAck( 0 )) != mDot::MDOT_OK) {
+    if((ret = dot->setAck( LORA_ACK)) != mDot::MDOT_OK) {
         logError("Failed to set Ack %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
     }
 
@@ -270,14 +271,13 @@
             logInfo("send data: %s", Text::bin2hexString(send_data).c_str());
         }
 
-        // Should  sleep here and wakeup after a set interval.
-        uint32_t sleep_time = MAX((dot->getNextTxMs() / 1000), 60);
+        // Should  sleep here and wakeup after a set 10 minute interval.
+        uint32_t sleep_time = MAX((dot->getNextTxMs() / 1000), 600);
         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);
-
-        wait_ms(sleep_time * 1000);
+        dot->sleep(sleep_time, mDot::RTC_ALARM);
+//        wait_ms(sleep_time * 1000);
     }
 
     return 0;