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
main.cpp@8:60007735feed, 2015-11-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |