![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
A drain water sensor
Dependencies: libmDot mbed-rtos mbed
main.cpp@0:e2a51cd3f69c, 2016-05-10 (annotated)
- Committer:
- RFking
- Date:
- Tue May 10 11:00:26 2016 +0000
- Revision:
- 0:e2a51cd3f69c
It works
;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RFking | 0:e2a51cd3f69c | 1 | // This program measures drain water level |
RFking | 0:e2a51cd3f69c | 2 | |
RFking | 0:e2a51cd3f69c | 3 | #include "mbed.h" |
RFking | 0:e2a51cd3f69c | 4 | #include "mDot.h" |
RFking | 0:e2a51cd3f69c | 5 | //#include "WakeUp.h" |
RFking | 0:e2a51cd3f69c | 6 | |
RFking | 0:e2a51cd3f69c | 7 | mDot* dot; |
RFking | 0:e2a51cd3f69c | 8 | Ticker batteryvoltageMonitorTick; |
RFking | 0:e2a51cd3f69c | 9 | |
RFking | 0:e2a51cd3f69c | 10 | AnalogIn batt_voltage(PA_1); |
RFking | 0:e2a51cd3f69c | 11 | DigitalIn mt_pwron(PA_4); |
RFking | 0:e2a51cd3f69c | 12 | DigitalIn mt_caught(PA_5); |
RFking | 0:e2a51cd3f69c | 13 | DigitalOut transmitLED(LED1); |
RFking | 0:e2a51cd3f69c | 14 | |
RFking | 0:e2a51cd3f69c | 15 | DigitalOut range(PB_1); |
RFking | 0:e2a51cd3f69c | 16 | AnalogIn ain(PB_0); |
RFking | 0:e2a51cd3f69c | 17 | |
RFking | 0:e2a51cd3f69c | 18 | |
RFking | 0:e2a51cd3f69c | 19 | // Configuration variables |
RFking | 0:e2a51cd3f69c | 20 | static std::string config_network_name = "SIGMA_LoRa"; |
RFking | 0:e2a51cd3f69c | 21 | static std::string config_network_pass = "sigma2013"; |
RFking | 0:e2a51cd3f69c | 22 | static uint8_t config_frequency_sub_band = 1; |
RFking | 0:e2a51cd3f69c | 23 | |
RFking | 0:e2a51cd3f69c | 24 | //Global Variables |
RFking | 0:e2a51cd3f69c | 25 | static volatile bool timeToReadBatteryVoltage = true; |
RFking | 0:e2a51cd3f69c | 26 | static volatile bool dataChanged = true; |
RFking | 0:e2a51cd3f69c | 27 | |
RFking | 0:e2a51cd3f69c | 28 | //Function prototypes |
RFking | 0:e2a51cd3f69c | 29 | void batteryvoltageMonitorTock(); |
RFking | 0:e2a51cd3f69c | 30 | void printError(mDot* dot, int32_t returnCode); |
RFking | 0:e2a51cd3f69c | 31 | void printVersion(); |
RFking | 0:e2a51cd3f69c | 32 | bool setFrequencySubBand(uint8_t subBand); |
RFking | 0:e2a51cd3f69c | 33 | bool setNetworkName(const std::string name); |
RFking | 0:e2a51cd3f69c | 34 | bool setNetworkPassphrase(const std::string passphrase); |
RFking | 0:e2a51cd3f69c | 35 | bool setPower(uint8_t power); |
RFking | 0:e2a51cd3f69c | 36 | bool setAck(uint8_t retries); |
RFking | 0:e2a51cd3f69c | 37 | bool joinNetwork(); |
RFking | 0:e2a51cd3f69c | 38 | bool send(const std::string text); |
RFking | 0:e2a51cd3f69c | 39 | |
RFking | 0:e2a51cd3f69c | 40 | int main() |
RFking | 0:e2a51cd3f69c | 41 | { |
RFking | 0:e2a51cd3f69c | 42 | //The low-power oscillator can be quite inaccurate on some targets |
RFking | 0:e2a51cd3f69c | 43 | //this function calibrates it against the main clock |
RFking | 0:e2a51cd3f69c | 44 | //WakeUp::calibrate(); |
RFking | 0:e2a51cd3f69c | 45 | |
RFking | 0:e2a51cd3f69c | 46 | |
RFking | 0:e2a51cd3f69c | 47 | printf("\r\n\r\n"); |
RFking | 0:e2a51cd3f69c | 48 | printf("=====================================\r\n"); |
RFking | 0:e2a51cd3f69c | 49 | printf("Drain water sensor\r\n"); |
RFking | 0:e2a51cd3f69c | 50 | printf("=====================================\r\n"); |
RFking | 0:e2a51cd3f69c | 51 | printVersion(); |
RFking | 0:e2a51cd3f69c | 52 | |
RFking | 0:e2a51cd3f69c | 53 | // get the mDot handle |
RFking | 0:e2a51cd3f69c | 54 | dot = mDot::getInstance(); |
RFking | 0:e2a51cd3f69c | 55 | |
RFking | 0:e2a51cd3f69c | 56 | // reset to default config so we know what state we're in |
RFking | 0:e2a51cd3f69c | 57 | dot->resetNetworkSession(); |
RFking | 0:e2a51cd3f69c | 58 | dot->resetConfig(); |
RFking | 0:e2a51cd3f69c | 59 | if (dot->getPublicNetwork() == false) { |
RFking | 0:e2a51cd3f69c | 60 | dot->setPublicNetwork(true); |
RFking | 0:e2a51cd3f69c | 61 | printf("Public network = FLASE \r\n"); |
RFking | 0:e2a51cd3f69c | 62 | } |
RFking | 0:e2a51cd3f69c | 63 | |
RFking | 0:e2a51cd3f69c | 64 | // set up the mDot with our network information |
RFking | 0:e2a51cd3f69c | 65 | setNetworkName(config_network_name); |
RFking | 0:e2a51cd3f69c | 66 | setNetworkPassphrase(config_network_pass); |
RFking | 0:e2a51cd3f69c | 67 | setFrequencySubBand(config_frequency_sub_band); |
RFking | 0:e2a51cd3f69c | 68 | setPower(14); // Reduce latency for 868 units |
RFking | 0:e2a51cd3f69c | 69 | setAck(0); // Disable ack for less latency |
RFking | 0:e2a51cd3f69c | 70 | |
RFking | 0:e2a51cd3f69c | 71 | float adc, volts, cm; |
RFking | 0:e2a51cd3f69c | 72 | |
RFking | 0:e2a51cd3f69c | 73 | while (!joinNetwork()) { wait(2); dot->resetNetworkSession(); } |
RFking | 0:e2a51cd3f69c | 74 | |
RFking | 0:e2a51cd3f69c | 75 | |
RFking | 0:e2a51cd3f69c | 76 | |
RFking | 0:e2a51cd3f69c | 77 | while (1) { |
RFking | 0:e2a51cd3f69c | 78 | char latestData[100]; |
RFking | 0:e2a51cd3f69c | 79 | |
RFking | 0:e2a51cd3f69c | 80 | range=true; // turn sonic sensor on |
RFking | 0:e2a51cd3f69c | 81 | wait(0.02); // wait for it to turn on |
RFking | 0:e2a51cd3f69c | 82 | |
RFking | 0:e2a51cd3f69c | 83 | adc = ain.read(); // read sonic sensor as a float |
RFking | 0:e2a51cd3f69c | 84 | range=false; // tuen sonic sensor off |
RFking | 0:e2a51cd3f69c | 85 | |
RFking | 0:e2a51cd3f69c | 86 | volts = adc * 3.3466f; // convert to volts |
RFking | 0:e2a51cd3f69c | 87 | cm = volts / 0.00326f; // 3.3V/1024=V/cm |
RFking | 0:e2a51cd3f69c | 88 | |
RFking | 0:e2a51cd3f69c | 89 | |
RFking | 0:e2a51cd3f69c | 90 | |
RFking | 0:e2a51cd3f69c | 91 | // batteryvoltageMonitorTick.attach(&batteryvoltageMonitorTock, 0.15); |
RFking | 0:e2a51cd3f69c | 92 | // sprintf(latestData, "power on: %d, kill status: %d, battery voltage: %f", old_mt_pwron, old_mt_caught, (batt_voltage*3.3)); |
RFking | 0:e2a51cd3f69c | 93 | // printf("%s\r\n", latestData); |
RFking | 0:e2a51cd3f69c | 94 | |
RFking | 0:e2a51cd3f69c | 95 | printf("%8.4f adc %8.2fV %4.1f cm Battery: %8.1f V\r\n", adc, volts, cm, (batt_voltage*3.3)); |
RFking | 0:e2a51cd3f69c | 96 | sprintf(latestData, "Distance:%8.0f, Battery: %8.0f", cm,(batt_voltage*3.3)); |
RFking | 0:e2a51cd3f69c | 97 | send(latestData); |
RFking | 0:e2a51cd3f69c | 98 | |
RFking | 0:e2a51cd3f69c | 99 | |
RFking | 0:e2a51cd3f69c | 100 | wait(3); |
RFking | 0:e2a51cd3f69c | 101 | |
RFking | 0:e2a51cd3f69c | 102 | //Set wakeup time for 10 seconds |
RFking | 0:e2a51cd3f69c | 103 | //WakeUp::set_ms(1000); |
RFking | 0:e2a51cd3f69c | 104 | |
RFking | 0:e2a51cd3f69c | 105 | //Enter deepsleep, the program won't go beyond this point until it is woken up |
RFking | 0:e2a51cd3f69c | 106 | //deepsleep(); |
RFking | 0:e2a51cd3f69c | 107 | |
RFking | 0:e2a51cd3f69c | 108 | |
RFking | 0:e2a51cd3f69c | 109 | |
RFking | 0:e2a51cd3f69c | 110 | } |
RFking | 0:e2a51cd3f69c | 111 | |
RFking | 0:e2a51cd3f69c | 112 | } |
RFking | 0:e2a51cd3f69c | 113 | |
RFking | 0:e2a51cd3f69c | 114 | |
RFking | 0:e2a51cd3f69c | 115 | |
RFking | 0:e2a51cd3f69c | 116 | |
RFking | 0:e2a51cd3f69c | 117 | void printVersion() |
RFking | 0:e2a51cd3f69c | 118 | { |
RFking | 0:e2a51cd3f69c | 119 | printf("%s\r\n\r\n", dot->getId().c_str()); |
RFking | 0:e2a51cd3f69c | 120 | } |
RFking | 0:e2a51cd3f69c | 121 | |
RFking | 0:e2a51cd3f69c | 122 | bool setFrequencySubBand(uint8_t subBand) |
RFking | 0:e2a51cd3f69c | 123 | { |
RFking | 0:e2a51cd3f69c | 124 | int32_t returnCode; |
RFking | 0:e2a51cd3f69c | 125 | printf("Setting frequency sub band to '%d'...\r\n", subBand); |
RFking | 0:e2a51cd3f69c | 126 | if ((returnCode = dot->setFrequencySubBand(subBand)) != mDot::MDOT_OK) { |
RFking | 0:e2a51cd3f69c | 127 | printError(dot, returnCode); |
RFking | 0:e2a51cd3f69c | 128 | return false; |
RFking | 0:e2a51cd3f69c | 129 | } |
RFking | 0:e2a51cd3f69c | 130 | return true; |
RFking | 0:e2a51cd3f69c | 131 | } |
RFking | 0:e2a51cd3f69c | 132 | |
RFking | 0:e2a51cd3f69c | 133 | bool setNetworkName(const std::string name) |
RFking | 0:e2a51cd3f69c | 134 | { |
RFking | 0:e2a51cd3f69c | 135 | int32_t returnCode; |
RFking | 0:e2a51cd3f69c | 136 | printf("Setting network name to '%s'...\r\n", name.c_str()); |
RFking | 0:e2a51cd3f69c | 137 | if ((returnCode = dot->setNetworkName(name)) != mDot::MDOT_OK) |
RFking | 0:e2a51cd3f69c | 138 | { |
RFking | 0:e2a51cd3f69c | 139 | printError(dot, returnCode); |
RFking | 0:e2a51cd3f69c | 140 | return false; |
RFking | 0:e2a51cd3f69c | 141 | } |
RFking | 0:e2a51cd3f69c | 142 | return true; |
RFking | 0:e2a51cd3f69c | 143 | } |
RFking | 0:e2a51cd3f69c | 144 | |
RFking | 0:e2a51cd3f69c | 145 | bool setNetworkPassphrase(const std::string passphrase) |
RFking | 0:e2a51cd3f69c | 146 | { |
RFking | 0:e2a51cd3f69c | 147 | int32_t returnCode; |
RFking | 0:e2a51cd3f69c | 148 | printf("Setting passphrase to '%s'...\r\n", passphrase.c_str()); |
RFking | 0:e2a51cd3f69c | 149 | if ((returnCode = dot->setNetworkPassphrase(passphrase)) != mDot::MDOT_OK) |
RFking | 0:e2a51cd3f69c | 150 | { |
RFking | 0:e2a51cd3f69c | 151 | printError(dot, returnCode); |
RFking | 0:e2a51cd3f69c | 152 | return false; |
RFking | 0:e2a51cd3f69c | 153 | } |
RFking | 0:e2a51cd3f69c | 154 | return true; |
RFking | 0:e2a51cd3f69c | 155 | } |
RFking | 0:e2a51cd3f69c | 156 | |
RFking | 0:e2a51cd3f69c | 157 | bool setPower(uint8_t power) |
RFking | 0:e2a51cd3f69c | 158 | { |
RFking | 0:e2a51cd3f69c | 159 | int32_t returnCode; |
RFking | 0:e2a51cd3f69c | 160 | printf("Setting tx power to '%d'...\r\n", power); |
RFking | 0:e2a51cd3f69c | 161 | if ((returnCode = dot->setTxPower(power)) != mDot::MDOT_OK) { |
RFking | 0:e2a51cd3f69c | 162 | printError(dot, returnCode); |
RFking | 0:e2a51cd3f69c | 163 | return false; |
RFking | 0:e2a51cd3f69c | 164 | } |
RFking | 0:e2a51cd3f69c | 165 | return true; |
RFking | 0:e2a51cd3f69c | 166 | } |
RFking | 0:e2a51cd3f69c | 167 | |
RFking | 0:e2a51cd3f69c | 168 | |
RFking | 0:e2a51cd3f69c | 169 | bool joinNetwork() |
RFking | 0:e2a51cd3f69c | 170 | { |
RFking | 0:e2a51cd3f69c | 171 | int32_t returnCode; |
RFking | 0:e2a51cd3f69c | 172 | printf("\r\nJoining network...\r\n"); |
RFking | 0:e2a51cd3f69c | 173 | if ((returnCode = dot->joinNetworkOnce()) != mDot::MDOT_OK) { |
RFking | 0:e2a51cd3f69c | 174 | printError(dot, returnCode); |
RFking | 0:e2a51cd3f69c | 175 | return false; |
RFking | 0:e2a51cd3f69c | 176 | } |
RFking | 0:e2a51cd3f69c | 177 | printf("Network Joined!\r\n"); |
RFking | 0:e2a51cd3f69c | 178 | return true; |
RFking | 0:e2a51cd3f69c | 179 | } |
RFking | 0:e2a51cd3f69c | 180 | |
RFking | 0:e2a51cd3f69c | 181 | bool setAck(uint8_t retries) |
RFking | 0:e2a51cd3f69c | 182 | { |
RFking | 0:e2a51cd3f69c | 183 | int32_t returnCode; |
RFking | 0:e2a51cd3f69c | 184 | printf("Setting ack to '%d'...\r\n", retries); |
RFking | 0:e2a51cd3f69c | 185 | if ((returnCode = dot->setAck(retries)) != mDot::MDOT_OK) |
RFking | 0:e2a51cd3f69c | 186 | { |
RFking | 0:e2a51cd3f69c | 187 | printError(dot, returnCode); |
RFking | 0:e2a51cd3f69c | 188 | return false; |
RFking | 0:e2a51cd3f69c | 189 | } |
RFking | 0:e2a51cd3f69c | 190 | return true; |
RFking | 0:e2a51cd3f69c | 191 | } |
RFking | 0:e2a51cd3f69c | 192 | |
RFking | 0:e2a51cd3f69c | 193 | bool send(const std::string text) |
RFking | 0:e2a51cd3f69c | 194 | { |
RFking | 0:e2a51cd3f69c | 195 | int32_t returnCode; |
RFking | 0:e2a51cd3f69c | 196 | uint32_t timeTillSend = dot->getNextTxMs(); |
RFking | 0:e2a51cd3f69c | 197 | if (timeTillSend != 0) { |
RFking | 0:e2a51cd3f69c | 198 | printf("waiting %lu ms to send\r\n", timeTillSend); |
RFking | 0:e2a51cd3f69c | 199 | return false; |
RFking | 0:e2a51cd3f69c | 200 | } |
RFking | 0:e2a51cd3f69c | 201 | |
RFking | 0:e2a51cd3f69c | 202 | printf("Sending data... "); |
RFking | 0:e2a51cd3f69c | 203 | std::vector<uint8_t> data(text.begin(), text.end()); |
RFking | 0:e2a51cd3f69c | 204 | if ((returnCode = dot->send(data, 1)) != mDot::MDOT_OK) |
RFking | 0:e2a51cd3f69c | 205 | { |
RFking | 0:e2a51cd3f69c | 206 | printError(dot, returnCode); |
RFking | 0:e2a51cd3f69c | 207 | return false; |
RFking | 0:e2a51cd3f69c | 208 | } |
RFking | 0:e2a51cd3f69c | 209 | printf("Data sent!\r\n"); |
RFking | 0:e2a51cd3f69c | 210 | return true; |
RFking | 0:e2a51cd3f69c | 211 | } |
RFking | 0:e2a51cd3f69c | 212 | |
RFking | 0:e2a51cd3f69c | 213 | void printError(mDot* dot, int32_t returnCode) |
RFking | 0:e2a51cd3f69c | 214 | { |
RFking | 0:e2a51cd3f69c | 215 | std::string error = mDot::getReturnCodeString(returnCode) + " - " + dot->getLastError(); |
RFking | 0:e2a51cd3f69c | 216 | printf("%s\r\n", error.c_str()); |
RFking | 0:e2a51cd3f69c | 217 | } |
RFking | 0:e2a51cd3f69c | 218 |