Demo of DHT11->mDot->TTN

Dependencies:   DHT11 libmDot mbed-rtos mbed

Revision:
17:3dc30f4a8da2
Parent:
16:01a1058d9c8e
--- a/main.cpp	Wed Aug 17 19:23:32 2016 +0000
+++ b/main.cpp	Tue Nov 29 15:59:18 2016 +0000
@@ -35,9 +35,9 @@
  * Register your device and update these values:
  * https://account.thethingsnetwork.org/
  */
-uint8_t AppSKey[16]= { 0x50, 0x41, 0xE5, 0x57, 0xB6, 0x24, 0x7D, 0x4E, 0x6F, 0xF9, 0x9D, 0x0E, 0xDE, 0x13, 0xD6, 0xA2, };
-uint8_t NwkSKey[16]= { 0x3E, 0x1C, 0xA9, 0x8A, 0x4C, 0x0A, 0xA9, 0x91, 0x3A, 0xFD, 0xAE, 0x70, 0x66, 0x37, 0x51, 0x9D, };
-uint8_t NetworkAddr[4]= {0x26,0xFC,0x2A,0x9B};
+uint8_t AppSKey[16]= { 0x11, 0x6F, 0xA9, 0x2A, 0x46, 0xDE, 0xE6, 0x1D, 0x11, 0xE3, 0x71, 0x37, 0x24, 0xBC, 0x44, 0x1A };
+uint8_t NwkSKey[16]= { 0xF1, 0xA4, 0x78, 0x09, 0x75, 0xE2, 0x3C, 0x2B, 0x76, 0x8F, 0x9F, 0x8D, 0xE0, 0x5E, 0xAA, 0x64 };
+uint8_t NetworkAddr[4]= { 0x68, 0x8E, 0x64, 0xE5 };
 
 
 // Some defines for the LoRa configuration
@@ -61,20 +61,162 @@
 }
 
 
-// packet payload format
-#pragma pack(push, 1) // exact fit - no padding
-struct sigmap_packet_t {
-  uint16_t seq;
-  uint8_t pwr;    /* tx power in dbm, +128 offset */
-  uint16_t temp;  /* temperature, in hundreths of a degree C, +32768 offset  */
-  uint16_t humid; /* relative humidity, in hundreths of a percent, +32768 offset */
-  void hton() {
-    hton16(&seq);
-    hton16(&temp);
-    hton16(&humid);
-  }
-};
-#pragma pack(pop) // back to whatever the previous packing mode was 
+
+// build a transmit buffer (from https://raw.githubusercontent.com/mcci-catena/Catena4410-Sketches/master/catena4410_sensor1/catena4410_sensor1.ino)
+class TxBuffer_t
+        {
+public:
+        uint8_t buf[32];   // this sets the largest buffer size
+        uint8_t *p;
+
+        TxBuffer_t() : p(buf) {};
+        void begin()
+                {
+                p = buf;
+                }
+        void put(uint8_t c)
+                {
+                if (p < buf + sizeof(buf))
+                        *p++ = c;
+                }
+        void put1u(int32_t v)
+                {
+                if (v > 0xFF)
+                        v = 0xFF;
+                else if (v < 0)
+                        v = 0;
+                put((uint8_t) v);
+                }
+        void put2(uint32_t v)
+                {
+                if (v > 0xFFFF)
+                        v = 0xFFFF;
+
+                put((uint8_t) (v >> 8));
+                put((uint8_t) v);
+                }
+        void put2(int32_t v)
+                {
+                if (v < -0x8000)
+                        v = -0x8000;
+                else if (v > 0x7FFF)
+                        v = 0x7FFF;
+
+                put2((uint32_t) v);
+                }
+        void put3(uint32_t v)
+                {
+                if (v > 0xFFFFFF)
+                        v = 0xFFFFFF;
+
+                put((uint8_t) (v >> 16));
+                put((uint8_t) (v >> 8));
+                put((uint8_t) v);
+                }
+        void put2u(int32_t v)
+                {
+                if (v < 0)
+                        v = 0;
+                else if (v > 0xFFFF)
+                        v = 0xFFFF;
+                put2((uint32_t) v);
+                }
+        void put3(int32_t v)
+                {
+                if (v < -0x800000)
+                        v = -0x800000;
+                else if (v > 0x7FFFFF)
+                        v = 0x7FFFFF;
+                put3((uint32_t) v);
+                }
+        uint8_t *getp(void)
+                {
+                return p;
+                }
+        size_t getn(void)
+                {
+                return p - buf;
+                }
+        uint8_t *getbase(void)
+                {
+                return buf;
+                }
+        void put2sf(float v)
+                {
+                int32_t iv;
+
+                if (v > 32766.5f)
+                        iv = 0x7fff;
+                else if (v < -32767.5f)
+                        iv = -0x8000;
+                else
+                        iv = (int32_t)(v + 0.5f);
+
+                put2(iv);
+                }
+        void put2uf(float v)
+                {
+                uint32_t iv;
+
+                if (v > 65535.5f)
+                        iv = 0xffff;
+                else if (v < 0.5f)
+                        iv = 0;
+                else
+                        iv = (uint32_t)(v + 0.5f);
+
+                put2(iv);
+                }
+        void put1uf(float v)
+                {
+                uint8_t c;
+
+                if (v > 254.5)
+                        c = 0xFF;
+                else if (v < 0.5)
+                        c = 0;
+                else
+                        c = (uint8_t) v;
+
+                put(c);
+                }
+        void putT(float T)
+                {
+                put2sf(T * 256.0f + 0.5f);                
+                }
+        void putRH(float RH)
+                {
+                put1uf((RH / 0.390625f) + 0.5f);
+                }
+        void putV(float V)
+                {
+                put2sf(V * 4096.0f + 0.5f);
+                }
+        void putP(float P)
+                {
+                put2uf(P / 4.0f + 0.5f);
+                }
+        void putLux(float Lux)
+                {
+                put2uf(Lux);
+                }
+        };
+
+/* the magic byte at the front of the buffer */
+enum    {
+        FormatSensor1 = 0x11,
+        };
+
+/* the flags for the second byte of the buffer */
+enum    {
+        FlagVbat = 1 << 0,
+        FlagVcc = 1 << 1,
+        FlagTPH = 1 << 2,
+        FlagLux = 1 << 3,
+        FlagWater = 1 << 4,
+        FlagSoilTH = 1 << 5,
+        };
+
 
 // Temperature sensor object
 #define DHT_PIN PB_1
@@ -85,7 +227,7 @@
 
 int main()
 {
-    sigmap_packet_t pkt;
+    TxBuffer_t b;
     
     int32_t ret;
     mDot* dot;
@@ -285,22 +427,52 @@
         };
         
         /* build packet */
-        pkt.seq = seq;
-        pkt.pwr = LORA_TXPOWER + 128;
-        pkt.temp = temp*100 + 32768;
-        pkt.humid = humid*100 + 32768;
+        b.begin();
+        uint8_t flag = 0;
+        b.put(FormatSensor1);
+        uint8_t * const pFlag = b.getp(); // save pointer to flag location
+        b.put(0x00); // placeholder for flags
+        
+        // TODO: read battery voltage 
+        b.putV(13.8);
+        flag |= FlagVbat;
+        
+        // TODO: read from Bme280 sensor:
+        b.putT(27.0); // air temp
+        b.putP(1010.0); // air pressure
+        b.putRH(66.0); // air humidity
+        flag |= FlagTPH;
+        
+        // TODO: read from light sensor
+        b.putLux(1234); // ambient light
+        flag |= FlagLux;
+        
+        // TODO: read water temperature
+        b.putT(22.0); // water temperature
+        flag |= FlagWater;
+        
+        // TODO: read soil sensor
+        b.putT(25.2); // soil temperature
+        b.putRH(82.0); // soil humidity
+        flag |= FlagSoilTH;
+        
+        // write flag byte
+        *pFlag = flag;
         
         /* load vector */
-        pkt.hton();        
-        send_data.clear();        
-        for( int i=0; i< sizeof(pkt); i++ )
-            send_data.push_back( ((uint8_t*)&pkt)[i] );
+        send_data.clear();
+        uint8_t c;
+        int n = b.getn();
+        for( int i=0; i< n; i++ ) {
+            c = b.buf[i];
+            send_data.push_back( c );
+        }
 
         /* send packet */
         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());
+            logInfo("data len: %d,  send data: %s", n, Text::bin2hexString(send_data).c_str());
         }
 
         /* sleep */