mDot source code for the "sensor" mDot in this demo: https://twitter.com/MultiTechSys/status/621708791009124352

Dependencies:   PinDetect libmDot mbed-rtos mbed

mDot source code for the "sensor" mDot in this demo: https://twitter.com/MultiTechSys/status/621708791009124352

Committer:
bbayer
Date:
Fri Jul 17 16:58:49 2015 +0000
Revision:
2:d12fedc86ea5
Parent:
1:bf2afd6890a2
Child:
3:d55b476ea5e6
update documentation

Who changed what in which revision?

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