soc-2
Dependencies: PinDetect libmDot mbed-rtos mbed
Fork of thermostat_fan_demo--sensor by
main.cpp@5:838b35b0a3c3, 2015-10-24 (annotated)
- Committer:
- socie123
- Date:
- Sat Oct 24 06:03:09 2015 +0000
- Revision:
- 5:838b35b0a3c3
- Parent:
- 3:d55b476ea5e6
soc-2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bbayer | 0:18a657d5431f | 1 | // --------------------------------------------- |
bbayer | 0:18a657d5431f | 2 | // MultiTech Thermostat & Fan Demo (Sensor unit) |
bbayer | 0:18a657d5431f | 3 | // |
bbayer | 0:18a657d5431f | 4 | // This program runs on a MultiTech mDot with: |
bbayer | 3:d55b476ea5e6 | 5 | // - 1 MultiTech UDK |
bbayer | 2:d12fedc86ea5 | 6 | // - 1 Arduino base shield |
bbayer | 0:18a657d5431f | 7 | // - 2 Grove COM08211P push buttons |
bbayer | 0:18a657d5431f | 8 | // - 1 Grove SEN23292P v1.2 temperature sensor |
bbayer | 0:18a657d5431f | 9 | // --------------------------------------------- |
bbayer | 0:18a657d5431f | 10 | |
bbayer | 0:18a657d5431f | 11 | #include "mbed.h" |
bbayer | 0:18a657d5431f | 12 | #include "mDot.h" |
bbayer | 0:18a657d5431f | 13 | #include "PinDetect.h" |
bbayer | 0:18a657d5431f | 14 | |
bbayer | 0:18a657d5431f | 15 | mDot* dot; |
socie123 | 5:838b35b0a3c3 | 16 | //Ticker ledTick; |
socie123 | 5:838b35b0a3c3 | 17 | //Ticker temperatureMonitorTick; |
bbayer | 0:18a657d5431f | 18 | Ticker periodicSendTick; |
bbayer | 0:18a657d5431f | 19 | |
socie123 | 5:838b35b0a3c3 | 20 | //PinDetect up_button(PB_1); //A0 on Arduino base shield |
socie123 | 5:838b35b0a3c3 | 21 | //PinDetect down_button(PB_0); //A1 on Arduino base shield |
bbayer | 2:d12fedc86ea5 | 22 | AnalogIn temperatureSensor(PC_1); //A2 on Arduino base shield |
socie123 | 5:838b35b0a3c3 | 23 | //DigitalOut transmitLED(LED1); |
socie123 | 5:838b35b0a3c3 | 24 | //DigitalOut buttonPressLED(PA_1); //D6 on Arduino base shield |
bbayer | 0:18a657d5431f | 25 | |
bbayer | 0:18a657d5431f | 26 | // Configuration variables |
socie123 | 5:838b35b0a3c3 | 27 | static std::string config_network_name = "watchlink"; |
socie123 | 5:838b35b0a3c3 | 28 | static std::string config_network_pass = "watchlink"; |
bbayer | 1:bf2afd6890a2 | 29 | static uint8_t config_frequency_sub_band = 1; |
bbayer | 0:18a657d5431f | 30 | |
bbayer | 0:18a657d5431f | 31 | //Global Variables |
socie123 | 5:838b35b0a3c3 | 32 | //static uint16_t setPoint = 21; //21 C is standard room temp |
bbayer | 0:18a657d5431f | 33 | static volatile bool timeToReadTemperature = true; |
bbayer | 0:18a657d5431f | 34 | static volatile bool dataChanged = true; |
socie123 | 5:838b35b0a3c3 | 35 | //static volatile bool thermostatActivated = false; |
socie123 | 5:838b35b0a3c3 | 36 | //static uint16_t sentSetPoint; |
bbayer | 0:18a657d5431f | 37 | |
bbayer | 0:18a657d5431f | 38 | //Function prototypes |
socie123 | 5:838b35b0a3c3 | 39 | //void ledTock(); |
bbayer | 0:18a657d5431f | 40 | void periodicSendTock(); |
socie123 | 5:838b35b0a3c3 | 41 | //void temperatureMonitorTock(); |
socie123 | 5:838b35b0a3c3 | 42 | //void up_button_callback(); |
socie123 | 5:838b35b0a3c3 | 43 | //void down_button_callback(); |
bbayer | 0:18a657d5431f | 44 | void printError(mDot* dot, int32_t returnCode); |
bbayer | 0:18a657d5431f | 45 | void printVersion(); |
bbayer | 0:18a657d5431f | 46 | bool setFrequencySubBand(uint8_t subBand); |
bbayer | 0:18a657d5431f | 47 | bool setNetworkName(const std::string name); |
bbayer | 0:18a657d5431f | 48 | bool setNetworkPassphrase(const std::string passphrase); |
bbayer | 0:18a657d5431f | 49 | bool setPower(uint8_t power); |
bbayer | 0:18a657d5431f | 50 | bool setAck(uint8_t retries); |
bbayer | 0:18a657d5431f | 51 | bool joinNetwork(); |
bbayer | 0:18a657d5431f | 52 | bool send(const std::string text); |
bbayer | 0:18a657d5431f | 53 | |
bbayer | 0:18a657d5431f | 54 | |
bbayer | 0:18a657d5431f | 55 | int main() |
bbayer | 0:18a657d5431f | 56 | { |
bbayer | 0:18a657d5431f | 57 | //Start LED startup sequence |
socie123 | 5:838b35b0a3c3 | 58 | //ledTick.attach(&ledTock, 0.1); |
bbayer | 0:18a657d5431f | 59 | |
bbayer | 0:18a657d5431f | 60 | printf("\r\n\r\n"); |
bbayer | 0:18a657d5431f | 61 | printf("=====================================\r\n"); |
bbayer | 0:18a657d5431f | 62 | printf("MTS Thermostat/Fan Demo (Sensor unit)\r\n"); |
bbayer | 0:18a657d5431f | 63 | printf("=====================================\r\n"); |
bbayer | 0:18a657d5431f | 64 | printVersion(); |
bbayer | 0:18a657d5431f | 65 | |
bbayer | 0:18a657d5431f | 66 | // get the mDot handle |
bbayer | 0:18a657d5431f | 67 | dot = mDot::getInstance(); |
bbayer | 0:18a657d5431f | 68 | |
bbayer | 0:18a657d5431f | 69 | // reset to default config so we know what state we're in |
bbayer | 0:18a657d5431f | 70 | dot->resetNetworkSession(); |
bbayer | 0:18a657d5431f | 71 | dot->resetConfig(); |
bbayer | 0:18a657d5431f | 72 | |
bbayer | 0:18a657d5431f | 73 | // set up the mDot with our network information |
bbayer | 0:18a657d5431f | 74 | setNetworkName(config_network_name); |
bbayer | 0:18a657d5431f | 75 | setNetworkPassphrase(config_network_pass); |
bbayer | 0:18a657d5431f | 76 | setFrequencySubBand(config_frequency_sub_band); |
bbayer | 0:18a657d5431f | 77 | setPower(7); // Reduce latency for 868 units |
bbayer | 0:18a657d5431f | 78 | setAck(0); // Disable ack for less latency |
bbayer | 0:18a657d5431f | 79 | |
bbayer | 0:18a657d5431f | 80 | while (!joinNetwork()) { wait(2); dot->resetNetworkSession(); } |
bbayer | 0:18a657d5431f | 81 | |
socie123 | 5:838b35b0a3c3 | 82 | //Stop LED startup sequence & configure them for operation |
socie123 | 5:838b35b0a3c3 | 83 | //ledTick.detach(); |
socie123 | 5:838b35b0a3c3 | 84 | //transmitLED = 1; |
socie123 | 5:838b35b0a3c3 | 85 | //buttonPressLED = 1; |
bbayer | 0:18a657d5431f | 86 | |
bbayer | 0:18a657d5431f | 87 | // Configure timers |
socie123 | 5:838b35b0a3c3 | 88 | periodicSendTick.attach(&periodicSendTock, 1*60); |
socie123 | 5:838b35b0a3c3 | 89 | //temperatureMonitorTick.attach(&temperatureMonitorTock, 0.15); |
bbayer | 0:18a657d5431f | 90 | |
bbayer | 0:18a657d5431f | 91 | // Setup Interrupt callback function |
socie123 | 5:838b35b0a3c3 | 92 | //up_button.attach_deasserted(&up_button_callback); |
socie123 | 5:838b35b0a3c3 | 93 | //down_button.attach_deasserted(&down_button_callback); |
bbayer | 0:18a657d5431f | 94 | |
bbayer | 0:18a657d5431f | 95 | // Start sampling buttons using interrupts |
socie123 | 5:838b35b0a3c3 | 96 | //up_button.setSampleFrequency(); |
socie123 | 5:838b35b0a3c3 | 97 | //down_button.setSampleFrequency(); |
bbayer | 0:18a657d5431f | 98 | |
bbayer | 0:18a657d5431f | 99 | uint16_t temperature = 0; |
socie123 | 5:838b35b0a3c3 | 100 | //while (1) { |
socie123 | 5:838b35b0a3c3 | 101 | //if (timeToReadTemperature) { |
socie123 | 5:838b35b0a3c3 | 102 | uint16_t B = 4100; //B value of the thermistor |
bbayer | 0:18a657d5431f | 103 | uint16_t analogReading; |
bbayer | 0:18a657d5431f | 104 | float resistance; |
bbayer | 0:18a657d5431f | 105 | |
bbayer | 0:18a657d5431f | 106 | analogReading = temperatureSensor.read_u16(); |
bbayer | 0:18a657d5431f | 107 | |
bbayer | 0:18a657d5431f | 108 | // get the resistance of the sensor |
bbayer | 0:18a657d5431f | 109 | resistance=(65534-analogReading)*10000/analogReading; |
bbayer | 0:18a657d5431f | 110 | // convert to temperature via datasheet |
bbayer | 0:18a657d5431f | 111 | temperature=1/(log(resistance/10000)/B+1/298.15)-273.15; |
bbayer | 0:18a657d5431f | 112 | //printf("read: %d, res: %d, temp: %d,set: %d\r\n", analogReading, (uint16_t)resistance, temperature, setPoint); |
bbayer | 0:18a657d5431f | 113 | |
socie123 | 5:838b35b0a3c3 | 114 | //if (!thermostatActivated && temperature > setPoint) { |
socie123 | 5:838b35b0a3c3 | 115 | //thermostatActivated = true; |
socie123 | 5:838b35b0a3c3 | 116 | //dataChanged = true; |
socie123 | 5:838b35b0a3c3 | 117 | //} |
socie123 | 5:838b35b0a3c3 | 118 | //else if (thermostatActivated && temperature < setPoint) { |
socie123 | 5:838b35b0a3c3 | 119 | //thermostatActivated = false; |
socie123 | 5:838b35b0a3c3 | 120 | //dataChanged = true; |
socie123 | 5:838b35b0a3c3 | 121 | //} |
bbayer | 0:18a657d5431f | 122 | |
socie123 | 5:838b35b0a3c3 | 123 | //timeToReadTemperature = false; |
socie123 | 5:838b35b0a3c3 | 124 | //} |
socie123 | 5:838b35b0a3c3 | 125 | |
socie123 | 5:838b35b0a3c3 | 126 | dataChanged = true; |
bbayer | 0:18a657d5431f | 127 | |
socie123 | 5:838b35b0a3c3 | 128 | |
bbayer | 0:18a657d5431f | 129 | if (dataChanged) { |
socie123 | 5:838b35b0a3c3 | 130 | |
bbayer | 0:18a657d5431f | 131 | char latestData[100]; |
socie123 | 5:838b35b0a3c3 | 132 | //transmitLED = 1; |
socie123 | 5:838b35b0a3c3 | 133 | // sentSetPoint = setPoint; |
socie123 | 5:838b35b0a3c3 | 134 | sprintf(latestData, "temp: %d", temperature); |
bbayer | 0:18a657d5431f | 135 | printf("%s\r\n", latestData); |
bbayer | 0:18a657d5431f | 136 | |
bbayer | 0:18a657d5431f | 137 | if (send(latestData)) { |
bbayer | 0:18a657d5431f | 138 | dataChanged = false; |
bbayer | 0:18a657d5431f | 139 | } |
socie123 | 5:838b35b0a3c3 | 140 | //transmitLED = 0; |
bbayer | 0:18a657d5431f | 141 | } |
socie123 | 5:838b35b0a3c3 | 142 | //} |
socie123 | 5:838b35b0a3c3 | 143 | //return true; |
bbayer | 0:18a657d5431f | 144 | } |
bbayer | 0:18a657d5431f | 145 | |
socie123 | 5:838b35b0a3c3 | 146 | void printVersion() |
socie123 | 5:838b35b0a3c3 | 147 | { |
socie123 | 5:838b35b0a3c3 | 148 | printf("%s\r\n\r\n", dot->getId().c_str()); |
bbayer | 0:18a657d5431f | 149 | } |
bbayer | 0:18a657d5431f | 150 | |
bbayer | 0:18a657d5431f | 151 | void periodicSendTock() { |
bbayer | 0:18a657d5431f | 152 | dataChanged = true; |
bbayer | 0:18a657d5431f | 153 | } |
bbayer | 0:18a657d5431f | 154 | |
bbayer | 0:18a657d5431f | 155 | bool setFrequencySubBand(uint8_t subBand) |
bbayer | 0:18a657d5431f | 156 | { |
bbayer | 0:18a657d5431f | 157 | int32_t returnCode; |
bbayer | 0:18a657d5431f | 158 | printf("Setting frequency sub band to '%d'...\r\n", subBand); |
bbayer | 0:18a657d5431f | 159 | if ((returnCode = dot->setFrequencySubBand(subBand)) != mDot::MDOT_OK) { |
bbayer | 0:18a657d5431f | 160 | printError(dot, returnCode); |
bbayer | 0:18a657d5431f | 161 | return false; |
bbayer | 0:18a657d5431f | 162 | } |
bbayer | 0:18a657d5431f | 163 | return true; |
bbayer | 0:18a657d5431f | 164 | } |
bbayer | 0:18a657d5431f | 165 | |
bbayer | 0:18a657d5431f | 166 | bool setNetworkName(const std::string name) |
bbayer | 0:18a657d5431f | 167 | { |
bbayer | 0:18a657d5431f | 168 | int32_t returnCode; |
bbayer | 0:18a657d5431f | 169 | printf("Setting network name to '%s'...\r\n", name.c_str()); |
bbayer | 0:18a657d5431f | 170 | if ((returnCode = dot->setNetworkName(name)) != mDot::MDOT_OK) |
bbayer | 0:18a657d5431f | 171 | { |
bbayer | 0:18a657d5431f | 172 | printError(dot, returnCode); |
bbayer | 0:18a657d5431f | 173 | return false; |
bbayer | 0:18a657d5431f | 174 | } |
bbayer | 0:18a657d5431f | 175 | return true; |
bbayer | 0:18a657d5431f | 176 | } |
bbayer | 0:18a657d5431f | 177 | |
bbayer | 0:18a657d5431f | 178 | bool setNetworkPassphrase(const std::string passphrase) |
bbayer | 0:18a657d5431f | 179 | { |
bbayer | 0:18a657d5431f | 180 | int32_t returnCode; |
bbayer | 0:18a657d5431f | 181 | printf("Setting passphrase to '%s'...\r\n", passphrase.c_str()); |
bbayer | 0:18a657d5431f | 182 | if ((returnCode = dot->setNetworkPassphrase(passphrase)) != mDot::MDOT_OK) |
bbayer | 0:18a657d5431f | 183 | { |
bbayer | 0:18a657d5431f | 184 | printError(dot, returnCode); |
bbayer | 0:18a657d5431f | 185 | return false; |
bbayer | 0:18a657d5431f | 186 | } |
bbayer | 0:18a657d5431f | 187 | return true; |
bbayer | 0:18a657d5431f | 188 | } |
bbayer | 0:18a657d5431f | 189 | |
bbayer | 0:18a657d5431f | 190 | bool setPower(uint8_t power) |
bbayer | 0:18a657d5431f | 191 | { |
bbayer | 0:18a657d5431f | 192 | int32_t returnCode; |
bbayer | 0:18a657d5431f | 193 | printf("Setting tx power to '%d'...\r\n", power); |
bbayer | 0:18a657d5431f | 194 | if ((returnCode = dot->setTxPower(power)) != mDot::MDOT_OK) { |
bbayer | 0:18a657d5431f | 195 | printError(dot, returnCode); |
bbayer | 0:18a657d5431f | 196 | return false; |
bbayer | 0:18a657d5431f | 197 | } |
bbayer | 0:18a657d5431f | 198 | return true; |
bbayer | 0:18a657d5431f | 199 | } |
bbayer | 0:18a657d5431f | 200 | |
bbayer | 0:18a657d5431f | 201 | |
bbayer | 0:18a657d5431f | 202 | bool joinNetwork() |
bbayer | 0:18a657d5431f | 203 | { |
bbayer | 0:18a657d5431f | 204 | int32_t returnCode; |
bbayer | 0:18a657d5431f | 205 | printf("\r\nJoining network...\r\n"); |
bbayer | 0:18a657d5431f | 206 | if ((returnCode = dot->joinNetworkOnce()) != mDot::MDOT_OK) { |
bbayer | 0:18a657d5431f | 207 | printError(dot, returnCode); |
bbayer | 0:18a657d5431f | 208 | return false; |
bbayer | 0:18a657d5431f | 209 | } |
bbayer | 0:18a657d5431f | 210 | printf("Network Joined!\r\n"); |
bbayer | 0:18a657d5431f | 211 | return true; |
bbayer | 0:18a657d5431f | 212 | } |
bbayer | 0:18a657d5431f | 213 | |
bbayer | 0:18a657d5431f | 214 | bool setAck(uint8_t retries) |
bbayer | 0:18a657d5431f | 215 | { |
bbayer | 0:18a657d5431f | 216 | int32_t returnCode; |
bbayer | 0:18a657d5431f | 217 | printf("Setting ack to '%d'...\r\n", retries); |
bbayer | 0:18a657d5431f | 218 | if ((returnCode = dot->setAck(retries)) != mDot::MDOT_OK) |
bbayer | 0:18a657d5431f | 219 | { |
bbayer | 0:18a657d5431f | 220 | printError(dot, returnCode); |
bbayer | 0:18a657d5431f | 221 | return false; |
bbayer | 0:18a657d5431f | 222 | } |
bbayer | 0:18a657d5431f | 223 | return true; |
bbayer | 0:18a657d5431f | 224 | } |
bbayer | 0:18a657d5431f | 225 | |
bbayer | 0:18a657d5431f | 226 | bool send(const std::string text) |
bbayer | 0:18a657d5431f | 227 | { |
bbayer | 0:18a657d5431f | 228 | int32_t returnCode; |
bbayer | 0:18a657d5431f | 229 | uint32_t timeTillSend = dot->getNextTxMs(); |
bbayer | 0:18a657d5431f | 230 | if (timeTillSend != 0) { |
bbayer | 0:18a657d5431f | 231 | printf("waiting %lu ms to send\r\n", timeTillSend); |
bbayer | 0:18a657d5431f | 232 | return false; |
bbayer | 0:18a657d5431f | 233 | } |
bbayer | 0:18a657d5431f | 234 | |
bbayer | 0:18a657d5431f | 235 | printf("Sending data... "); |
bbayer | 0:18a657d5431f | 236 | std::vector<uint8_t> data(text.begin(), text.end()); |
bbayer | 0:18a657d5431f | 237 | if ((returnCode = dot->send(data, 1)) != mDot::MDOT_OK) |
bbayer | 0:18a657d5431f | 238 | { |
bbayer | 0:18a657d5431f | 239 | printError(dot, returnCode); |
bbayer | 0:18a657d5431f | 240 | return false; |
bbayer | 0:18a657d5431f | 241 | } |
bbayer | 0:18a657d5431f | 242 | printf("Data sent!\r\n"); |
bbayer | 0:18a657d5431f | 243 | return true; |
bbayer | 0:18a657d5431f | 244 | } |
bbayer | 0:18a657d5431f | 245 | |
bbayer | 0:18a657d5431f | 246 | void printError(mDot* dot, int32_t returnCode) |
bbayer | 0:18a657d5431f | 247 | { |
bbayer | 0:18a657d5431f | 248 | std::string error = mDot::getReturnCodeString(returnCode) + " - " + dot->getLastError(); |
bbayer | 0:18a657d5431f | 249 | printf("%s\r\n", error.c_str()); |
socie123 | 5:838b35b0a3c3 | 250 | } |
bbayer | 0:18a657d5431f | 251 |