complete

Dependencies:   4DGL-uLCD-SE_ PinDetect SDFileSystem mbed

Fork of mythermostat by jim hamblen

Committer:
jboettcher
Date:
Sun Nov 06 22:08:58 2016 +0000
Revision:
6:5ba4232c5e1c
Parent:
5:c73ebb00e86d
Complete

Who changed what in which revision?

UserRevisionLine numberNew contents of line
4180_1 0:cc87c48aa43c 1 #include "mbed.h"
4180_1 2:58d85409f7ff 2 #include "TMP36.h"
4180_1 2:58d85409f7ff 3 #include "SDFileSystem.h"
4180_1 4:9a4d22a279b3 4 #include "uLCD_4DGL.h"
4180_1 0:cc87c48aa43c 5 #include "PinDetect.h"
4180_1 2:58d85409f7ff 6 #include "Speaker.h"
4180_1 2:58d85409f7ff 7 #include "Shiftbrite.h"
jboettcher 5:c73ebb00e86d 8 #include <math.h>
jboettcher 5:c73ebb00e86d 9 #include <iostream>
jboettcher 5:c73ebb00e86d 10 #include "stdio.h"
4180_1 2:58d85409f7ff 11
4180_1 2:58d85409f7ff 12 // use class to setup temperature sensor pins
4180_1 2:58d85409f7ff 13 TMP36 myTMP36(p15); //Analog in
4180_1 0:cc87c48aa43c 14
4180_1 2:58d85409f7ff 15 // use class to setup microSD card filesystem
4180_1 2:58d85409f7ff 16 SDFileSystem sd(p5, p6, p7, p8, "sd");
4180_1 2:58d85409f7ff 17
4180_1 4:9a4d22a279b3 18 // use class to setup the Color LCD
4180_1 4:9a4d22a279b3 19 uLCD_4DGL uLCD(p28, p27, p29); // create a global uLCD object
4180_1 2:58d85409f7ff 20
4180_1 2:58d85409f7ff 21 // use class to setup pushbuttons pins
4180_1 4:9a4d22a279b3 22 PinDetect pb1(p23);
4180_1 4:9a4d22a279b3 23 PinDetect pb2(p24);
4180_1 4:9a4d22a279b3 24 PinDetect pb3(p25);
jboettcher 5:c73ebb00e86d 25 PinDetect pb4(p26);
4180_1 2:58d85409f7ff 26
4180_1 2:58d85409f7ff 27 // use class to setup speaker pin
4180_1 2:58d85409f7ff 28 Speaker mySpeaker(p21); //PWM out
4180_1 0:cc87c48aa43c 29
4180_1 2:58d85409f7ff 30 // use class to setup Shiftbrite pins
4180_1 2:58d85409f7ff 31 Shiftbrite myShiftbrite(p9, p10, p11, p12, p13);// ei li di n/c ci
4180_1 2:58d85409f7ff 32
4180_1 2:58d85409f7ff 33 // use class to setup Mbed's four on-board LEDs
4180_1 2:58d85409f7ff 34 DigitalOut myLED1(LED1);
4180_1 2:58d85409f7ff 35 DigitalOut myLED2(LED2);
4180_1 2:58d85409f7ff 36 DigitalOut myLED3(LED3);
4180_1 2:58d85409f7ff 37 DigitalOut myLED4(LED4);
4180_1 2:58d85409f7ff 38
4180_1 2:58d85409f7ff 39 //also setting any unused analog input pins to digital outputs reduces A/D noise a bit
4180_1 2:58d85409f7ff 40 //see http://mbed.org/users/chris/notebook/Getting-best-ADC-performance/
4180_1 2:58d85409f7ff 41 DigitalOut P16(p16);
4180_1 2:58d85409f7ff 42 DigitalOut P17(p17);
jboettcher 5:c73ebb00e86d 43 DigitalOut bluepin(p18);
jboettcher 5:c73ebb00e86d 44 DigitalOut greenpin(p19);
jboettcher 5:c73ebb00e86d 45 DigitalOut redpin(p20);
4180_1 2:58d85409f7ff 46
4180_1 2:58d85409f7ff 47 // Global variables used in callbacks and main program
4180_1 2:58d85409f7ff 48 // C variables in interrupt routines should use volatile keyword
jboettcher 5:c73ebb00e86d 49 //int volatile heat_setting=78; // heat to temp
jboettcher 5:c73ebb00e86d 50 //int volatile cool_setting=68; // cool to temp
jboettcher 5:c73ebb00e86d 51 //bool volatile mode=false; // heat or cool mode
jboettcher 5:c73ebb00e86d 52 int target_temp;
jboettcher 5:c73ebb00e86d 53 int Prior_temp = 75;
jboettcher 5:c73ebb00e86d 54 double tempF = 75;
jboettcher 5:c73ebb00e86d 55 int volatile heat_setpoint = 77;
jboettcher 5:c73ebb00e86d 56 int volatile cool_setpoint = 68;
jboettcher 5:c73ebb00e86d 57 int volatile heat_setpoint_C = 25;
jboettcher 5:c73ebb00e86d 58 int volatile cool_setpoint_C = 20;
jboettcher 5:c73ebb00e86d 59 int mode = 0;
jboettcher 5:c73ebb00e86d 60 int centigrade = 0;
4180_1 0:cc87c48aa43c 61
4180_1 1:768b8bd42e33 62 // Callback routine is interrupt activated by a debounced pb1 hit
4180_1 2:58d85409f7ff 63 void pb1_hit_callback (void)
4180_1 2:58d85409f7ff 64 {
jboettcher 5:c73ebb00e86d 65 target_temp++;
jboettcher 5:c73ebb00e86d 66 mySpeaker.PlayNote(2000.0, 0.05, 1.0);
4180_1 0:cc87c48aa43c 67 }
4180_1 1:768b8bd42e33 68 // Callback routine is interrupt activated by a debounced pb2 hit
4180_1 2:58d85409f7ff 69 void pb2_hit_callback (void)
4180_1 2:58d85409f7ff 70 {
jboettcher 5:c73ebb00e86d 71 target_temp--;
jboettcher 5:c73ebb00e86d 72 mySpeaker.PlayNote(2000.0, 0.05, 1.0);
4180_1 2:58d85409f7ff 73 }
4180_1 2:58d85409f7ff 74 // Callback routine is interrupt activated by a debounced pb3 hit
4180_1 2:58d85409f7ff 75 void pb3_hit_callback (void)
4180_1 2:58d85409f7ff 76 {
jboettcher 5:c73ebb00e86d 77 mode = (mode + 1) % 3; // Cycle forward by 1
jboettcher 5:c73ebb00e86d 78 mySpeaker.PlayNote(3000.0, 0.025, 1.0);
4180_1 1:768b8bd42e33 79 }
jboettcher 5:c73ebb00e86d 80 void pb4_hit_callback (void)
jboettcher 5:c73ebb00e86d 81 {
jboettcher 5:c73ebb00e86d 82 wait(.001);
jboettcher 5:c73ebb00e86d 83 centigrade = (centigrade + 1) % 2;
jboettcher 5:c73ebb00e86d 84 }
4180_1 0:cc87c48aa43c 85
4180_1 2:58d85409f7ff 86 int main()
4180_1 2:58d85409f7ff 87 {
4180_1 2:58d85409f7ff 88 float Current_temp=0.0;
4180_1 2:58d85409f7ff 89
4180_1 2:58d85409f7ff 90 // Use internal pullups for the three pushbuttons
4180_1 2:58d85409f7ff 91 pb1.mode(PullUp);
4180_1 1:768b8bd42e33 92 pb2.mode(PullUp);
4180_1 2:58d85409f7ff 93 pb3.mode(PullUp);
jboettcher 5:c73ebb00e86d 94 pb4.mode(PullUp);
4180_1 0:cc87c48aa43c 95 // Delay for initial pullup to take effect
4180_1 0:cc87c48aa43c 96 wait(.01);
4180_1 1:768b8bd42e33 97 // Setup Interrupt callback functions for a pb hit
4180_1 1:768b8bd42e33 98 pb1.attach_deasserted(&pb1_hit_callback);
4180_1 1:768b8bd42e33 99 pb2.attach_deasserted(&pb2_hit_callback);
4180_1 3:346ef671ef28 100 pb3.attach_deasserted(&pb3_hit_callback);
jboettcher 5:c73ebb00e86d 101 pb4.attach_deasserted(&pb4_hit_callback);
4180_1 1:768b8bd42e33 102 // Start sampling pb inputs using interrupts
4180_1 1:768b8bd42e33 103 pb1.setSampleFrequency();
4180_1 1:768b8bd42e33 104 pb2.setSampleFrequency();
4180_1 3:346ef671ef28 105 pb3.setSampleFrequency();
jboettcher 5:c73ebb00e86d 106 pb4.setSampleFrequency();
4180_1 2:58d85409f7ff 107 // pushbuttons now setup and running
jboettcher 5:c73ebb00e86d 108
4180_1 4:9a4d22a279b3 109 printf("Hello PC World\n\r"); // need terminal application running on PC to see this output
jboettcher 5:c73ebb00e86d 110 uLCD.printf("\n\rJoe's Thermostat\n\r"); // LCD
4180_1 2:58d85409f7ff 111 mySpeaker.PlayNote(500.0, 1.0, 1.0); // Speaker buzz
jboettcher 6:5ba4232c5e1c 112 enum Statetype { Off = 0, Heat_off, Heat_on, Cool_off, Cool_on };
jboettcher 6:5ba4232c5e1c 113 Statetype state = Off;
jboettcher 6:5ba4232c5e1c 114 uLCD.locate(3,6);
jboettcher 6:5ba4232c5e1c 115 uLCD.printf("OFF ");
4180_1 3:346ef671ef28 116 // State machine code below will need changes and additions
4180_1 0:cc87c48aa43c 117 while (1) {
jboettcher 5:c73ebb00e86d 118
jboettcher 5:c73ebb00e86d 119 while(1) {
jboettcher 5:c73ebb00e86d 120 Prior_temp = tempF;
jboettcher 5:c73ebb00e86d 121 Current_temp = myTMP36; //Read temp sensor
jboettcher 5:c73ebb00e86d 122 tempF = (9.0*Current_temp)/5.0+ 32.0;
jboettcher 5:c73ebb00e86d 123 double tempC = Current_temp;
jboettcher 5:c73ebb00e86d 124
jboettcher 5:c73ebb00e86d 125
jboettcher 5:c73ebb00e86d 126 switch (mode) {
jboettcher 5:c73ebb00e86d 127 case (0):
jboettcher 5:c73ebb00e86d 128 uLCD.locate(3,6);
jboettcher 5:c73ebb00e86d 129 uLCD.printf("OFF ");
jboettcher 5:c73ebb00e86d 130 //target_temp = 75;
jboettcher 5:c73ebb00e86d 131 break;
jboettcher 5:c73ebb00e86d 132 case (1):
jboettcher 5:c73ebb00e86d 133 uLCD.locate(3,6);
jboettcher 5:c73ebb00e86d 134 uLCD.color(RED);
jboettcher 5:c73ebb00e86d 135 uLCD.printf("HEAT ");
jboettcher 5:c73ebb00e86d 136 uLCD.color(GREEN);
jboettcher 5:c73ebb00e86d 137 //if (centigrade == 0)
jboettcher 5:c73ebb00e86d 138 // target_temp = heat_setpoint;
jboettcher 5:c73ebb00e86d 139 //else
jboettcher 5:c73ebb00e86d 140 // target_temp = heat_setpoint_C;
jboettcher 5:c73ebb00e86d 141 break;
jboettcher 5:c73ebb00e86d 142 case (2):
jboettcher 5:c73ebb00e86d 143 uLCD.locate(3,6);
jboettcher 5:c73ebb00e86d 144 uLCD.color(LBLUE);
jboettcher 5:c73ebb00e86d 145 uLCD.printf("COOL ");
jboettcher 5:c73ebb00e86d 146 uLCD.color(GREEN);
jboettcher 5:c73ebb00e86d 147 // if (centigrade == 0)
jboettcher 5:c73ebb00e86d 148 // target_temp = cool_setpoint;
jboettcher 5:c73ebb00e86d 149 //else
jboettcher 5:c73ebb00e86d 150 // target_temp = cool_setpoint_C;
jboettcher 5:c73ebb00e86d 151 break;
jboettcher 5:c73ebb00e86d 152 }
jboettcher 5:c73ebb00e86d 153
jboettcher 5:c73ebb00e86d 154
jboettcher 5:c73ebb00e86d 155
jboettcher 5:c73ebb00e86d 156 if (centigrade == 1)
jboettcher 5:c73ebb00e86d 157 tempF = tempC;
jboettcher 5:c73ebb00e86d 158 //tempF = round(tempF);
jboettcher 5:c73ebb00e86d 159
jboettcher 5:c73ebb00e86d 160 uLCD.locate(2,10);
jboettcher 5:c73ebb00e86d 161 if (centigrade == 0)
jboettcher 5:c73ebb00e86d 162 {
jboettcher 5:c73ebb00e86d 163 uLCD.text_width(2);
jboettcher 5:c73ebb00e86d 164 uLCD.text_height(2);
jboettcher 5:c73ebb00e86d 165 uLCD.printf("%5.0F F \n\r", tempF);
jboettcher 5:c73ebb00e86d 166 uLCD.text_width(1);
jboettcher 5:c73ebb00e86d 167 uLCD.text_height(1);
jboettcher 5:c73ebb00e86d 168 }
jboettcher 5:c73ebb00e86d 169 if (centigrade == 1)
jboettcher 5:c73ebb00e86d 170 {
jboettcher 5:c73ebb00e86d 171 uLCD.text_width(2);
jboettcher 5:c73ebb00e86d 172 uLCD.text_height(2);
jboettcher 5:c73ebb00e86d 173 uLCD.printf("%5.0F C \n\r", tempC);
jboettcher 5:c73ebb00e86d 174 uLCD.text_width(1);
jboettcher 5:c73ebb00e86d 175 uLCD.text_height(1);
jboettcher 5:c73ebb00e86d 176 }
jboettcher 5:c73ebb00e86d 177
jboettcher 5:c73ebb00e86d 178 if (mode == 0)
jboettcher 5:c73ebb00e86d 179 {
jboettcher 5:c73ebb00e86d 180 state = Off;
jboettcher 5:c73ebb00e86d 181 greenpin = 1;
jboettcher 5:c73ebb00e86d 182 redpin = 0;
jboettcher 5:c73ebb00e86d 183 bluepin = 0;
jboettcher 5:c73ebb00e86d 184 }
jboettcher 5:c73ebb00e86d 185 if (mode == 1)
jboettcher 5:c73ebb00e86d 186 {
jboettcher 5:c73ebb00e86d 187 if (tempF > target_temp + 1)
jboettcher 5:c73ebb00e86d 188 {
jboettcher 5:c73ebb00e86d 189 if (Prior_temp < target_temp + 1)
jboettcher 5:c73ebb00e86d 190 {
jboettcher 5:c73ebb00e86d 191 mySpeaker.PlayNote(500.0, 0.025, 1.0);
jboettcher 5:c73ebb00e86d 192 }
jboettcher 5:c73ebb00e86d 193 greenpin = 0;
jboettcher 5:c73ebb00e86d 194 redpin = 0;
jboettcher 5:c73ebb00e86d 195 bluepin = 0;
jboettcher 5:c73ebb00e86d 196 state = Heat_off;
jboettcher 5:c73ebb00e86d 197 }
jboettcher 5:c73ebb00e86d 198 if (tempF < target_temp - 1)
jboettcher 5:c73ebb00e86d 199 {
jboettcher 5:c73ebb00e86d 200 if (Prior_temp > target_temp - 1)
jboettcher 5:c73ebb00e86d 201 {
jboettcher 5:c73ebb00e86d 202 mySpeaker.PlayNote(500.0, 0.025, 1.0);
jboettcher 5:c73ebb00e86d 203 }
jboettcher 5:c73ebb00e86d 204 greenpin = 0;
jboettcher 5:c73ebb00e86d 205 redpin = 1;
jboettcher 5:c73ebb00e86d 206 bluepin = 0;
jboettcher 5:c73ebb00e86d 207 state = Heat_on;
jboettcher 5:c73ebb00e86d 208 }
jboettcher 5:c73ebb00e86d 209 }
jboettcher 5:c73ebb00e86d 210 if (mode == 2)
jboettcher 5:c73ebb00e86d 211 {
jboettcher 5:c73ebb00e86d 212 if (tempF > target_temp + 1)
jboettcher 5:c73ebb00e86d 213 {
jboettcher 5:c73ebb00e86d 214 if (Prior_temp < target_temp + 1)
jboettcher 5:c73ebb00e86d 215 {
jboettcher 5:c73ebb00e86d 216 mySpeaker.PlayNote(1000.0, 0.025, 1.0);
jboettcher 5:c73ebb00e86d 217 }
jboettcher 5:c73ebb00e86d 218 greenpin = 0;
jboettcher 5:c73ebb00e86d 219 redpin = 0;
jboettcher 5:c73ebb00e86d 220 bluepin = 1;
jboettcher 5:c73ebb00e86d 221 state = Cool_on;
jboettcher 5:c73ebb00e86d 222 }
jboettcher 5:c73ebb00e86d 223 if (tempF < target_temp - 1)
jboettcher 5:c73ebb00e86d 224 {
jboettcher 5:c73ebb00e86d 225 if (Prior_temp > target_temp - 1)
jboettcher 5:c73ebb00e86d 226 {
jboettcher 5:c73ebb00e86d 227 mySpeaker.PlayNote(1000.0, 0.025, 1.0);
jboettcher 5:c73ebb00e86d 228 }
jboettcher 5:c73ebb00e86d 229 greenpin = 0;
jboettcher 5:c73ebb00e86d 230 redpin = 0;
jboettcher 5:c73ebb00e86d 231 bluepin = 0;
jboettcher 5:c73ebb00e86d 232 state = Cool_off;
jboettcher 5:c73ebb00e86d 233 }
jboettcher 5:c73ebb00e86d 234 }
jboettcher 5:c73ebb00e86d 235 uLCD.locate(3,5);
jboettcher 5:c73ebb00e86d 236 if (mode == 1) {
jboettcher 5:c73ebb00e86d 237 uLCD.color(RED);
jboettcher 5:c73ebb00e86d 238 uLCD.printf("Heat to: %2d", target_temp);
jboettcher 5:c73ebb00e86d 239 uLCD.color(GREEN);
jboettcher 5:c73ebb00e86d 240 myLED1 = 1;
jboettcher 5:c73ebb00e86d 241 myLED2 = 0; }
jboettcher 5:c73ebb00e86d 242 if (mode == 2) {
jboettcher 5:c73ebb00e86d 243 uLCD.color(LBLUE);
jboettcher 5:c73ebb00e86d 244 uLCD.printf("Cool to: %2d", target_temp);
jboettcher 5:c73ebb00e86d 245 uLCD.color(GREEN);
jboettcher 5:c73ebb00e86d 246 myLED1 = 0;
jboettcher 5:c73ebb00e86d 247 myLED2 = 1; }
jboettcher 5:c73ebb00e86d 248 if (mode == 0) {
jboettcher 5:c73ebb00e86d 249 uLCD.printf(" ", target_temp);
jboettcher 5:c73ebb00e86d 250 myLED1 = 0;
jboettcher 5:c73ebb00e86d 251 myLED2 = 0; }
jboettcher 5:c73ebb00e86d 252
4180_1 2:58d85409f7ff 253 switch (state) {
4180_1 2:58d85409f7ff 254 case Heat_off:
jboettcher 5:c73ebb00e86d 255 myLED3 = 0;
4180_1 3:346ef671ef28 256 myLED4 = 0;
jboettcher 5:c73ebb00e86d 257 //state = Heat_on;
jboettcher 5:c73ebb00e86d 258 uLCD.locate(3,4);
jboettcher 5:c73ebb00e86d 259 uLCD.printf("Heat Off");
4180_1 2:58d85409f7ff 260 break;
4180_1 2:58d85409f7ff 261 case Heat_on:
jboettcher 5:c73ebb00e86d 262 myLED3 = 0;
4180_1 3:346ef671ef28 263 myLED4 = 1;
jboettcher 5:c73ebb00e86d 264 //state = Heat_off;
jboettcher 5:c73ebb00e86d 265 uLCD.locate(3,4);
jboettcher 5:c73ebb00e86d 266 uLCD.color(RED);
jboettcher 5:c73ebb00e86d 267 uLCD.printf("Heat On ");
jboettcher 5:c73ebb00e86d 268 uLCD.color(GREEN);
jboettcher 5:c73ebb00e86d 269 break;
jboettcher 5:c73ebb00e86d 270 case Cool_off:
jboettcher 5:c73ebb00e86d 271 myLED3 = 0;
jboettcher 5:c73ebb00e86d 272 myLED4 = 0;
jboettcher 5:c73ebb00e86d 273 //state = Cool_on;
jboettcher 5:c73ebb00e86d 274 uLCD.locate(3,4);
jboettcher 5:c73ebb00e86d 275 uLCD.printf("Cool Off");
jboettcher 5:c73ebb00e86d 276 break;
jboettcher 5:c73ebb00e86d 277 case Cool_on:
jboettcher 5:c73ebb00e86d 278 myLED3 = 1;
jboettcher 5:c73ebb00e86d 279 myLED4 = 0;
jboettcher 5:c73ebb00e86d 280 //state = Cool_off;
jboettcher 5:c73ebb00e86d 281 uLCD.locate(3,4);
jboettcher 5:c73ebb00e86d 282 uLCD.color(LBLUE);
jboettcher 5:c73ebb00e86d 283 uLCD.printf("Cool On ");
jboettcher 5:c73ebb00e86d 284 uLCD.color(GREEN);
jboettcher 5:c73ebb00e86d 285 break;
jboettcher 5:c73ebb00e86d 286 case Off:
jboettcher 5:c73ebb00e86d 287 myLED4 = 0;
jboettcher 5:c73ebb00e86d 288 uLCD.locate(3,4);
jboettcher 5:c73ebb00e86d 289 uLCD.printf(" ");
4180_1 2:58d85409f7ff 290 break;
4180_1 2:58d85409f7ff 291 }
jboettcher 5:c73ebb00e86d 292
4180_1 2:58d85409f7ff 293 wait(0.33);
4180_1 2:58d85409f7ff 294 }
4180_1 0:cc87c48aa43c 295 }
4180_1 0:cc87c48aa43c 296 }