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
Revision 0:5fa2b08cb3e0, committed 2015-10-28
- Comitter:
- jlcolemanmbed
- Date:
- Wed Oct 28 23:53:58 2015 +0000
- Commit message:
- Initial Version Posted For Tim Mulrooney. Code needs to be cleaned up.; This is a preliminary release for development purposes only.
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PinDetect.lib Wed Oct 28 23:53:58 2015 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/AjK/code/PinDetect/#cb3afc45028b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmDot.lib Wed Oct 28 23:53:58 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/teams/MultiTech/code/libmDot/#0b4eb17d07ae
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Wed Oct 28 23:53:58 2015 +0000
@@ -0,0 +1,259 @@
+/**********************************************************************************
+ * This program monitors the power on state, kill state and battery voltage on
+ * Woodstream mouse trap using the Multitech mDot and UDK2 development system.
+ * The power on state is monitored on the PA_4(UDK2 Pin D10)and the kill state is
+ * monitored on the PA_5 (UDK2 Pin D13) Digital Input Pins. The battery voltage
+ * is monitored on the PB_1 (UDK2 Pin A0) Analog Input. The status of these pins
+ * are transferred from the mDot LoRa to the Conduit LoRa gateway. The status is
+ * also shown on the USB Debug Terminal Window.
+ *********************************************************************************/
+
+#include "mbed.h"
+#include "mDot.h"
+#include "MTSLog.h"
+#include <string>
+#include <vector>
+#include <algorithm>
+#include "PinDetect.h"
+
+mDot* dot;
+Ticker ledTick;
+Ticker batteryvoltageMonitorTick;
+Ticker periodicSendTick;
+
+AnalogIn batt_voltage(PB_1);
+DigitalIn mt_pwron(PA_4);
+DigitalIn mt_caught(PA_5);
+DigitalOut transmitLED(LED1);
+
+// Configuration variables
+static std::string config_network_name = "JFETENGINEERING";
+static std::string config_network_pass = "Deboraheng";
+static uint8_t config_frequency_sub_band = 7;
+
+
+//Global Variables
+//static uint16_t setPoint = 21; //21 C is standard room temp
+static volatile bool timeToReadBatteryVoltage = true;
+static volatile bool dataChanged = true;
+//static volatile bool thermostatActivated = false;
+//static uint16_t sentSetPoint;
+
+//Function prototypes
+void ledTock();
+void periodicSendTock();
+void batteryvoltageMonitorTock();
+//void up_button_callback();
+//void down_button_callback();
+void printError(mDot* dot, int32_t returnCode);
+void printVersion();
+bool setFrequencySubBand(uint8_t subBand);
+bool setNetworkName(const std::string name);
+bool setNetworkPassphrase(const std::string passphrase);
+bool setPower(uint8_t power);
+bool setAck(uint8_t retries);
+bool joinNetwork();
+bool send(const std::string text);
+
+
+int main()
+{
+ int32_t ret;
+ //Start LED startup sequence
+ ledTick.attach(&ledTock, 0.1);
+
+ printf("\r\n\r\n");
+ printf("=====================================\r\n");
+ printf("WoodStream LoRa Mousetrap Demo \r\n");
+ printf("=====================================\r\n");
+ printVersion();
+
+ // get the mDot handle
+ dot = mDot::getInstance();
+
+ dot->setLogLevel(mts::MTSLog::INFO_LEVEL);
+
+ // reset to default config so we know what state we're in
+ dot->resetNetworkSession();
+ dot->resetConfig();
+
+ // set up the mDot with our network information
+ setNetworkName(config_network_name);
+ setNetworkPassphrase(config_network_pass);
+ setFrequencySubBand(config_frequency_sub_band);
+ setPower(20); // Reduce latency for 868 units
+ setAck(0); // Disable ack for less latency
+
+logInfo("Setting TX Spreading factor");
+if ((ret = dot->setTxDataRate(mDot::SF_8)) != mDot::MDOT_OK) {
+ logError("Failed To Set Tx Datarate %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
+}
+
+ while (!joinNetwork()) { wait(2); dot->resetNetworkSession(); }
+
+ // Stop LED startup sequence & configure them for operation
+ ledTick.detach();
+ transmitLED = 1;
+// buttonPressLED = 1;
+
+ // Configure timers
+ periodicSendTick.attach(&periodicSendTock, 5*60);
+ batteryvoltageMonitorTick.attach(&batteryvoltageMonitorTock, 0.15);
+
+ // Setup Interrupt callback function
+// up_button.attach_deasserted(&up_button_callback);
+// down_button.attach_deasserted(&down_button_callback);
+
+ // Start sampling buttons using interrupts
+// up_button.setSampleFrequency();
+// down_button.setSampleFrequency();
+
+int old_mt_pwron = -1;
+int old_mt_caught = -1;
+
+while (1) {
+ if (timeToReadBatteryVoltage)
+
+ if (mt_pwron != old_mt_pwron) {
+ old_mt_pwron = mt_pwron;
+ dataChanged = true;
+ if (mt_caught != old_mt_caught) {
+ old_mt_caught = mt_caught;
+ dataChanged = true;
+ }
+ // printf("\n\r mt_pwron: %d, mt_caught: %d, batt_voltage: %f", old_mt_pwron, old_mt_caught, (batt_voltage*3.3));
+
+ timeToReadBatteryVoltage = false;
+}
+
+ if (dataChanged) {
+ char latestData[100];
+ transmitLED = 1;
+ //sprintf(latestData, "temp: %d,set: %d", temperature, sentSetPoint);
+ sprintf(latestData, "power on: %d, kill status: %d, battery voltage: %f", old_mt_pwron, old_mt_caught, (batt_voltage*3.3));
+ printf("%s\r\n", latestData);
+
+ if (send(latestData)) {
+ dataChanged = false;
+ }
+ transmitLED = 0;
+ }
+ }
+}
+
+
+void ledTock() {
+ transmitLED = !transmitLED;
+}
+
+void periodicSendTock() {
+ dataChanged = true;
+}
+
+void batteryvoltageMonitorTock() {
+ timeToReadBatteryVoltage = true;
+
+// if (sentSetPoint != setPoint) {
+ dataChanged = true;
+ }
+
+void printVersion()
+{
+ printf("%s\r\n\r\n", dot->getId().c_str());
+}
+
+bool setFrequencySubBand(uint8_t subBand)
+{
+ int32_t returnCode;
+ printf("Setting frequency sub band to '%d'...\r\n", subBand);
+ if ((returnCode = dot->setFrequencySubBand(subBand)) != mDot::MDOT_OK) {
+ printError(dot, returnCode);
+ return false;
+ }
+ return true;
+}
+
+bool setNetworkName(const std::string name)
+{
+ int32_t returnCode;
+ printf("Setting network name to '%s'...\r\n", name.c_str());
+ if ((returnCode = dot->setNetworkName(name)) != mDot::MDOT_OK)
+ {
+ printError(dot, returnCode);
+ return false;
+ }
+ return true;
+}
+
+bool setNetworkPassphrase(const std::string passphrase)
+{
+ int32_t returnCode;
+ printf("Setting passphrase to '%s'...\r\n", passphrase.c_str());
+ if ((returnCode = dot->setNetworkPassphrase(passphrase)) != mDot::MDOT_OK)
+ {
+ printError(dot, returnCode);
+ return false;
+ }
+ return true;
+}
+
+bool setPower(uint8_t power)
+{
+ int32_t returnCode;
+ printf("Setting tx power to '%d'...\r\n", power);
+ if ((returnCode = dot->setTxPower(power)) != mDot::MDOT_OK) {
+ printError(dot, returnCode);
+ return false;
+ }
+ return true;
+}
+
+bool joinNetwork()
+{
+ int32_t returnCode;
+ printf("\r\nJoining network...\r\n");
+ if ((returnCode = dot->joinNetworkOnce()) != mDot::MDOT_OK) {
+ printError(dot, returnCode);
+ return false;
+ }
+ printf("Network Joined!\r\n");
+ return true;
+}
+
+bool setAck(uint8_t retries)
+{
+ int32_t returnCode;
+ printf("Setting ack to '%d'...\r\n", retries);
+ if ((returnCode = dot->setAck(retries)) != mDot::MDOT_OK)
+ {
+ printError(dot, returnCode);
+ return false;
+ }
+ return true;
+}
+
+bool send(const std::string text)
+{
+ int32_t returnCode;
+ uint32_t timeTillSend = dot->getNextTxMs();
+ if (timeTillSend != 0) {
+ printf("waiting %lu ms to send\r\n", timeTillSend);
+ return false;
+ }
+
+ printf("Sending data... ");
+ std::vector<uint8_t> data(text.begin(), text.end());
+ if ((returnCode = dot->send(data, 1)) != mDot::MDOT_OK)
+ {
+ printError(dot, returnCode);
+ return false;
+ }
+ printf("Data sent!\r\n");
+ return true;
+}
+
+void printError(mDot* dot, int32_t returnCode)
+{
+ std::string error = mDot::getReturnCodeString(returnCode) + " - " + dot->getLastError();
+ printf("%s\r\n", error.c_str());
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-rtos.lib Wed Oct 28 23:53:58 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-rtos/#12552ef4e980
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-src.lib Wed Oct 28 23:53:58 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-src/#30f9462b5296