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