A drain water sensor

Dependencies:   libmDot mbed-rtos mbed

Committer:
RFking
Date:
Tue May 10 11:00:26 2016 +0000
Revision:
0:e2a51cd3f69c
It works
;

Who changed what in which revision?

UserRevisionLine numberNew 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