Demo of DHT11->mDot->TTN
Dependencies: DHT22 DS18B20_1wire SHTx TSL2561_I2C libmDot mbed-rtos mbed
Fork of mDot_TTN_DHT11 by
Diff: main.cpp
- Revision:
- 17:3dc30f4a8da2
- Parent:
- 16:01a1058d9c8e
- Child:
- 18:5b57c3cb4554
diff -r 01a1058d9c8e -r 3dc30f4a8da2 main.cpp --- 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 */