Dreamforce 2013 MiniHack Thermostat Challenge

Dependencies:   C12832_lcd EthernetInterface-ansond-patched HTTPClient-thermostat-remotes LM75B MMA7660 SocketIO WebSocketClient-ThermostatDemo mbed-rtos mbed picojson

Committer:
ansond
Date:
Mon Nov 11 20:36:21 2013 +0000
Revision:
3:399f01802514
Parent:
0:bca7aceedd02
updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ansond 0:bca7aceedd02 1 /* Thermostat-LEDUtils.h */
ansond 0:bca7aceedd02 2 /* Copyright (C) 2013 mbed.org, MIT License
ansond 0:bca7aceedd02 3 *
ansond 0:bca7aceedd02 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
ansond 0:bca7aceedd02 5 * and associated documentation files (the "Software"), to deal in the Software without restriction,
ansond 0:bca7aceedd02 6 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
ansond 0:bca7aceedd02 7 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
ansond 0:bca7aceedd02 8 * furnished to do so, subject to the following conditions:
ansond 0:bca7aceedd02 9 *
ansond 0:bca7aceedd02 10 * The above copyright notice and this permission notice shall be included in all copies or
ansond 0:bca7aceedd02 11 * substantial portions of the Software.
ansond 0:bca7aceedd02 12 *
ansond 0:bca7aceedd02 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
ansond 0:bca7aceedd02 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
ansond 0:bca7aceedd02 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
ansond 0:bca7aceedd02 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
ansond 0:bca7aceedd02 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
ansond 0:bca7aceedd02 18 */
ansond 0:bca7aceedd02 19
ansond 0:bca7aceedd02 20 #ifndef THERMOSTAT_LEDUTILS_H_
ansond 0:bca7aceedd02 21 #define THERMOSTAT_LEDUTILS_H_
ansond 0:bca7aceedd02 22
ansond 0:bca7aceedd02 23 // LEDs to toggle with control messages
ansond 0:bca7aceedd02 24 DigitalOut led1(LED1);
ansond 0:bca7aceedd02 25 DigitalOut led2(LED2);
ansond 0:bca7aceedd02 26 DigitalOut led3(LED3);
ansond 0:bca7aceedd02 27 DigitalOut led4(LED4);
ansond 0:bca7aceedd02 28
ansond 0:bca7aceedd02 29 // Joystick button (to create an error condition)
ansond 0:bca7aceedd02 30 DigitalIn joystick_pressed(p14);
ansond 0:bca7aceedd02 31 DigitalIn joystick(p15);
ansond 0:bca7aceedd02 32
ansond 0:bca7aceedd02 33 // Pot 1 for dialing up and down the temperature
ansond 0:bca7aceedd02 34 AnalogIn Pot1(p19);
ansond 0:bca7aceedd02 35
ansond 0:bca7aceedd02 36 // Pot 2 for dialing up and down the battery level
ansond 0:bca7aceedd02 37 AnalogIn Pot2(p20);
ansond 0:bca7aceedd02 38
ansond 0:bca7aceedd02 39 // the led's are connected to vcc, so a PwmOut of 100% will shut off the led and 0% will let it shine
ansond 0:bca7aceedd02 40 PwmOut r (p23);
ansond 0:bca7aceedd02 41 PwmOut g (p24);
ansond 0:bca7aceedd02 42 PwmOut b (p25);
ansond 0:bca7aceedd02 43
ansond 0:bca7aceedd02 44 // get the int value of the joystick state
ansond 0:bca7aceedd02 45 int Thermostat::getErrorState() {
ansond 0:bca7aceedd02 46 if (this->m_error_state)
ansond 0:bca7aceedd02 47 return 1;
ansond 0:bca7aceedd02 48 else
ansond 0:bca7aceedd02 49 return 0;
ansond 0:bca7aceedd02 50 }
ansond 0:bca7aceedd02 51
ansond 0:bca7aceedd02 52 // function to convert hue , saturation and value to RGB - then update the RGB LED
ansond 0:bca7aceedd02 53 // see http://en.wikipedia.org/wiki/HSL_and_HSV
ansond 0:bca7aceedd02 54 void Thermostat::updateRGBLED(float H, float S, float V) {
ansond 0:bca7aceedd02 55 float f,h,p,q,t;
ansond 0:bca7aceedd02 56 int i;
ansond 0:bca7aceedd02 57 if( S == 0.0) {
ansond 0:bca7aceedd02 58 r = 1.0 - V; // invert pwm !
ansond 0:bca7aceedd02 59 g = 1.0 - V;
ansond 0:bca7aceedd02 60 b = 1.0 - V;
ansond 0:bca7aceedd02 61 return;
ansond 0:bca7aceedd02 62 }
ansond 0:bca7aceedd02 63 if(H > 360.0) H = 0.0; // check values
ansond 0:bca7aceedd02 64 if(S > 1.0) S = 1.0;
ansond 0:bca7aceedd02 65 if(S < 0.0) S = 0.0;
ansond 0:bca7aceedd02 66 if(V > 1.0) V = 1.0;
ansond 0:bca7aceedd02 67 if(V < 0.0) V = 0.0;
ansond 0:bca7aceedd02 68 h = H / 60.0;
ansond 0:bca7aceedd02 69 i = (int) h;
ansond 0:bca7aceedd02 70 f = h - i;
ansond 0:bca7aceedd02 71 p = V * (1.0 - S);
ansond 0:bca7aceedd02 72 q = V * (1.0 - (S * f));
ansond 0:bca7aceedd02 73 t = V * (1.0 - (S * (1.0 - f)));
ansond 0:bca7aceedd02 74
ansond 0:bca7aceedd02 75 switch(i) {
ansond 0:bca7aceedd02 76 case 0:
ansond 0:bca7aceedd02 77 r = 1.0 - V; // invert pwm !
ansond 0:bca7aceedd02 78 g = 1.0 - t;
ansond 0:bca7aceedd02 79 b = 1.0 - p;
ansond 0:bca7aceedd02 80 break;
ansond 0:bca7aceedd02 81 case 1:
ansond 0:bca7aceedd02 82 r = 1.0 - q;
ansond 0:bca7aceedd02 83 g = 1.0 - V;
ansond 0:bca7aceedd02 84 b = 1.0 - p;
ansond 0:bca7aceedd02 85 break;
ansond 0:bca7aceedd02 86 case 2:
ansond 0:bca7aceedd02 87 r = 1.0 - p;
ansond 0:bca7aceedd02 88 g = 1.0 - V;
ansond 0:bca7aceedd02 89 b = 1.0 - t;
ansond 0:bca7aceedd02 90 break;
ansond 0:bca7aceedd02 91 case 3:
ansond 0:bca7aceedd02 92 r = 1.0 - p;
ansond 0:bca7aceedd02 93 g = 1.0 - q;
ansond 0:bca7aceedd02 94 b = 1.0 - V;
ansond 0:bca7aceedd02 95 break;
ansond 0:bca7aceedd02 96 case 4:
ansond 0:bca7aceedd02 97 r = 1.0 - t;
ansond 0:bca7aceedd02 98 g = 1.0 - p;
ansond 0:bca7aceedd02 99 b = 1.0 - V;
ansond 0:bca7aceedd02 100 break;
ansond 0:bca7aceedd02 101 case 5:
ansond 0:bca7aceedd02 102 default:
ansond 0:bca7aceedd02 103 r = 1.0 - V;
ansond 0:bca7aceedd02 104 g = 1.0 - p;
ansond 0:bca7aceedd02 105 b = 1.0 - q;
ansond 0:bca7aceedd02 106 break;
ansond 0:bca7aceedd02 107 }
ansond 0:bca7aceedd02 108 }
ansond 0:bca7aceedd02 109
ansond 0:bca7aceedd02 110 // set all the LEDs
ansond 0:bca7aceedd02 111 void Thermostat::setAllLEDs(int state) {
ansond 0:bca7aceedd02 112 led1.write(state);
ansond 0:bca7aceedd02 113 led2.write(state);
ansond 0:bca7aceedd02 114 led3.write(state);
ansond 0:bca7aceedd02 115 led4.write(state);
ansond 0:bca7aceedd02 116 }
ansond 0:bca7aceedd02 117
ansond 0:bca7aceedd02 118 // set all the LEDs
ansond 0:bca7aceedd02 119 void Thermostat::resetAllLEDs() {
ansond 0:bca7aceedd02 120 this->setAllLEDs(0);
ansond 0:bca7aceedd02 121 }
ansond 0:bca7aceedd02 122
ansond 0:bca7aceedd02 123 // set all the LEDs
ansond 0:bca7aceedd02 124 void Thermostat::blinkAllLEDs() {
ansond 0:bca7aceedd02 125 for(int i=0;i<4;++i) {
ansond 0:bca7aceedd02 126 wait(1.0);
ansond 0:bca7aceedd02 127 this->setAllLEDs(1);
ansond 0:bca7aceedd02 128 this->display("Blinking on...");
ansond 0:bca7aceedd02 129 wait(1.0);
ansond 0:bca7aceedd02 130 this->setAllLEDs(0);
ansond 0:bca7aceedd02 131 this->display("Blinking off...");
ansond 0:bca7aceedd02 132 }
ansond 0:bca7aceedd02 133 }
ansond 0:bca7aceedd02 134
ansond 0:bca7aceedd02 135 // set the RGB LED color and brightness
ansond 0:bca7aceedd02 136 void Thermostat::setRGBLED(double color, double bright) {
ansond 0:bca7aceedd02 137 // set the RGB LED value
ansond 0:bca7aceedd02 138 this->updateRGBLED(color,1.0,bright);
ansond 0:bca7aceedd02 139 }
ansond 0:bca7aceedd02 140
ansond 0:bca7aceedd02 141 // turn the RGB LED Red
ansond 0:bca7aceedd02 142 void Thermostat::turnRGBLEDRed() {
ansond 0:bca7aceedd02 143 this->m_rgbLEDColor = 0.0;
ansond 0:bca7aceedd02 144 this->m_rgbLEDBright = 0.2;
ansond 0:bca7aceedd02 145 this->setRGBLED(this->m_rgbLEDColor,this->m_rgbLEDBright);
ansond 0:bca7aceedd02 146 this->m_error_state = true;
ansond 0:bca7aceedd02 147 }
ansond 0:bca7aceedd02 148
ansond 0:bca7aceedd02 149 // turn the RGB LED Green
ansond 0:bca7aceedd02 150 void Thermostat::turnRGBLEDGreen() {
ansond 0:bca7aceedd02 151 this->m_rgbLEDColor = 120.0;
ansond 0:bca7aceedd02 152 this->m_rgbLEDBright = 0.2;
ansond 0:bca7aceedd02 153 this->setRGBLED(this->m_rgbLEDColor,this->m_rgbLEDBright);
ansond 0:bca7aceedd02 154 this->m_error_state = false;
ansond 0:bca7aceedd02 155 }
ansond 0:bca7aceedd02 156
ansond 0:bca7aceedd02 157 // turn the RGB LED Blue (initializing state)
ansond 0:bca7aceedd02 158 void Thermostat::turnRGBLEDBlue() {
ansond 0:bca7aceedd02 159 this->m_rgbLEDColor = 200.0;
ansond 0:bca7aceedd02 160 this->m_rgbLEDBright = 0.2;
ansond 0:bca7aceedd02 161 this->setRGBLED(this->m_rgbLEDColor,this->m_rgbLEDBright);
ansond 0:bca7aceedd02 162 this->m_error_state = false;
ansond 0:bca7aceedd02 163 }
ansond 0:bca7aceedd02 164
ansond 0:bca7aceedd02 165 // blink an LED
ansond 0:bca7aceedd02 166 void Thermostat::blinkLED(DigitalOut led) {
ansond 0:bca7aceedd02 167 led = 1;
ansond 0:bca7aceedd02 168 wait(0.2);
ansond 0:bca7aceedd02 169 led = 0;
ansond 0:bca7aceedd02 170 }
ansond 0:bca7aceedd02 171
ansond 0:bca7aceedd02 172 // blink the Transport TX LED
ansond 0:bca7aceedd02 173 void Thermostat::blinkTransportTxLED() {
ansond 0:bca7aceedd02 174 this->blinkLED(led1);
ansond 0:bca7aceedd02 175 }
ansond 0:bca7aceedd02 176
ansond 0:bca7aceedd02 177 // blink the Transport RX LED
ansond 0:bca7aceedd02 178 void Thermostat::blinkTransportRxLED() {
ansond 0:bca7aceedd02 179 this->blinkLED(led2);
ansond 0:bca7aceedd02 180 }
ansond 0:bca7aceedd02 181
ansond 0:bca7aceedd02 182
ansond 0:bca7aceedd02 183 #endif // THERMOSTAT_LEDUTILS_H_