Michael Knudson / Mbed 2 deprecated Thermostat

Dependencies:   mbed mbed-rtos 4DGL-uLCD-SE

Committer:
mknudson3
Date:
Mon Apr 27 00:56:36 2020 +0000
Revision:
6:65bbd44cabd7
Parent:
5:568a15151d11
Child:
7:58575c249736
add ble and add uLCD gui;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:c27c61c0a1e0 1 #include "mbed.h"
emilmont 1:c27c61c0a1e0 2 #include "rtos.h"
mknudson3 5:568a15151d11 3 #include "uLCD_4DGL.h"
emilmont 1:c27c61c0a1e0 4
mknudson3 5:568a15151d11 5 #define DEBOUNCE_TIME 10 // 10 * 0.5 (main loop) = 5 seconds
mknudson3 5:568a15151d11 6
mknudson3 5:568a15151d11 7 uLCD_4DGL uLCD(p9,p10,p17); // serial tx, serial rx, reset pin;
emilmont 1:c27c61c0a1e0 8
mknudson3 5:568a15151d11 9 BusOut leds(LED1, LED2, LED3, LED4);
mknudson3 5:568a15151d11 10 DigitalOut relay(p21);
mknudson3 5:568a15151d11 11 AnalogIn tmp36(p19);
mknudson3 5:568a15151d11 12 AnalogIn pot(p20);
mknudson3 6:65bbd44cabd7 13 RawSerial tooth(p28,p27);
mknudson3 5:568a15151d11 14
mknudson3 6:65bbd44cabd7 15 volatile int currTemp, desiredTemp;
mknudson3 5:568a15151d11 16 bool isHeating;
mknudson3 6:65bbd44cabd7 17 Mutex desiredTempLock;
mknudson3 6:65bbd44cabd7 18
mknudson3 6:65bbd44cabd7 19 bool setOrange;
mknudson3 6:65bbd44cabd7 20 bool setGray;
mknudson3 6:65bbd44cabd7 21
mknudson3 6:65bbd44cabd7 22 void setLCDGraphics(int temp) {
mknudson3 6:65bbd44cabd7 23 if(setOrange) {
mknudson3 6:65bbd44cabd7 24 uLCD.circle(64,64,61,WHITE);
mknudson3 6:65bbd44cabd7 25 uLCD.filled_circle(64,64,60,0xF2A007);
mknudson3 6:65bbd44cabd7 26 uLCD.locate(2,5);
mknudson3 6:65bbd44cabd7 27 uLCD.text_width(1);
mknudson3 6:65bbd44cabd7 28 uLCD.text_height(1);
mknudson3 6:65bbd44cabd7 29 uLCD.text_mode(TRANSPARENT);
mknudson3 6:65bbd44cabd7 30 uLCD.color(WHITE);
mknudson3 6:65bbd44cabd7 31 uLCD.printf("mbed Thermostat\r\n\r\n ");
mknudson3 6:65bbd44cabd7 32 uLCD.text_width(4);
mknudson3 6:65bbd44cabd7 33 uLCD.text_height(4);
mknudson3 6:65bbd44cabd7 34 uLCD.printf("%d\r\n",currTemp);
mknudson3 6:65bbd44cabd7 35 uLCD.text_width(1);
mknudson3 6:65bbd44cabd7 36 uLCD.text_height(1);
mknudson3 6:65bbd44cabd7 37 uLCD.locate(6,10);
mknudson3 6:65bbd44cabd7 38 uLCD.printf("\r\n\r\n Heating to:%d", desiredTemp);
mknudson3 6:65bbd44cabd7 39 }
mknudson3 6:65bbd44cabd7 40 else if(setGray) {
mknudson3 6:65bbd44cabd7 41 uLCD.circle(64,64,61,WHITE);
mknudson3 6:65bbd44cabd7 42 uLCD.filled_circle(64,64,60,0x969AE0);
mknudson3 6:65bbd44cabd7 43 uLCD.locate(2,5);
mknudson3 6:65bbd44cabd7 44 uLCD.text_width(1);
mknudson3 6:65bbd44cabd7 45 uLCD.text_height(1);
mknudson3 6:65bbd44cabd7 46 uLCD.text_mode(TRANSPARENT);
mknudson3 6:65bbd44cabd7 47 uLCD.color(WHITE);
mknudson3 6:65bbd44cabd7 48 uLCD.printf("mbed Thermostat\r\n\r\n ");
mknudson3 6:65bbd44cabd7 49 uLCD.text_width(4);
mknudson3 6:65bbd44cabd7 50 uLCD.text_height(4);
mknudson3 6:65bbd44cabd7 51 uLCD.printf("%d\r\n",currTemp);
mknudson3 6:65bbd44cabd7 52 uLCD.text_width(1);
mknudson3 6:65bbd44cabd7 53 uLCD.text_height(1);
mknudson3 6:65bbd44cabd7 54 uLCD.locate(6,10);
mknudson3 6:65bbd44cabd7 55 uLCD.printf("\r\n\r\n Cooling to:%d", desiredTemp);
mknudson3 6:65bbd44cabd7 56 }
mknudson3 6:65bbd44cabd7 57 else if(!setOrange && !setGray) {
mknudson3 6:65bbd44cabd7 58 uLCD.circle(64,64,61,WHITE);
mknudson3 6:65bbd44cabd7 59 uLCD.filled_circle(64,64,60,0x255ECF);
mknudson3 6:65bbd44cabd7 60 uLCD.locate(2,5);
mknudson3 6:65bbd44cabd7 61 uLCD.text_width(1);
mknudson3 6:65bbd44cabd7 62 uLCD.text_height(1);
mknudson3 6:65bbd44cabd7 63 uLCD.text_mode(TRANSPARENT);
mknudson3 6:65bbd44cabd7 64 uLCD.color(WHITE);
mknudson3 6:65bbd44cabd7 65 uLCD.printf("mbed Thermostat\r\n\r\n ");
mknudson3 6:65bbd44cabd7 66 uLCD.text_width(4);
mknudson3 6:65bbd44cabd7 67 uLCD.text_height(4);
mknudson3 6:65bbd44cabd7 68 uLCD.printf("%d\r\n",currTemp);
mknudson3 6:65bbd44cabd7 69 uLCD.text_width(1);
mknudson3 6:65bbd44cabd7 70 uLCD.text_height(1);
mknudson3 6:65bbd44cabd7 71 uLCD.locate(6,10);
mknudson3 6:65bbd44cabd7 72 uLCD.printf("\r\n\r\n Set to:%d", desiredTemp);
mknudson3 6:65bbd44cabd7 73 }
mknudson3 6:65bbd44cabd7 74 }
mknudson3 6:65bbd44cabd7 75
mknudson3 6:65bbd44cabd7 76 //void compareTemp(void const *args) {
mknudson3 6:65bbd44cabd7 77 void compareTemp() {
mknudson3 6:65bbd44cabd7 78 while(true) {
mknudson3 6:65bbd44cabd7 79 if(currTemp > desiredTemp) {
mknudson3 6:65bbd44cabd7 80 setGray = true;
mknudson3 6:65bbd44cabd7 81 setOrange = false;
mknudson3 6:65bbd44cabd7 82 }
mknudson3 6:65bbd44cabd7 83 else if(currTemp < desiredTemp) {
mknudson3 6:65bbd44cabd7 84 setOrange = true;
mknudson3 6:65bbd44cabd7 85 setGray = true;
mknudson3 6:65bbd44cabd7 86 }
mknudson3 6:65bbd44cabd7 87 else if(currTemp == desiredTemp) {
mknudson3 6:65bbd44cabd7 88 setOrange = false;
mknudson3 6:65bbd44cabd7 89 setGray = false;
mknudson3 6:65bbd44cabd7 90 }
mknudson3 6:65bbd44cabd7 91 setLCDGraphics(currTemp);
mknudson3 6:65bbd44cabd7 92 Thread::wait(3000);
mknudson3 6:65bbd44cabd7 93 }
mknudson3 6:65bbd44cabd7 94 }
mknudson3 5:568a15151d11 95
mknudson3 5:568a15151d11 96 // Helper function
mknudson3 5:568a15151d11 97 // convert tmp36 reading to degrees fahrenheit
mknudson3 5:568a15151d11 98 int tmp2f() {
mknudson3 5:568a15151d11 99 return (tmp36 * 3.3 - 0.5) * 180 + 32;
emilmont 1:c27c61c0a1e0 100 }
emilmont 1:c27c61c0a1e0 101
mknudson3 5:568a15151d11 102 void attemptToggle(Timer* timer, bool conditional) {
mknudson3 5:568a15151d11 103 if (!*timer) {
mknudson3 5:568a15151d11 104 timer->start();
mknudson3 5:568a15151d11 105 } else if (!conditional) {
mknudson3 5:568a15151d11 106 timer->stop();
mknudson3 5:568a15151d11 107 timer->reset();
mknudson3 5:568a15151d11 108 } else if (*timer >= DEBOUNCE_TIME) {
mknudson3 5:568a15151d11 109 timer->stop();
mknudson3 5:568a15151d11 110 timer->reset();
mknudson3 5:568a15151d11 111 isHeating = !isHeating;
mknudson3 5:568a15151d11 112 }
mknudson3 5:568a15151d11 113 }
mknudson3 6:65bbd44cabd7 114 void bluetooth() {
mknudson3 6:65bbd44cabd7 115 while(1){
mknudson3 6:65bbd44cabd7 116 if (!tooth.readable()) Thread::yield();
mknudson3 6:65bbd44cabd7 117 char bnum=0;
mknudson3 6:65bbd44cabd7 118 char bhit=0;
mknudson3 6:65bbd44cabd7 119 if (tooth.getc()=='!') {
mknudson3 6:65bbd44cabd7 120 if (tooth.getc()=='B') { //button data packet
mknudson3 6:65bbd44cabd7 121 bnum = tooth.getc(); //button number
mknudson3 6:65bbd44cabd7 122 bhit = tooth.getc(); //1=hit, 0=release
mknudson3 6:65bbd44cabd7 123 if (tooth.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
mknudson3 6:65bbd44cabd7 124 switch (bnum) {
mknudson3 6:65bbd44cabd7 125 case '5': //up arrow
mknudson3 6:65bbd44cabd7 126 if (bhit=='1') {
mknudson3 6:65bbd44cabd7 127 desiredTempLock.lock();
mknudson3 6:65bbd44cabd7 128 desiredTemp++;
mknudson3 6:65bbd44cabd7 129 desiredTempLock.unlock();
mknudson3 6:65bbd44cabd7 130 }
mknudson3 6:65bbd44cabd7 131 break;
mknudson3 6:65bbd44cabd7 132 case '6': //button 6 down arrow
mknudson3 6:65bbd44cabd7 133 if (bhit=='1') {
mknudson3 6:65bbd44cabd7 134 desiredTempLock.lock();
mknudson3 6:65bbd44cabd7 135 desiredTemp--;
mknudson3 6:65bbd44cabd7 136 desiredTempLock.unlock();
mknudson3 6:65bbd44cabd7 137 }
mknudson3 6:65bbd44cabd7 138 break;
mknudson3 6:65bbd44cabd7 139 }
mknudson3 6:65bbd44cabd7 140 }
mknudson3 6:65bbd44cabd7 141 }
mknudson3 6:65bbd44cabd7 142 }
mknudson3 6:65bbd44cabd7 143 Thread::wait(10);
mknudson3 6:65bbd44cabd7 144 }
mknudson3 6:65bbd44cabd7 145 }
mknudson3 5:568a15151d11 146
mknudson3 6:65bbd44cabd7 147 Thread bluetooth_thread;
mknudson3 6:65bbd44cabd7 148 Thread uLCD_thread;
mknudson3 5:568a15151d11 149 int main() {
mknudson3 5:568a15151d11 150
mknudson3 6:65bbd44cabd7 151 desiredTemp = 72;
mknudson3 6:65bbd44cabd7 152
mknudson3 6:65bbd44cabd7 153 bluetooth_thread.start(bluetooth);
mknudson3 6:65bbd44cabd7 154
mknudson3 6:65bbd44cabd7 155 uLCD.display_control(LANDSCAPE);
mknudson3 6:65bbd44cabd7 156 uLCD.cls();
mknudson3 6:65bbd44cabd7 157 uLCD.baudrate(30000); //jack up baud rate
mknudson3 6:65bbd44cabd7 158 wait(1.0);
mknudson3 6:65bbd44cabd7 159 uLCD.cls();
mknudson3 6:65bbd44cabd7 160
mknudson3 6:65bbd44cabd7 161 uLCD_thread.start(compareTemp);
mknudson3 6:65bbd44cabd7 162
mknudson3 5:568a15151d11 163 bool shouldHeat = false;
mknudson3 5:568a15151d11 164 isHeating = false;
emilmont 1:c27c61c0a1e0 165
mknudson3 6:65bbd44cabd7 166 Timer tMain, on, off;
mknudson3 6:65bbd44cabd7 167 tMain.start();
mknudson3 5:568a15151d11 168 while(1) {
mknudson3 6:65bbd44cabd7 169 if (tMain.read_ms() > 500) {
mknudson3 6:65bbd44cabd7 170 tMain.reset();
mknudson3 5:568a15151d11 171 currTemp = tmp2f();
mknudson3 5:568a15151d11 172 shouldHeat = currTemp < desiredTemp;
mknudson3 5:568a15151d11 173 if (isHeating) attemptToggle(&off, !shouldHeat);
mknudson3 5:568a15151d11 174 if (!isHeating) attemptToggle(&on, shouldHeat);
mknudson3 5:568a15151d11 175
mknudson3 5:568a15151d11 176 leds = relay = isHeating;
mknudson3 5:568a15151d11 177 }
mknudson3 5:568a15151d11 178 }
emilmont 1:c27c61c0a1e0 179 }
mknudson3 6:65bbd44cabd7 180