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
main.cpp
- Committer:
- jlcolemanmbed
- Date:
- 2015-10-28
- Revision:
- 0:5fa2b08cb3e0
File content as of revision 0:5fa2b08cb3e0:
/********************************************************************************** * 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()); }