Demo of a weather station sending temperature and humidity values over LORA to TTN.

Dependencies:   DHT libmDot mbed-rtos mbed

Fork of mDot_LoRa_example_TTN_connect by bruno rovagnati

Committer:
nicoschtein
Date:
Thu Nov 19 22:55:44 2015 +0000
Revision:
8:60007735feed
Parent:
7:609e7bb06486
Temperature and Humidity sent to TTN !

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mfiore 0:09250cd371d2 1 #include "mbed.h"
mfiore 0:09250cd371d2 2 #include "mDot.h"
mfiore 4:36e214ebfa56 3 #include "MTSLog.h"
mfiore 0:09250cd371d2 4 #include <string>
mfiore 0:09250cd371d2 5 #include <vector>
mfiore 4:36e214ebfa56 6 #include <algorithm>
nicoschtein 8:60007735feed 7 #include "DHT.h"
nicoschtein 8:60007735feed 8
mfiore 2:6e2c378339d9 9 // these options must match the settings on your Conduit
ropu 7:609e7bb06486 10 // TTN Keys
ropu 6:8f7276e7d206 11 static const uint8_t netowork_session_key_array[] = {0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C};
ropu 6:8f7276e7d206 12 static const uint8_t data_session_key_array[] = {0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C};
ropu 7:609e7bb06486 13 // uncomment the following lines and edit their values to match your configuration
nicoschtein 8:60007735feed 14 static const uint8_t network_address_array[] = {0x02, 0x01, 0xBA, 0x16}; // use yours based on http://thethingsnetwork.org/wiki/AddressSpace
ropu 6:8f7276e7d206 15 static std::vector<uint8_t> netowork_session_key (netowork_session_key_array, netowork_session_key_array + sizeof(netowork_session_key_array) / sizeof(uint8_t));
ropu 6:8f7276e7d206 16 static std::vector<uint8_t> data_session_key (data_session_key_array, data_session_key_array + sizeof(data_session_key_array) / sizeof(uint8_t));
ropu 6:8f7276e7d206 17 static std::vector<uint8_t> network_address (network_address_array, network_address_array + sizeof(network_address_array) / sizeof(uint8_t));
ropu 6:8f7276e7d206 18 static uint8_t config_frequency_sub_band = 4;
mfiore 0:09250cd371d2 19
nicoschtein 8:60007735feed 20
mfiore 0:09250cd371d2 21 int main() {
mfiore 0:09250cd371d2 22 int32_t ret;
mfiore 0:09250cd371d2 23 mDot* dot;
mfiore 0:09250cd371d2 24 std::vector<uint8_t> data;
nicoschtein 8:60007735feed 25 DHT sensor(PA_11,DHT11); // Use the DHT11 sensor connected to Vcc GND and on pin D7 UKD2
nicoschtein 8:60007735feed 26 std::string data_str = "Hello Nico!";
nicoschtein 8:60007735feed 27
nicoschtein 8:60007735feed 28
mfiore 0:09250cd371d2 29 // get a mDot handle
mfiore 0:09250cd371d2 30 dot = mDot::getInstance();
ropu 6:8f7276e7d206 31
ropu 6:8f7276e7d206 32 dot->resetConfig();
mfiore 0:09250cd371d2 33
nicoschtein 8:60007735feed 34 dot->setLogLevel(mts::MTSLog::DEBUG_LEVEL);
ropu 7:609e7bb06486 35
ropu 7:609e7bb06486 36 // too lazzy to check all errors
ropu 6:8f7276e7d206 37 dot->setJoinMode(mDot::MANUAL);
ropu 6:8f7276e7d206 38 dot->setPublicNetwork(true);
ropu 6:8f7276e7d206 39 dot->setFrequencySubBand(config_frequency_sub_band);
ropu 6:8f7276e7d206 40 dot->setNetworkSessionKey(netowork_session_key);
ropu 6:8f7276e7d206 41 dot->setDataSessionKey(data_session_key);
ropu 6:8f7276e7d206 42 dot->setNetworkAddress(network_address);
mfiore 4:36e214ebfa56 43
mfiore 4:36e214ebfa56 44
mfiore 4:36e214ebfa56 45 // a higher spreading factor allows for longer range but lower throughput
mfiore 4:36e214ebfa56 46 // in the 915 (US) frequency band, spreading factors 7 - 10 are available
mfiore 4:36e214ebfa56 47 // in the 868 (EU) frequency band, spreading factors 7 - 12 are available
mfiore 4:36e214ebfa56 48 logInfo("setting TX spreading factor");
mfiore 4:36e214ebfa56 49 if ((ret = dot->setTxDataRate(mDot::SF_10)) != mDot::MDOT_OK) {
mfiore 4:36e214ebfa56 50 logError("failed to set TX datarate %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 4:36e214ebfa56 51 }
mfiore 4:36e214ebfa56 52
ropu 6:8f7276e7d206 53
ropu 6:8f7276e7d206 54
nicoschtein 8:60007735feed 55 // request not to receive confirmation of packets from the gateway since TTN doesn't support it
mfiore 4:36e214ebfa56 56 logInfo("enabling ACKs");
ropu 6:8f7276e7d206 57 if ((ret = dot->setAck(0)) != mDot::MDOT_OK) {
mfiore 4:36e214ebfa56 58 logError("failed to enable ACKs %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 4:36e214ebfa56 59 }
mfiore 4:36e214ebfa56 60
mfiore 4:36e214ebfa56 61 // save this configuration to the mDot's NVM
mfiore 2:6e2c378339d9 62 logInfo("saving config");
mfiore 2:6e2c378339d9 63 if (! dot->saveConfig()) {
mfiore 2:6e2c378339d9 64 logError("failed to save configuration");
mfiore 0:09250cd371d2 65 }
mfiore 2:6e2c378339d9 66 //*******************************************
mfiore 2:6e2c378339d9 67 // end of configuration
mfiore 2:6e2c378339d9 68 //*******************************************
mfiore 0:09250cd371d2 69
mfiore 0:09250cd371d2 70 // attempt to join the network
mfiore 2:6e2c378339d9 71 logInfo("joining network");
mfiore 0:09250cd371d2 72 while ((ret = dot->joinNetwork()) != mDot::MDOT_OK) {
mfiore 2:6e2c378339d9 73 logError("failed to join network %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 4:36e214ebfa56 74 // in the 868 (EU) frequency band, we need to wait until another channel is available before transmitting again
mfiore 4:36e214ebfa56 75 osDelay(std::max((uint32_t)1000, (uint32_t)dot->getNextTxMs()));
mfiore 0:09250cd371d2 76 }
mfiore 0:09250cd371d2 77
nicoschtein 8:60007735feed 78 int sensor_error = 0;
nicoschtein 8:60007735feed 79 float temp = 0;
nicoschtein 8:60007735feed 80 float humid = 0;
nicoschtein 8:60007735feed 81 int update_period = 5000;
nicoschtein 8:60007735feed 82 std::string separator_str = ",";
nicoschtein 8:60007735feed 83 char string_buffer[64];
mfiore 0:09250cd371d2 84
mfiore 0:09250cd371d2 85 while (true) {
nicoschtein 8:60007735feed 86 data.clear();
nicoschtein 8:60007735feed 87
nicoschtein 8:60007735feed 88 sensor_error = sensor.readData();
nicoschtein 8:60007735feed 89 if (sensor_error !=0)
nicoschtein 8:60007735feed 90 printf("\r\nErr %i \n",sensor_error);
nicoschtein 8:60007735feed 91 while ( sensor_error != 0 ) {
nicoschtein 8:60007735feed 92 sensor_error = sensor.readData();
nicoschtein 8:60007735feed 93 osDelay(100);
nicoschtein 8:60007735feed 94 }
nicoschtein 8:60007735feed 95 // TEMP
nicoschtein 8:60007735feed 96 temp = sensor.ReadTemperature(CELCIUS);
nicoschtein 8:60007735feed 97 sprintf(string_buffer, "%4.2f", temp);
nicoschtein 8:60007735feed 98 for (int i = 0; i<strlen(string_buffer); i++)
nicoschtein 8:60007735feed 99 {
nicoschtein 8:60007735feed 100 data.push_back(((char*)string_buffer)[i]);
nicoschtein 8:60007735feed 101 }
nicoschtein 8:60007735feed 102 // SEPARATOR
nicoschtein 8:60007735feed 103 data.push_back((uint8_t) *separator_str.begin());
nicoschtein 8:60007735feed 104 // HUMIDITY
nicoschtein 8:60007735feed 105 humid = sensor.ReadHumidity();
nicoschtein 8:60007735feed 106 sprintf(string_buffer, "%4.2f", humid);
nicoschtein 8:60007735feed 107 for (int i = 0; i<strlen(string_buffer); i++)
nicoschtein 8:60007735feed 108 {
nicoschtein 8:60007735feed 109 data.push_back(((char*)string_buffer)[i]);
mfiore 0:09250cd371d2 110 }
mfiore 0:09250cd371d2 111
nicoschtein 8:60007735feed 112 logInfo("Temperature is %4.2f C",temp);
nicoschtein 8:60007735feed 113 logInfo("Temperature is %4.2f F",sensor.ReadTemperature(FARENHEIT));
nicoschtein 8:60007735feed 114 logInfo("Temperature is %4.2f K",sensor.ReadTemperature(KELVIN));
nicoschtein 8:60007735feed 115 logInfo("Humidity is %4.2f",humid);
nicoschtein 8:60007735feed 116 logInfo("Dew point is %4.2f",sensor.CalcdewPoint(sensor.ReadTemperature(CELCIUS), sensor.ReadHumidity()));
nicoschtein 8:60007735feed 117 logInfo("Dew point (fast) is %4.2f",sensor.CalcdewPointFast(sensor.ReadTemperature(CELCIUS), sensor.ReadHumidity()));
nicoschtein 8:60007735feed 118
nicoschtein 8:60007735feed 119 logDebug("Sending LoRa message, length: %d", data.size());
nicoschtein 8:60007735feed 120 logDebug("sending data: ");
nicoschtein 8:60007735feed 121 for(int i = 0; i < data.size(); i++)
nicoschtein 8:60007735feed 122 {
nicoschtein 8:60007735feed 123 printf("%c", data[i]);
nicoschtein 8:60007735feed 124 }
nicoschtein 8:60007735feed 125 printf("\n");
nicoschtein 8:60007735feed 126 if ((ret = dot->send(data)) != mDot::MDOT_OK)
nicoschtein 8:60007735feed 127 {
nicoschtein 8:60007735feed 128 logError("failed to send", ret, mDot::getReturnCodeString(ret).c_str());
nicoschtein 8:60007735feed 129 } else
nicoschtein 8:60007735feed 130 {
nicoschtein 8:60007735feed 131 logInfo("successfully sent data to gateway");
nicoschtein 8:60007735feed 132 data.clear();
nicoschtein 8:60007735feed 133 if ((ret = dot->recv(data)) != mDot::MDOT_OK) {
nicoschtein 8:60007735feed 134 logError("failed to rec", ret, mDot::getReturnCodeString(ret).c_str());
nicoschtein 8:60007735feed 135 } else {
nicoschtein 8:60007735feed 136 logDebug("successfully recd data from gateway");
nicoschtein 8:60007735feed 137 logDebug("recv data size: %i\n",data.size());
nicoschtein 8:60007735feed 138 logDebug("recv data: ");
nicoschtein 8:60007735feed 139 for(int i = 0;i < data.size();i++) {
nicoschtein 8:60007735feed 140 printf("%c", data[i]);
nicoschtein 8:60007735feed 141 }
nicoschtein 8:60007735feed 142 printf("\n");
nicoschtein 8:60007735feed 143 }
nicoschtein 8:60007735feed 144 }
nicoschtein 8:60007735feed 145 osDelay(std::max((uint32_t)update_period, (uint32_t)dot->getNextTxMs()));
mfiore 0:09250cd371d2 146 }
mfiore 0:09250cd371d2 147
mfiore 0:09250cd371d2 148 return 0;
mfiore 0:09250cd371d2 149 }