mDot LoRa example program that transfers analog battery voltage and two digital input status signals to the Conduit LoRa gateway.

Dependencies:   PinDetect libmDot mbed-rtos mbed-src

Committer:
jlcolemanmbed
Date:
Wed Oct 28 23:53:58 2015 +0000
Revision:
0:5fa2b08cb3e0
Initial Version Posted For Tim Mulrooney.  Code needs to be cleaned up.; This is a preliminary release for development purposes only.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jlcolemanmbed 0:5fa2b08cb3e0 1 /**********************************************************************************
jlcolemanmbed 0:5fa2b08cb3e0 2 * This program monitors the power on state, kill state and battery voltage on
jlcolemanmbed 0:5fa2b08cb3e0 3 * Woodstream mouse trap using the Multitech mDot and UDK2 development system.
jlcolemanmbed 0:5fa2b08cb3e0 4 * The power on state is monitored on the PA_4(UDK2 Pin D10)and the kill state is
jlcolemanmbed 0:5fa2b08cb3e0 5 * monitored on the PA_5 (UDK2 Pin D13) Digital Input Pins. The battery voltage
jlcolemanmbed 0:5fa2b08cb3e0 6 * is monitored on the PB_1 (UDK2 Pin A0) Analog Input. The status of these pins
jlcolemanmbed 0:5fa2b08cb3e0 7 * are transferred from the mDot LoRa to the Conduit LoRa gateway. The status is
jlcolemanmbed 0:5fa2b08cb3e0 8 * also shown on the USB Debug Terminal Window.
jlcolemanmbed 0:5fa2b08cb3e0 9 *********************************************************************************/
jlcolemanmbed 0:5fa2b08cb3e0 10
jlcolemanmbed 0:5fa2b08cb3e0 11 #include "mbed.h"
jlcolemanmbed 0:5fa2b08cb3e0 12 #include "mDot.h"
jlcolemanmbed 0:5fa2b08cb3e0 13 #include "MTSLog.h"
jlcolemanmbed 0:5fa2b08cb3e0 14 #include <string>
jlcolemanmbed 0:5fa2b08cb3e0 15 #include <vector>
jlcolemanmbed 0:5fa2b08cb3e0 16 #include <algorithm>
jlcolemanmbed 0:5fa2b08cb3e0 17 #include "PinDetect.h"
jlcolemanmbed 0:5fa2b08cb3e0 18
jlcolemanmbed 0:5fa2b08cb3e0 19 mDot* dot;
jlcolemanmbed 0:5fa2b08cb3e0 20 Ticker ledTick;
jlcolemanmbed 0:5fa2b08cb3e0 21 Ticker batteryvoltageMonitorTick;
jlcolemanmbed 0:5fa2b08cb3e0 22 Ticker periodicSendTick;
jlcolemanmbed 0:5fa2b08cb3e0 23
jlcolemanmbed 0:5fa2b08cb3e0 24 AnalogIn batt_voltage(PB_1);
jlcolemanmbed 0:5fa2b08cb3e0 25 DigitalIn mt_pwron(PA_4);
jlcolemanmbed 0:5fa2b08cb3e0 26 DigitalIn mt_caught(PA_5);
jlcolemanmbed 0:5fa2b08cb3e0 27 DigitalOut transmitLED(LED1);
jlcolemanmbed 0:5fa2b08cb3e0 28
jlcolemanmbed 0:5fa2b08cb3e0 29 // Configuration variables
jlcolemanmbed 0:5fa2b08cb3e0 30 static std::string config_network_name = "JFETENGINEERING";
jlcolemanmbed 0:5fa2b08cb3e0 31 static std::string config_network_pass = "Deboraheng";
jlcolemanmbed 0:5fa2b08cb3e0 32 static uint8_t config_frequency_sub_band = 7;
jlcolemanmbed 0:5fa2b08cb3e0 33
jlcolemanmbed 0:5fa2b08cb3e0 34
jlcolemanmbed 0:5fa2b08cb3e0 35 //Global Variables
jlcolemanmbed 0:5fa2b08cb3e0 36 //static uint16_t setPoint = 21; //21 C is standard room temp
jlcolemanmbed 0:5fa2b08cb3e0 37 static volatile bool timeToReadBatteryVoltage = true;
jlcolemanmbed 0:5fa2b08cb3e0 38 static volatile bool dataChanged = true;
jlcolemanmbed 0:5fa2b08cb3e0 39 //static volatile bool thermostatActivated = false;
jlcolemanmbed 0:5fa2b08cb3e0 40 //static uint16_t sentSetPoint;
jlcolemanmbed 0:5fa2b08cb3e0 41
jlcolemanmbed 0:5fa2b08cb3e0 42 //Function prototypes
jlcolemanmbed 0:5fa2b08cb3e0 43 void ledTock();
jlcolemanmbed 0:5fa2b08cb3e0 44 void periodicSendTock();
jlcolemanmbed 0:5fa2b08cb3e0 45 void batteryvoltageMonitorTock();
jlcolemanmbed 0:5fa2b08cb3e0 46 //void up_button_callback();
jlcolemanmbed 0:5fa2b08cb3e0 47 //void down_button_callback();
jlcolemanmbed 0:5fa2b08cb3e0 48 void printError(mDot* dot, int32_t returnCode);
jlcolemanmbed 0:5fa2b08cb3e0 49 void printVersion();
jlcolemanmbed 0:5fa2b08cb3e0 50 bool setFrequencySubBand(uint8_t subBand);
jlcolemanmbed 0:5fa2b08cb3e0 51 bool setNetworkName(const std::string name);
jlcolemanmbed 0:5fa2b08cb3e0 52 bool setNetworkPassphrase(const std::string passphrase);
jlcolemanmbed 0:5fa2b08cb3e0 53 bool setPower(uint8_t power);
jlcolemanmbed 0:5fa2b08cb3e0 54 bool setAck(uint8_t retries);
jlcolemanmbed 0:5fa2b08cb3e0 55 bool joinNetwork();
jlcolemanmbed 0:5fa2b08cb3e0 56 bool send(const std::string text);
jlcolemanmbed 0:5fa2b08cb3e0 57
jlcolemanmbed 0:5fa2b08cb3e0 58
jlcolemanmbed 0:5fa2b08cb3e0 59 int main()
jlcolemanmbed 0:5fa2b08cb3e0 60 {
jlcolemanmbed 0:5fa2b08cb3e0 61 int32_t ret;
jlcolemanmbed 0:5fa2b08cb3e0 62 //Start LED startup sequence
jlcolemanmbed 0:5fa2b08cb3e0 63 ledTick.attach(&ledTock, 0.1);
jlcolemanmbed 0:5fa2b08cb3e0 64
jlcolemanmbed 0:5fa2b08cb3e0 65 printf("\r\n\r\n");
jlcolemanmbed 0:5fa2b08cb3e0 66 printf("=====================================\r\n");
jlcolemanmbed 0:5fa2b08cb3e0 67 printf("WoodStream LoRa Mousetrap Demo \r\n");
jlcolemanmbed 0:5fa2b08cb3e0 68 printf("=====================================\r\n");
jlcolemanmbed 0:5fa2b08cb3e0 69 printVersion();
jlcolemanmbed 0:5fa2b08cb3e0 70
jlcolemanmbed 0:5fa2b08cb3e0 71 // get the mDot handle
jlcolemanmbed 0:5fa2b08cb3e0 72 dot = mDot::getInstance();
jlcolemanmbed 0:5fa2b08cb3e0 73
jlcolemanmbed 0:5fa2b08cb3e0 74 dot->setLogLevel(mts::MTSLog::INFO_LEVEL);
jlcolemanmbed 0:5fa2b08cb3e0 75
jlcolemanmbed 0:5fa2b08cb3e0 76 // reset to default config so we know what state we're in
jlcolemanmbed 0:5fa2b08cb3e0 77 dot->resetNetworkSession();
jlcolemanmbed 0:5fa2b08cb3e0 78 dot->resetConfig();
jlcolemanmbed 0:5fa2b08cb3e0 79
jlcolemanmbed 0:5fa2b08cb3e0 80 // set up the mDot with our network information
jlcolemanmbed 0:5fa2b08cb3e0 81 setNetworkName(config_network_name);
jlcolemanmbed 0:5fa2b08cb3e0 82 setNetworkPassphrase(config_network_pass);
jlcolemanmbed 0:5fa2b08cb3e0 83 setFrequencySubBand(config_frequency_sub_band);
jlcolemanmbed 0:5fa2b08cb3e0 84 setPower(20); // Reduce latency for 868 units
jlcolemanmbed 0:5fa2b08cb3e0 85 setAck(0); // Disable ack for less latency
jlcolemanmbed 0:5fa2b08cb3e0 86
jlcolemanmbed 0:5fa2b08cb3e0 87 logInfo("Setting TX Spreading factor");
jlcolemanmbed 0:5fa2b08cb3e0 88 if ((ret = dot->setTxDataRate(mDot::SF_8)) != mDot::MDOT_OK) {
jlcolemanmbed 0:5fa2b08cb3e0 89 logError("Failed To Set Tx Datarate %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
jlcolemanmbed 0:5fa2b08cb3e0 90 }
jlcolemanmbed 0:5fa2b08cb3e0 91
jlcolemanmbed 0:5fa2b08cb3e0 92 while (!joinNetwork()) { wait(2); dot->resetNetworkSession(); }
jlcolemanmbed 0:5fa2b08cb3e0 93
jlcolemanmbed 0:5fa2b08cb3e0 94 // Stop LED startup sequence & configure them for operation
jlcolemanmbed 0:5fa2b08cb3e0 95 ledTick.detach();
jlcolemanmbed 0:5fa2b08cb3e0 96 transmitLED = 1;
jlcolemanmbed 0:5fa2b08cb3e0 97 // buttonPressLED = 1;
jlcolemanmbed 0:5fa2b08cb3e0 98
jlcolemanmbed 0:5fa2b08cb3e0 99 // Configure timers
jlcolemanmbed 0:5fa2b08cb3e0 100 periodicSendTick.attach(&periodicSendTock, 5*60);
jlcolemanmbed 0:5fa2b08cb3e0 101 batteryvoltageMonitorTick.attach(&batteryvoltageMonitorTock, 0.15);
jlcolemanmbed 0:5fa2b08cb3e0 102
jlcolemanmbed 0:5fa2b08cb3e0 103 // Setup Interrupt callback function
jlcolemanmbed 0:5fa2b08cb3e0 104 // up_button.attach_deasserted(&up_button_callback);
jlcolemanmbed 0:5fa2b08cb3e0 105 // down_button.attach_deasserted(&down_button_callback);
jlcolemanmbed 0:5fa2b08cb3e0 106
jlcolemanmbed 0:5fa2b08cb3e0 107 // Start sampling buttons using interrupts
jlcolemanmbed 0:5fa2b08cb3e0 108 // up_button.setSampleFrequency();
jlcolemanmbed 0:5fa2b08cb3e0 109 // down_button.setSampleFrequency();
jlcolemanmbed 0:5fa2b08cb3e0 110
jlcolemanmbed 0:5fa2b08cb3e0 111 int old_mt_pwron = -1;
jlcolemanmbed 0:5fa2b08cb3e0 112 int old_mt_caught = -1;
jlcolemanmbed 0:5fa2b08cb3e0 113
jlcolemanmbed 0:5fa2b08cb3e0 114 while (1) {
jlcolemanmbed 0:5fa2b08cb3e0 115 if (timeToReadBatteryVoltage)
jlcolemanmbed 0:5fa2b08cb3e0 116
jlcolemanmbed 0:5fa2b08cb3e0 117 if (mt_pwron != old_mt_pwron) {
jlcolemanmbed 0:5fa2b08cb3e0 118 old_mt_pwron = mt_pwron;
jlcolemanmbed 0:5fa2b08cb3e0 119 dataChanged = true;
jlcolemanmbed 0:5fa2b08cb3e0 120 if (mt_caught != old_mt_caught) {
jlcolemanmbed 0:5fa2b08cb3e0 121 old_mt_caught = mt_caught;
jlcolemanmbed 0:5fa2b08cb3e0 122 dataChanged = true;
jlcolemanmbed 0:5fa2b08cb3e0 123 }
jlcolemanmbed 0:5fa2b08cb3e0 124 // printf("\n\r mt_pwron: %d, mt_caught: %d, batt_voltage: %f", old_mt_pwron, old_mt_caught, (batt_voltage*3.3));
jlcolemanmbed 0:5fa2b08cb3e0 125
jlcolemanmbed 0:5fa2b08cb3e0 126 timeToReadBatteryVoltage = false;
jlcolemanmbed 0:5fa2b08cb3e0 127 }
jlcolemanmbed 0:5fa2b08cb3e0 128
jlcolemanmbed 0:5fa2b08cb3e0 129 if (dataChanged) {
jlcolemanmbed 0:5fa2b08cb3e0 130 char latestData[100];
jlcolemanmbed 0:5fa2b08cb3e0 131 transmitLED = 1;
jlcolemanmbed 0:5fa2b08cb3e0 132 //sprintf(latestData, "temp: %d,set: %d", temperature, sentSetPoint);
jlcolemanmbed 0:5fa2b08cb3e0 133 sprintf(latestData, "power on: %d, kill status: %d, battery voltage: %f", old_mt_pwron, old_mt_caught, (batt_voltage*3.3));
jlcolemanmbed 0:5fa2b08cb3e0 134 printf("%s\r\n", latestData);
jlcolemanmbed 0:5fa2b08cb3e0 135
jlcolemanmbed 0:5fa2b08cb3e0 136 if (send(latestData)) {
jlcolemanmbed 0:5fa2b08cb3e0 137 dataChanged = false;
jlcolemanmbed 0:5fa2b08cb3e0 138 }
jlcolemanmbed 0:5fa2b08cb3e0 139 transmitLED = 0;
jlcolemanmbed 0:5fa2b08cb3e0 140 }
jlcolemanmbed 0:5fa2b08cb3e0 141 }
jlcolemanmbed 0:5fa2b08cb3e0 142 }
jlcolemanmbed 0:5fa2b08cb3e0 143
jlcolemanmbed 0:5fa2b08cb3e0 144
jlcolemanmbed 0:5fa2b08cb3e0 145 void ledTock() {
jlcolemanmbed 0:5fa2b08cb3e0 146 transmitLED = !transmitLED;
jlcolemanmbed 0:5fa2b08cb3e0 147 }
jlcolemanmbed 0:5fa2b08cb3e0 148
jlcolemanmbed 0:5fa2b08cb3e0 149 void periodicSendTock() {
jlcolemanmbed 0:5fa2b08cb3e0 150 dataChanged = true;
jlcolemanmbed 0:5fa2b08cb3e0 151 }
jlcolemanmbed 0:5fa2b08cb3e0 152
jlcolemanmbed 0:5fa2b08cb3e0 153 void batteryvoltageMonitorTock() {
jlcolemanmbed 0:5fa2b08cb3e0 154 timeToReadBatteryVoltage = true;
jlcolemanmbed 0:5fa2b08cb3e0 155
jlcolemanmbed 0:5fa2b08cb3e0 156 // if (sentSetPoint != setPoint) {
jlcolemanmbed 0:5fa2b08cb3e0 157 dataChanged = true;
jlcolemanmbed 0:5fa2b08cb3e0 158 }
jlcolemanmbed 0:5fa2b08cb3e0 159
jlcolemanmbed 0:5fa2b08cb3e0 160 void printVersion()
jlcolemanmbed 0:5fa2b08cb3e0 161 {
jlcolemanmbed 0:5fa2b08cb3e0 162 printf("%s\r\n\r\n", dot->getId().c_str());
jlcolemanmbed 0:5fa2b08cb3e0 163 }
jlcolemanmbed 0:5fa2b08cb3e0 164
jlcolemanmbed 0:5fa2b08cb3e0 165 bool setFrequencySubBand(uint8_t subBand)
jlcolemanmbed 0:5fa2b08cb3e0 166 {
jlcolemanmbed 0:5fa2b08cb3e0 167 int32_t returnCode;
jlcolemanmbed 0:5fa2b08cb3e0 168 printf("Setting frequency sub band to '%d'...\r\n", subBand);
jlcolemanmbed 0:5fa2b08cb3e0 169 if ((returnCode = dot->setFrequencySubBand(subBand)) != mDot::MDOT_OK) {
jlcolemanmbed 0:5fa2b08cb3e0 170 printError(dot, returnCode);
jlcolemanmbed 0:5fa2b08cb3e0 171 return false;
jlcolemanmbed 0:5fa2b08cb3e0 172 }
jlcolemanmbed 0:5fa2b08cb3e0 173 return true;
jlcolemanmbed 0:5fa2b08cb3e0 174 }
jlcolemanmbed 0:5fa2b08cb3e0 175
jlcolemanmbed 0:5fa2b08cb3e0 176 bool setNetworkName(const std::string name)
jlcolemanmbed 0:5fa2b08cb3e0 177 {
jlcolemanmbed 0:5fa2b08cb3e0 178 int32_t returnCode;
jlcolemanmbed 0:5fa2b08cb3e0 179 printf("Setting network name to '%s'...\r\n", name.c_str());
jlcolemanmbed 0:5fa2b08cb3e0 180 if ((returnCode = dot->setNetworkName(name)) != mDot::MDOT_OK)
jlcolemanmbed 0:5fa2b08cb3e0 181 {
jlcolemanmbed 0:5fa2b08cb3e0 182 printError(dot, returnCode);
jlcolemanmbed 0:5fa2b08cb3e0 183 return false;
jlcolemanmbed 0:5fa2b08cb3e0 184 }
jlcolemanmbed 0:5fa2b08cb3e0 185 return true;
jlcolemanmbed 0:5fa2b08cb3e0 186 }
jlcolemanmbed 0:5fa2b08cb3e0 187
jlcolemanmbed 0:5fa2b08cb3e0 188 bool setNetworkPassphrase(const std::string passphrase)
jlcolemanmbed 0:5fa2b08cb3e0 189 {
jlcolemanmbed 0:5fa2b08cb3e0 190 int32_t returnCode;
jlcolemanmbed 0:5fa2b08cb3e0 191 printf("Setting passphrase to '%s'...\r\n", passphrase.c_str());
jlcolemanmbed 0:5fa2b08cb3e0 192 if ((returnCode = dot->setNetworkPassphrase(passphrase)) != mDot::MDOT_OK)
jlcolemanmbed 0:5fa2b08cb3e0 193 {
jlcolemanmbed 0:5fa2b08cb3e0 194 printError(dot, returnCode);
jlcolemanmbed 0:5fa2b08cb3e0 195 return false;
jlcolemanmbed 0:5fa2b08cb3e0 196 }
jlcolemanmbed 0:5fa2b08cb3e0 197 return true;
jlcolemanmbed 0:5fa2b08cb3e0 198 }
jlcolemanmbed 0:5fa2b08cb3e0 199
jlcolemanmbed 0:5fa2b08cb3e0 200 bool setPower(uint8_t power)
jlcolemanmbed 0:5fa2b08cb3e0 201 {
jlcolemanmbed 0:5fa2b08cb3e0 202 int32_t returnCode;
jlcolemanmbed 0:5fa2b08cb3e0 203 printf("Setting tx power to '%d'...\r\n", power);
jlcolemanmbed 0:5fa2b08cb3e0 204 if ((returnCode = dot->setTxPower(power)) != mDot::MDOT_OK) {
jlcolemanmbed 0:5fa2b08cb3e0 205 printError(dot, returnCode);
jlcolemanmbed 0:5fa2b08cb3e0 206 return false;
jlcolemanmbed 0:5fa2b08cb3e0 207 }
jlcolemanmbed 0:5fa2b08cb3e0 208 return true;
jlcolemanmbed 0:5fa2b08cb3e0 209 }
jlcolemanmbed 0:5fa2b08cb3e0 210
jlcolemanmbed 0:5fa2b08cb3e0 211 bool joinNetwork()
jlcolemanmbed 0:5fa2b08cb3e0 212 {
jlcolemanmbed 0:5fa2b08cb3e0 213 int32_t returnCode;
jlcolemanmbed 0:5fa2b08cb3e0 214 printf("\r\nJoining network...\r\n");
jlcolemanmbed 0:5fa2b08cb3e0 215 if ((returnCode = dot->joinNetworkOnce()) != mDot::MDOT_OK) {
jlcolemanmbed 0:5fa2b08cb3e0 216 printError(dot, returnCode);
jlcolemanmbed 0:5fa2b08cb3e0 217 return false;
jlcolemanmbed 0:5fa2b08cb3e0 218 }
jlcolemanmbed 0:5fa2b08cb3e0 219 printf("Network Joined!\r\n");
jlcolemanmbed 0:5fa2b08cb3e0 220 return true;
jlcolemanmbed 0:5fa2b08cb3e0 221 }
jlcolemanmbed 0:5fa2b08cb3e0 222
jlcolemanmbed 0:5fa2b08cb3e0 223 bool setAck(uint8_t retries)
jlcolemanmbed 0:5fa2b08cb3e0 224 {
jlcolemanmbed 0:5fa2b08cb3e0 225 int32_t returnCode;
jlcolemanmbed 0:5fa2b08cb3e0 226 printf("Setting ack to '%d'...\r\n", retries);
jlcolemanmbed 0:5fa2b08cb3e0 227 if ((returnCode = dot->setAck(retries)) != mDot::MDOT_OK)
jlcolemanmbed 0:5fa2b08cb3e0 228 {
jlcolemanmbed 0:5fa2b08cb3e0 229 printError(dot, returnCode);
jlcolemanmbed 0:5fa2b08cb3e0 230 return false;
jlcolemanmbed 0:5fa2b08cb3e0 231 }
jlcolemanmbed 0:5fa2b08cb3e0 232 return true;
jlcolemanmbed 0:5fa2b08cb3e0 233 }
jlcolemanmbed 0:5fa2b08cb3e0 234
jlcolemanmbed 0:5fa2b08cb3e0 235 bool send(const std::string text)
jlcolemanmbed 0:5fa2b08cb3e0 236 {
jlcolemanmbed 0:5fa2b08cb3e0 237 int32_t returnCode;
jlcolemanmbed 0:5fa2b08cb3e0 238 uint32_t timeTillSend = dot->getNextTxMs();
jlcolemanmbed 0:5fa2b08cb3e0 239 if (timeTillSend != 0) {
jlcolemanmbed 0:5fa2b08cb3e0 240 printf("waiting %lu ms to send\r\n", timeTillSend);
jlcolemanmbed 0:5fa2b08cb3e0 241 return false;
jlcolemanmbed 0:5fa2b08cb3e0 242 }
jlcolemanmbed 0:5fa2b08cb3e0 243
jlcolemanmbed 0:5fa2b08cb3e0 244 printf("Sending data... ");
jlcolemanmbed 0:5fa2b08cb3e0 245 std::vector<uint8_t> data(text.begin(), text.end());
jlcolemanmbed 0:5fa2b08cb3e0 246 if ((returnCode = dot->send(data, 1)) != mDot::MDOT_OK)
jlcolemanmbed 0:5fa2b08cb3e0 247 {
jlcolemanmbed 0:5fa2b08cb3e0 248 printError(dot, returnCode);
jlcolemanmbed 0:5fa2b08cb3e0 249 return false;
jlcolemanmbed 0:5fa2b08cb3e0 250 }
jlcolemanmbed 0:5fa2b08cb3e0 251 printf("Data sent!\r\n");
jlcolemanmbed 0:5fa2b08cb3e0 252 return true;
jlcolemanmbed 0:5fa2b08cb3e0 253 }
jlcolemanmbed 0:5fa2b08cb3e0 254
jlcolemanmbed 0:5fa2b08cb3e0 255 void printError(mDot* dot, int32_t returnCode)
jlcolemanmbed 0:5fa2b08cb3e0 256 {
jlcolemanmbed 0:5fa2b08cb3e0 257 std::string error = mDot::getReturnCodeString(returnCode) + " - " + dot->getLastError();
jlcolemanmbed 0:5fa2b08cb3e0 258 printf("%s\r\n", error.c_str());
jlcolemanmbed 0:5fa2b08cb3e0 259 }