complete

Dependencies:   4DGL-uLCD-SE_ PinDetect SDFileSystem mbed

Fork of mythermostat by jim hamblen

Committer:
jboettcher
Date:
Tue Sep 06 21:36:17 2016 +0000
Revision:
5:c73ebb00e86d
Parent:
4:9a4d22a279b3
Child:
6:5ba4232c5e1c
testt

Who changed what in which revision?

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