legionella detector

Dependencies:   mbed

Committer:
lewiscameron
Date:
Tue Aug 23 18:12:01 2022 +0000
Revision:
5:2d1d347847a6
Parent:
4:b82f09e597ec
Child:
6:4e8b0d2bbe85
final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lewiscameron 4:b82f09e597ec 1 /**
lewiscameron 4:b82f09e597ec 2 IOT Coursework Project
lewiscameron 4:b82f09e597ec 3 Lewis Cameron
lewiscameron 0:089b4c4f2b6f 4
lewiscameron 4:b82f09e597ec 5 Water Temperature Legionella Detector With Custom Setpoint
lewiscameron 4:b82f09e597ec 6
lewiscameron 4:b82f09e597ec 7 Acknowledgements to Dr. Edmond Nurellari, University of Lincoln, for example codes and libraries
lewiscameron 4:b82f09e597ec 8 Acknowledgements to Craig A. Evans, University of Leeds, for libraries
lewiscameron 4:b82f09e597ec 9
lewiscameron 4:b82f09e597ec 10 Date 23/08/2022
lewiscameron 4:b82f09e597ec 11
lewiscameron 4:b82f09e597ec 12 */
lewiscameron 4:b82f09e597ec 13 // importing the libraries to be used within the code
lewiscameron 0:089b4c4f2b6f 14 #include "mbed.h"
lewiscameron 0:089b4c4f2b6f 15 #include "TMP102.h"
lewiscameron 0:089b4c4f2b6f 16 #include "N5110.h"
lewiscameron 0:089b4c4f2b6f 17 #include "Joystick.h"
lewiscameron 0:089b4c4f2b6f 18 #include "Bitmap.h"
lewiscameron 0:089b4c4f2b6f 19
lewiscameron 4:b82f09e597ec 20 //Defining PCB Buttons as Interrupts
lewiscameron 0:089b4c4f2b6f 21 InterruptIn button_back(PTB19);
lewiscameron 0:089b4c4f2b6f 22 InterruptIn button_start(PTC5);
lewiscameron 0:089b4c4f2b6f 23 InterruptIn button_a(PTB9);
lewiscameron 0:089b4c4f2b6f 24 InterruptIn button_b(PTD0);
lewiscameron 0:089b4c4f2b6f 25 InterruptIn button_x(PTC17);
lewiscameron 0:089b4c4f2b6f 26 InterruptIn button_y(PTC12);
lewiscameron 0:089b4c4f2b6f 27 InterruptIn button_left(PTB18);
lewiscameron 0:089b4c4f2b6f 28 InterruptIn button_right(PTB3);
lewiscameron 5:2d1d347847a6 29 InterruptIn sw2(SW2);
lewiscameron 5:2d1d347847a6 30 InterruptIn sw3(SW3);
lewiscameron 0:089b4c4f2b6f 31
lewiscameron 4:b82f09e597ec 32 //Defining the PCB Led's as PWM Outputs
lewiscameron 0:089b4c4f2b6f 33 PwmOut led_red1(PTA1);
lewiscameron 0:089b4c4f2b6f 34 PwmOut led_red2(PTA2);
lewiscameron 0:089b4c4f2b6f 35 PwmOut led_red3(PTC2);
lewiscameron 0:089b4c4f2b6f 36 PwmOut led_green1(PTC3);
lewiscameron 0:089b4c4f2b6f 37 PwmOut led_green2(PTC4);
lewiscameron 0:089b4c4f2b6f 38 PwmOut led_green3(PTD3);
lewiscameron 5:2d1d347847a6 39 DigitalOut boardled_red(LED_RED);
lewiscameron 5:2d1d347847a6 40 DigitalOut boardled_green(LED_GREEN);
lewiscameron 5:2d1d347847a6 41 DigitalOut boardled_blue(LED_BLUE);
lewiscameron 0:089b4c4f2b6f 42
lewiscameron 4:b82f09e597ec 43 // Defining the Joystick, LCD & TMP102 on their respective pins
lewiscameron 0:089b4c4f2b6f 44 Joystick Joystick(PTB10,PTB11,PTB16);
lewiscameron 0:089b4c4f2b6f 45 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
lewiscameron 0:089b4c4f2b6f 46 TMP102 tmp(I2C_SDA,I2C_SCL);
lewiscameron 0:089b4c4f2b6f 47
lewiscameron 4:b82f09e597ec 48 //Defined the piezo as a PWM Output although it has not been used in the code
lewiscameron 0:089b4c4f2b6f 49 PwmOut piezo(PTC10);
lewiscameron 0:089b4c4f2b6f 50
lewiscameron 4:b82f09e597ec 51 //Creating the serial connection to the PC to enable the use of coolterm
lewiscameron 0:089b4c4f2b6f 52 Serial pc(USBTX,USBRX);
lewiscameron 0:089b4c4f2b6f 53
lewiscameron 4:b82f09e597ec 54 // Setting up the variables that will be used throughout the code in functions
lewiscameron 4:b82f09e597ec 55 volatile int button_a_flag = 0; //PCB A Button
lewiscameron 4:b82f09e597ec 56 volatile int button_b_flag = 0; //PCB B Button
lewiscameron 4:b82f09e597ec 57 volatile int button_x_flag = 0; //PCB X Button
lewiscameron 4:b82f09e597ec 58 volatile int button_y_flag = 0; //PCB Y Button
lewiscameron 4:b82f09e597ec 59 volatile int button_left_flag = 0; //PCB Left Button
lewiscameron 4:b82f09e597ec 60 volatile int button_right_flag = 0; //PCB Right Button
lewiscameron 4:b82f09e597ec 61 volatile int button_back_flag = 0; //PCB Back Button
lewiscameron 4:b82f09e597ec 62 volatile int button_start_flag = 0; //PCB Start Button
lewiscameron 4:b82f09e597ec 63 volatile int CwsHiSP = 20; //CWS Water High Limit Temperature Setpoint
lewiscameron 4:b82f09e597ec 64 volatile int HwsKaSP = 70; //HWS Water Temp which kills all legionella
lewiscameron 4:b82f09e597ec 65 volatile int HwsLoLimSP = 50; //HWS water low limit temperature setpoint
lewiscameron 4:b82f09e597ec 66 volatile int CustomLoSP = 10; //Custom low limit temperature setpoint which can be changed using the joystick
lewiscameron 4:b82f09e597ec 67 volatile int CustomHiSP = 20; //Custom high limit temperature setpoint which can be changed using left & right
lewiscameron 0:089b4c4f2b6f 68
lewiscameron 0:089b4c4f2b6f 69 // voids
lewiscameron 0:089b4c4f2b6f 70 // functions that will be used in the code
lewiscameron 4:b82f09e597ec 71 void init_serial(); // sets up serial baud rate
lewiscameron 0:089b4c4f2b6f 72 void init_K64F(); // sets up K64F
lewiscameron 0:089b4c4f2b6f 73 void init_pcb(); // sets up the pcb
lewiscameron 0:089b4c4f2b6f 74
lewiscameron 0:089b4c4f2b6f 75 // button voids
lewiscameron 1:87661a0c8ba3 76 void button_a_isr();
lewiscameron 1:87661a0c8ba3 77 void button_b_isr();
lewiscameron 1:87661a0c8ba3 78 void button_x_isr();
lewiscameron 1:87661a0c8ba3 79 void button_y_isr();
lewiscameron 1:87661a0c8ba3 80 void button_left_isr();
lewiscameron 1:87661a0c8ba3 81 void button_right_isr();
lewiscameron 1:87661a0c8ba3 82 void button_back_isr();
lewiscameron 1:87661a0c8ba3 83 void button_start_isr();
lewiscameron 0:089b4c4f2b6f 84
lewiscameron 4:b82f09e597ec 85 // void functions that will be called upon throughout the code
lewiscameron 4:b82f09e597ec 86 void startup(); //startup function
lewiscameron 4:b82f09e597ec 87 void cwshigh(); //CWS high temperature function
lewiscameron 4:b82f09e597ec 88 void codeloop(); //main loop function
lewiscameron 4:b82f09e597ec 89 void get_temp(); //temperature display function
lewiscameron 4:b82f09e597ec 90 void CustHi_SP(); //function for changine the custom high limit SP
lewiscameron 4:b82f09e597ec 91 void CustLo_SP(); //function for changine the custom low limit SP
lewiscameron 4:b82f09e597ec 92 void ShowSP(); //function to show the custom SP's on screen when they after they are changed
lewiscameron 3:eaa6fbb8fd87 93
lewiscameron 3:eaa6fbb8fd87 94 //State structure
lewiscameron 3:eaa6fbb8fd87 95 struct State {
lewiscameron 3:eaa6fbb8fd87 96 //Output Setpoint
lewiscameron 3:eaa6fbb8fd87 97 int output;
lewiscameron 3:eaa6fbb8fd87 98 //Time delay while in state
lewiscameron 3:eaa6fbb8fd87 99 float time;
lewiscameron 3:eaa6fbb8fd87 100 //Next states array and length
lewiscameron 3:eaa6fbb8fd87 101 int nextState[9];
lewiscameron 3:eaa6fbb8fd87 102 };
lewiscameron 0:089b4c4f2b6f 103
lewiscameron 0:089b4c4f2b6f 104
lewiscameron 4:b82f09e597ec 105 //Main Function
lewiscameron 0:089b4c4f2b6f 106
lewiscameron 0:089b4c4f2b6f 107 int main() {
lewiscameron 0:089b4c4f2b6f 108
lewiscameron 0:089b4c4f2b6f 109 // interrupts setup
lewiscameron 1:87661a0c8ba3 110 button_a.rise(&button_a_isr);
lewiscameron 1:87661a0c8ba3 111 button_b.rise(&button_b_isr);
lewiscameron 1:87661a0c8ba3 112 button_x.rise(&button_x_isr);
lewiscameron 1:87661a0c8ba3 113 button_y.rise(&button_y_isr);
lewiscameron 1:87661a0c8ba3 114 button_left.rise(&button_left_isr);
lewiscameron 1:87661a0c8ba3 115 button_right.rise(&button_right_isr);
lewiscameron 1:87661a0c8ba3 116 button_back.rise(&button_back_isr);
lewiscameron 1:87661a0c8ba3 117 button_start.rise(&button_start_isr);
lewiscameron 0:089b4c4f2b6f 118
lewiscameron 0:089b4c4f2b6f 119
lewiscameron 0:089b4c4f2b6f 120
lewiscameron 0:089b4c4f2b6f 121 init_serial();
lewiscameron 0:089b4c4f2b6f 122 init_K64F();
lewiscameron 0:089b4c4f2b6f 123 init_pcb();
lewiscameron 0:089b4c4f2b6f 124 tmp.init();
lewiscameron 0:089b4c4f2b6f 125 lcd.init();
lewiscameron 0:089b4c4f2b6f 126 Joystick.init();
lewiscameron 4:b82f09e597ec 127 //pc.printf("hardware initialised");
lewiscameron 0:089b4c4f2b6f 128
lewiscameron 3:eaa6fbb8fd87 129 lcd.setContrast(1);
lewiscameron 0:089b4c4f2b6f 130 lcd.setBrightness(0.5);
lewiscameron 0:089b4c4f2b6f 131
lewiscameron 0:089b4c4f2b6f 132 startup();
lewiscameron 0:089b4c4f2b6f 133
lewiscameron 0:089b4c4f2b6f 134 codeloop();
lewiscameron 0:089b4c4f2b6f 135
lewiscameron 0:089b4c4f2b6f 136
lewiscameron 0:089b4c4f2b6f 137
lewiscameron 0:089b4c4f2b6f 138 }
lewiscameron 0:089b4c4f2b6f 139
lewiscameron 0:089b4c4f2b6f 140 // initialise serial connection
lewiscameron 0:089b4c4f2b6f 141 void init_serial()
lewiscameron 0:089b4c4f2b6f 142 {
lewiscameron 0:089b4c4f2b6f 143 pc.baud(9600);
lewiscameron 0:089b4c4f2b6f 144 }
lewiscameron 0:089b4c4f2b6f 145
lewiscameron 0:089b4c4f2b6f 146 void init_K64F()
lewiscameron 0:089b4c4f2b6f 147 {
lewiscameron 0:089b4c4f2b6f 148 boardled_red = 1;
lewiscameron 0:089b4c4f2b6f 149 boardled_green = 1;
lewiscameron 0:089b4c4f2b6f 150 boardled_blue = 1;
lewiscameron 0:089b4c4f2b6f 151
lewiscameron 0:089b4c4f2b6f 152 sw2.mode(PullNone);
lewiscameron 0:089b4c4f2b6f 153 sw3.mode(PullNone);
lewiscameron 0:089b4c4f2b6f 154 }
lewiscameron 0:089b4c4f2b6f 155
lewiscameron 0:089b4c4f2b6f 156 void init_pcb()
lewiscameron 0:089b4c4f2b6f 157 {
lewiscameron 0:089b4c4f2b6f 158
lewiscameron 0:089b4c4f2b6f 159 led_red1 = 1;
lewiscameron 0:089b4c4f2b6f 160 led_red2 = 1;
lewiscameron 0:089b4c4f2b6f 161 led_red3 = 1;
lewiscameron 0:089b4c4f2b6f 162 led_green1 = 1;
lewiscameron 0:089b4c4f2b6f 163 led_green2 = 1;
lewiscameron 0:089b4c4f2b6f 164 led_green3 = 1;
lewiscameron 4:b82f09e597ec 165 // disables PCB LED's active low LED's so off when = 1
lewiscameron 0:089b4c4f2b6f 166
lewiscameron 0:089b4c4f2b6f 167 // sets up the PCB Buttons
lewiscameron 0:089b4c4f2b6f 168 button_a.mode(PullDown);
lewiscameron 0:089b4c4f2b6f 169 button_b.mode(PullDown);
lewiscameron 0:089b4c4f2b6f 170 button_x.mode(PullDown);
lewiscameron 0:089b4c4f2b6f 171 button_y.mode(PullDown);
lewiscameron 0:089b4c4f2b6f 172 button_left.mode(PullDown);
lewiscameron 0:089b4c4f2b6f 173 button_right.mode(PullDown);
lewiscameron 0:089b4c4f2b6f 174 button_start.mode(PullDown);
lewiscameron 0:089b4c4f2b6f 175 button_back.mode(PullDown);
lewiscameron 0:089b4c4f2b6f 176 }
lewiscameron 0:089b4c4f2b6f 177
lewiscameron 4:b82f09e597ec 178 void startup() // startup page
lewiscameron 0:089b4c4f2b6f 179 {
lewiscameron 0:089b4c4f2b6f 180 lcd.printString("Lewis Cameron",0,0);
lewiscameron 0:089b4c4f2b6f 181 lcd.printString("18689002",0,1);
lewiscameron 3:eaa6fbb8fd87 182 lcd.printString("Legionella",0,2);
lewiscameron 3:eaa6fbb8fd87 183 lcd.printString("Sensor",0,3);
lewiscameron 3:eaa6fbb8fd87 184 lcd.printString("w/ Custom SP",0,4);
lewiscameron 4:b82f09e597ec 185 //pc.printf("startup");
lewiscameron 0:089b4c4f2b6f 186 lcd.refresh();
lewiscameron 0:089b4c4f2b6f 187 wait(5);
lewiscameron 0:089b4c4f2b6f 188 }
lewiscameron 0:089b4c4f2b6f 189
lewiscameron 4:b82f09e597ec 190 void codeloop() // main loop
lewiscameron 0:089b4c4f2b6f 191 {
lewiscameron 0:089b4c4f2b6f 192 int page;
lewiscameron 0:089b4c4f2b6f 193
lewiscameron 0:089b4c4f2b6f 194 while(1){
lewiscameron 0:089b4c4f2b6f 195 lcd.clear();
lewiscameron 0:089b4c4f2b6f 196
lewiscameron 0:089b4c4f2b6f 197 switch(page){
lewiscameron 0:089b4c4f2b6f 198
lewiscameron 4:b82f09e597ec 199 case 1: // CWS Page
lewiscameron 0:089b4c4f2b6f 200 {
lewiscameron 0:089b4c4f2b6f 201
lewiscameron 0:089b4c4f2b6f 202 init_pcb();
lewiscameron 0:089b4c4f2b6f 203
lewiscameron 0:089b4c4f2b6f 204 float temp = tmp.get_temperature();
lewiscameron 0:089b4c4f2b6f 205
lewiscameron 0:089b4c4f2b6f 206
lewiscameron 0:089b4c4f2b6f 207 lcd.clear();
lewiscameron 3:eaa6fbb8fd87 208 lcd.printString("CWS",30,0);
lewiscameron 3:eaa6fbb8fd87 209 lcd.printString("Temp =",0,1);
lewiscameron 4:b82f09e597ec 210 get_temp(); // function to show the temperature on screen
lewiscameron 3:eaa6fbb8fd87 211 lcd.printString("Back = Home",0,5);
lewiscameron 4:b82f09e597ec 212 //pc.printf("CWS");
lewiscameron 0:089b4c4f2b6f 213
lewiscameron 4:b82f09e597ec 214 if (temp >= CwsHiSP){ // High temperature Alarm Warning appears on screen
lewiscameron 3:eaa6fbb8fd87 215 lcd.printString("CWS Temp High",0,2);
lewiscameron 3:eaa6fbb8fd87 216 lcd.printString("Legionella",0,3);
lewiscameron 3:eaa6fbb8fd87 217 lcd.printString("Warning",0,4);
lewiscameron 0:089b4c4f2b6f 218 led_red1 = 0;
lewiscameron 4:b82f09e597ec 219 //pc.printf("CWS High Temp");
lewiscameron 0:089b4c4f2b6f 220 }
lewiscameron 0:089b4c4f2b6f 221
lewiscameron 4:b82f09e597ec 222 else if (temp < CwsHiSP){ // Temperature at safe levels so message appears on screen
lewiscameron 3:eaa6fbb8fd87 223 lcd.printString("Temp OK",0,2);
lewiscameron 3:eaa6fbb8fd87 224 lcd.printString("No Danger",0,3);
lewiscameron 3:eaa6fbb8fd87 225 lcd.printString("Of Legionella",0,4);
lewiscameron 0:089b4c4f2b6f 226 led_red1 = 1;
lewiscameron 4:b82f09e597ec 227 //pc.printf("CWS Temp OK");
lewiscameron 0:089b4c4f2b6f 228 }
lewiscameron 0:089b4c4f2b6f 229
lewiscameron 0:089b4c4f2b6f 230 if (button_back_flag) {
lewiscameron 0:089b4c4f2b6f 231 button_back_flag = 0;
lewiscameron 0:089b4c4f2b6f 232 page = 0;
lewiscameron 0:089b4c4f2b6f 233 }
lewiscameron 3:eaa6fbb8fd87 234 lcd.refresh();
lewiscameron 0:089b4c4f2b6f 235 }
lewiscameron 0:089b4c4f2b6f 236 break;
lewiscameron 0:089b4c4f2b6f 237
lewiscameron 0:089b4c4f2b6f 238 case 2:
lewiscameron 0:089b4c4f2b6f 239 {
lewiscameron 0:089b4c4f2b6f 240
lewiscameron 0:089b4c4f2b6f 241 init_pcb();
lewiscameron 0:089b4c4f2b6f 242 float temp = tmp.get_temperature();
lewiscameron 0:089b4c4f2b6f 243
lewiscameron 0:089b4c4f2b6f 244 lcd.clear();
lewiscameron 3:eaa6fbb8fd87 245 lcd.printString("HWS",30,0);
lewiscameron 3:eaa6fbb8fd87 246 lcd.printString("Temp =",0,1);
lewiscameron 0:089b4c4f2b6f 247 get_temp();
lewiscameron 3:eaa6fbb8fd87 248 lcd.printString("Back = Home",0,5);
lewiscameron 0:089b4c4f2b6f 249
lewiscameron 4:b82f09e597ec 250 if (HwsLoLimSP < temp & temp < HwsKaSP){ // Temperature between 50-70 degrees which will start killing legionella
lewiscameron 3:eaa6fbb8fd87 251 lcd.printString("Temp Raised",0,2);
lewiscameron 3:eaa6fbb8fd87 252 lcd.printString("Killing",0,3);
lewiscameron 3:eaa6fbb8fd87 253 lcd.printString("Legionella",0,4);
lewiscameron 0:089b4c4f2b6f 254 led_green1 = 0;
lewiscameron 4:b82f09e597ec 255 //pc.printf("Temp killing legionella");
lewiscameron 0:089b4c4f2b6f 256 }
lewiscameron 0:089b4c4f2b6f 257
lewiscameron 4:b82f09e597ec 258 else if (temp >= HwsKaSP){ // Temperature above 70 degrees killing all legionella
lewiscameron 3:eaa6fbb8fd87 259 lcd.printString("Temp Raised",0,2);
lewiscameron 3:eaa6fbb8fd87 260 lcd.printString("No Danger",0,3);
lewiscameron 3:eaa6fbb8fd87 261 lcd.printString("Of Legionella",0,4);
lewiscameron 0:089b4c4f2b6f 262 led_green1 = 0;
lewiscameron 0:089b4c4f2b6f 263 led_green2 = 0;
lewiscameron 4:b82f09e597ec 264 //pc.printf("Temp killed all legionella");
lewiscameron 0:089b4c4f2b6f 265 }
lewiscameron 0:089b4c4f2b6f 266
lewiscameron 4:b82f09e597ec 267 else if (temp < HwsLoLimSP){ // Temperature below 50 degrees allowing for legionella to live
lewiscameron 3:eaa6fbb8fd87 268 lcd.printString("Temp Low",0,2);
lewiscameron 3:eaa6fbb8fd87 269 lcd.printString("Legionella",0,3);
lewiscameron 3:eaa6fbb8fd87 270 lcd.printString("Warning",0,4);
lewiscameron 0:089b4c4f2b6f 271 led_red1 = 0;
lewiscameron 4:b82f09e597ec 272 //pc.printf("Temp too low legionella warning");
lewiscameron 0:089b4c4f2b6f 273 }
lewiscameron 0:089b4c4f2b6f 274
lewiscameron 0:089b4c4f2b6f 275 if (button_back_flag) {
lewiscameron 0:089b4c4f2b6f 276 button_back_flag = 0;
lewiscameron 0:089b4c4f2b6f 277 page = 0;
lewiscameron 0:089b4c4f2b6f 278 }
lewiscameron 0:089b4c4f2b6f 279
lewiscameron 3:eaa6fbb8fd87 280 lcd.refresh();
lewiscameron 3:eaa6fbb8fd87 281
lewiscameron 0:089b4c4f2b6f 282 }
lewiscameron 0:089b4c4f2b6f 283
lewiscameron 0:089b4c4f2b6f 284
lewiscameron 0:089b4c4f2b6f 285
lewiscameron 0:089b4c4f2b6f 286 break;
lewiscameron 0:089b4c4f2b6f 287
lewiscameron 0:089b4c4f2b6f 288 case 3:
lewiscameron 0:089b4c4f2b6f 289 {
lewiscameron 0:089b4c4f2b6f 290
lewiscameron 0:089b4c4f2b6f 291 init_pcb();
lewiscameron 3:eaa6fbb8fd87 292 float temp = tmp.get_temperature();
lewiscameron 3:eaa6fbb8fd87 293
lewiscameron 0:089b4c4f2b6f 294 lcd.clear();
lewiscameron 0:089b4c4f2b6f 295
lewiscameron 3:eaa6fbb8fd87 296 lcd.printString("Custom SP",15,0);
lewiscameron 3:eaa6fbb8fd87 297 lcd.printString("Temp =",0,1);
lewiscameron 0:089b4c4f2b6f 298 get_temp();
lewiscameron 4:b82f09e597ec 299 CustHi_SP(); // function to change high limit setpoint
lewiscameron 4:b82f09e597ec 300 CustLo_SP(); // function to change low limit setpoint
lewiscameron 4:b82f09e597ec 301 ShowSP(); // function to show both setpoints and change them on screen
lewiscameron 3:eaa6fbb8fd87 302 lcd.printString("Back = Home",0,5);
lewiscameron 3:eaa6fbb8fd87 303
lewiscameron 3:eaa6fbb8fd87 304 if (CustomLoSP < temp & temp < CustomHiSP){
lewiscameron 3:eaa6fbb8fd87 305 lcd.printString("Temp In Range",0,4);
lewiscameron 3:eaa6fbb8fd87 306 led_green1 = 0;
lewiscameron 4:b82f09e597ec 307 //pc.printf("Temp in custom range");
lewiscameron 3:eaa6fbb8fd87 308 }
lewiscameron 3:eaa6fbb8fd87 309
lewiscameron 3:eaa6fbb8fd87 310 else if (temp > CustomHiSP){
lewiscameron 3:eaa6fbb8fd87 311 lcd.printString("High Temp",0,4);
lewiscameron 3:eaa6fbb8fd87 312 led_red1 = 0;
lewiscameron 4:b82f09e597ec 313 //pc.printf("Custom temp high limit");
lewiscameron 3:eaa6fbb8fd87 314 }
lewiscameron 3:eaa6fbb8fd87 315
lewiscameron 3:eaa6fbb8fd87 316 else if (temp < CustomLoSP){
lewiscameron 3:eaa6fbb8fd87 317 lcd.printString("Low Temp",0,4);
lewiscameron 3:eaa6fbb8fd87 318 led_red2 = 0;
lewiscameron 4:b82f09e597ec 319 //pc.printf("Custom temp low limit");
lewiscameron 3:eaa6fbb8fd87 320 }
lewiscameron 0:089b4c4f2b6f 321
lewiscameron 0:089b4c4f2b6f 322 if (button_back_flag) {
lewiscameron 0:089b4c4f2b6f 323 button_back_flag = 0;
lewiscameron 0:089b4c4f2b6f 324 page = 0;
lewiscameron 0:089b4c4f2b6f 325 }
lewiscameron 3:eaa6fbb8fd87 326 lcd.refresh();
lewiscameron 0:089b4c4f2b6f 327
lewiscameron 0:089b4c4f2b6f 328 }
lewiscameron 0:089b4c4f2b6f 329
lewiscameron 0:089b4c4f2b6f 330 break;
lewiscameron 0:089b4c4f2b6f 331
lewiscameron 0:089b4c4f2b6f 332 case 4:
lewiscameron 0:089b4c4f2b6f 333 {
lewiscameron 0:089b4c4f2b6f 334 init_pcb();
lewiscameron 0:089b4c4f2b6f 335 lcd.clear();
lewiscameron 3:eaa6fbb8fd87 336 lcd.printString("Info",26,0);
lewiscameron 3:eaa6fbb8fd87 337 lcd.printString("Legionella",0,1);
lewiscameron 3:eaa6fbb8fd87 338 lcd.printString("Detector",0,2);
lewiscameron 3:eaa6fbb8fd87 339 lcd.printString("Lewis Cameron",0,3);
lewiscameron 3:eaa6fbb8fd87 340 lcd.printString("18689002",0,4);
lewiscameron 3:eaa6fbb8fd87 341 lcd.printString("Back = Home",0,5);
lewiscameron 3:eaa6fbb8fd87 342 lcd.refresh();
lewiscameron 4:b82f09e597ec 343 //pc.printf("Info page");
lewiscameron 0:089b4c4f2b6f 344
lewiscameron 0:089b4c4f2b6f 345 if (button_back_flag) {
lewiscameron 0:089b4c4f2b6f 346 button_back_flag = 0;
lewiscameron 0:089b4c4f2b6f 347 page = 0;
lewiscameron 0:089b4c4f2b6f 348 }
lewiscameron 0:089b4c4f2b6f 349
lewiscameron 0:089b4c4f2b6f 350 }
lewiscameron 0:089b4c4f2b6f 351
lewiscameron 0:089b4c4f2b6f 352
lewiscameron 0:089b4c4f2b6f 353
lewiscameron 0:089b4c4f2b6f 354 break;
lewiscameron 0:089b4c4f2b6f 355 {
lewiscameron 0:089b4c4f2b6f 356 default:
lewiscameron 0:089b4c4f2b6f 357 init_pcb();
lewiscameron 0:089b4c4f2b6f 358 lcd.clear();
lewiscameron 0:089b4c4f2b6f 359
lewiscameron 3:eaa6fbb8fd87 360 lcd.printString("Main Menu",15,0);
lewiscameron 0:089b4c4f2b6f 361 lcd.printString("A = Cold Water",0,1);
lewiscameron 0:089b4c4f2b6f 362 lcd.printString("B = Hot Water",0,2);
lewiscameron 0:089b4c4f2b6f 363 lcd.printString("X = Custom SP",0,3);
lewiscameron 0:089b4c4f2b6f 364 lcd.printString("Y = Info",0,4);
lewiscameron 0:089b4c4f2b6f 365 lcd.refresh();
lewiscameron 0:089b4c4f2b6f 366
lewiscameron 0:089b4c4f2b6f 367 if (button_a_flag) {
lewiscameron 0:089b4c4f2b6f 368 button_a_flag = 0;
lewiscameron 0:089b4c4f2b6f 369 page = 1;
lewiscameron 4:b82f09e597ec 370 //pc.printf("A Pressed");
lewiscameron 0:089b4c4f2b6f 371 }
lewiscameron 0:089b4c4f2b6f 372
lewiscameron 0:089b4c4f2b6f 373 if (button_b_flag) {
lewiscameron 0:089b4c4f2b6f 374 button_b_flag = 0;
lewiscameron 0:089b4c4f2b6f 375 page = 2;
lewiscameron 4:b82f09e597ec 376 //pc.printf("B Pressed");
lewiscameron 0:089b4c4f2b6f 377 }
lewiscameron 0:089b4c4f2b6f 378
lewiscameron 0:089b4c4f2b6f 379 if (button_x_flag) {
lewiscameron 0:089b4c4f2b6f 380 button_x_flag = 0;
lewiscameron 0:089b4c4f2b6f 381 page = 3;
lewiscameron 4:b82f09e597ec 382 //pc.printf("X Pressed");
lewiscameron 0:089b4c4f2b6f 383 }
lewiscameron 0:089b4c4f2b6f 384
lewiscameron 0:089b4c4f2b6f 385 if (button_y_flag) {
lewiscameron 0:089b4c4f2b6f 386 button_y_flag = 0;
lewiscameron 0:089b4c4f2b6f 387 page = 4;
lewiscameron 4:b82f09e597ec 388 //pc.printf("Y Pressed");
lewiscameron 0:089b4c4f2b6f 389 }
lewiscameron 0:089b4c4f2b6f 390
lewiscameron 0:089b4c4f2b6f 391 }
lewiscameron 0:089b4c4f2b6f 392 }
lewiscameron 1:87661a0c8ba3 393
lewiscameron 0:089b4c4f2b6f 394 }
lewiscameron 1:87661a0c8ba3 395 }
lewiscameron 1:87661a0c8ba3 396
lewiscameron 1:87661a0c8ba3 397
lewiscameron 0:089b4c4f2b6f 398
lewiscameron 1:87661a0c8ba3 399 void button_a_isr()
lewiscameron 0:089b4c4f2b6f 400 {
lewiscameron 0:089b4c4f2b6f 401 button_a_flag = 1;
lewiscameron 0:089b4c4f2b6f 402 }
lewiscameron 0:089b4c4f2b6f 403
lewiscameron 1:87661a0c8ba3 404 void button_b_isr()
lewiscameron 0:089b4c4f2b6f 405 {
lewiscameron 0:089b4c4f2b6f 406 button_b_flag = 1;
lewiscameron 0:089b4c4f2b6f 407 }
lewiscameron 0:089b4c4f2b6f 408
lewiscameron 1:87661a0c8ba3 409 void button_x_isr()
lewiscameron 0:089b4c4f2b6f 410 {
lewiscameron 0:089b4c4f2b6f 411 button_x_flag = 1;
lewiscameron 0:089b4c4f2b6f 412 }
lewiscameron 0:089b4c4f2b6f 413
lewiscameron 1:87661a0c8ba3 414 void button_y_isr()
lewiscameron 0:089b4c4f2b6f 415 {
lewiscameron 0:089b4c4f2b6f 416 button_y_flag = 1;
lewiscameron 0:089b4c4f2b6f 417 }
lewiscameron 0:089b4c4f2b6f 418
lewiscameron 1:87661a0c8ba3 419 void button_left_isr()
lewiscameron 0:089b4c4f2b6f 420 {
lewiscameron 0:089b4c4f2b6f 421 button_left_flag = 1;
lewiscameron 0:089b4c4f2b6f 422 }
lewiscameron 0:089b4c4f2b6f 423
lewiscameron 1:87661a0c8ba3 424 void button_right_isr()
lewiscameron 0:089b4c4f2b6f 425 {
lewiscameron 0:089b4c4f2b6f 426 button_right_flag = 1;
lewiscameron 0:089b4c4f2b6f 427 }
lewiscameron 0:089b4c4f2b6f 428
lewiscameron 1:87661a0c8ba3 429 void button_back_isr()
lewiscameron 0:089b4c4f2b6f 430 {
lewiscameron 0:089b4c4f2b6f 431 button_back_flag = 1;
lewiscameron 0:089b4c4f2b6f 432 }
lewiscameron 0:089b4c4f2b6f 433
lewiscameron 0:089b4c4f2b6f 434
lewiscameron 1:87661a0c8ba3 435 void button_start_isr()
lewiscameron 0:089b4c4f2b6f 436 {
lewiscameron 0:089b4c4f2b6f 437 button_start_flag = 1;
lewiscameron 0:089b4c4f2b6f 438 }
lewiscameron 0:089b4c4f2b6f 439
lewiscameron 1:87661a0c8ba3 440 void cwshigh()
lewiscameron 0:089b4c4f2b6f 441 {
lewiscameron 0:089b4c4f2b6f 442 lcd.printString("Water Temp Too High",0,3);
lewiscameron 0:089b4c4f2b6f 443 led_red1 = 0;
lewiscameron 0:089b4c4f2b6f 444 }
lewiscameron 0:089b4c4f2b6f 445
lewiscameron 1:87661a0c8ba3 446 void get_temp()
lewiscameron 0:089b4c4f2b6f 447 {
lewiscameron 0:089b4c4f2b6f 448 char buffer[14];
lewiscameron 0:089b4c4f2b6f 449 float temp = tmp.get_temperature();
lewiscameron 0:089b4c4f2b6f 450 int length = sprintf(buffer,"%.2f C",temp);
lewiscameron 0:089b4c4f2b6f 451 //pc.printf("temp = %f K\n",temp);
lewiscameron 0:089b4c4f2b6f 452 if (length <=14)
lewiscameron 3:eaa6fbb8fd87 453 lcd.printString(buffer,38,1);
lewiscameron 0:089b4c4f2b6f 454
lewiscameron 0:089b4c4f2b6f 455 }
lewiscameron 0:089b4c4f2b6f 456
lewiscameron 1:87661a0c8ba3 457 void CustHi_SP()
lewiscameron 0:089b4c4f2b6f 458 {
lewiscameron 4:b82f09e597ec 459 Direction d = Joystick.get_direction(); //gets the direction the joystick is pushed
lewiscameron 0:089b4c4f2b6f 460
lewiscameron 0:089b4c4f2b6f 461
lewiscameron 4:b82f09e597ec 462 if (d == W) { // decreases the setpoint when it is pushed left
lewiscameron 4:b82f09e597ec 463 //pc.printf("Joystick Left");
lewiscameron 3:eaa6fbb8fd87 464 CustomHiSP = CustomHiSP - 1;
lewiscameron 0:089b4c4f2b6f 465 wait(0.5);
lewiscameron 0:089b4c4f2b6f 466 }
lewiscameron 0:089b4c4f2b6f 467
lewiscameron 4:b82f09e597ec 468 if (d == E) { //increases the setpoint when it is pushed right
lewiscameron 4:b82f09e597ec 469 //pc.printf("Joystick Right");
lewiscameron 3:eaa6fbb8fd87 470 CustomHiSP = CustomHiSP + 1;
lewiscameron 0:089b4c4f2b6f 471 wait(0.5);
lewiscameron 0:089b4c4f2b6f 472
lewiscameron 0:089b4c4f2b6f 473 }
lewiscameron 0:089b4c4f2b6f 474 }
lewiscameron 0:089b4c4f2b6f 475
lewiscameron 4:b82f09e597ec 476 void CustLo_SP() //function to change low limit SP
lewiscameron 0:089b4c4f2b6f 477 {
lewiscameron 4:b82f09e597ec 478 if (button_left_flag) { //decreases the setpoint when the left bumper is pressed
lewiscameron 0:089b4c4f2b6f 479 button_left_flag = 0;
lewiscameron 4:b82f09e597ec 480 //pc.printf("Left pressed");
lewiscameron 3:eaa6fbb8fd87 481 CustomLoSP = CustomLoSP - 1;
lewiscameron 0:089b4c4f2b6f 482 wait(0.5);
lewiscameron 0:089b4c4f2b6f 483 }
lewiscameron 0:089b4c4f2b6f 484
lewiscameron 4:b82f09e597ec 485 if (button_right_flag) { // increases the setpoint when the right bumper is pressed
lewiscameron 0:089b4c4f2b6f 486 button_right_flag = 0;
lewiscameron 4:b82f09e597ec 487 //pc.printf("Right pressed");
lewiscameron 3:eaa6fbb8fd87 488 CustomLoSP = CustomLoSP + 1;
lewiscameron 0:089b4c4f2b6f 489 wait(0.5);
lewiscameron 0:089b4c4f2b6f 490 }
lewiscameron 0:089b4c4f2b6f 491
lewiscameron 3:eaa6fbb8fd87 492 }
lewiscameron 3:eaa6fbb8fd87 493
lewiscameron 3:eaa6fbb8fd87 494 void ShowSP()
lewiscameron 3:eaa6fbb8fd87 495 {
lewiscameron 3:eaa6fbb8fd87 496 char buffer[14];
lewiscameron 0:089b4c4f2b6f 497 int length = sprintf(buffer,"LoLimSP=%.2iC",CustomLoSP);
lewiscameron 0:089b4c4f2b6f 498
lewiscameron 0:089b4c4f2b6f 499 if (length <= 14); {
lewiscameron 4:b82f09e597ec 500 lcd.printString(buffer,0,3); // prints the low SP value on screen
lewiscameron 3:eaa6fbb8fd87 501 }
lewiscameron 3:eaa6fbb8fd87 502
lewiscameron 3:eaa6fbb8fd87 503 length = sprintf(buffer,"HiLimSP=%.2iC",CustomHiSP);
lewiscameron 3:eaa6fbb8fd87 504
lewiscameron 3:eaa6fbb8fd87 505 if (length <= 14); {
lewiscameron 4:b82f09e597ec 506 lcd.printString(buffer,0,2); // prints the high SP value on screen
lewiscameron 0:089b4c4f2b6f 507 }
lewiscameron 0:089b4c4f2b6f 508 }
lewiscameron 3:eaa6fbb8fd87 509
lewiscameron 2:9d6daa8a091c 510
lewiscameron 4:b82f09e597ec 511 void TMP102::error() // function to show that there is an error with the temp sensor on screen and switch on a red LED
lewiscameron 2:9d6daa8a091c 512 {
lewiscameron 4:b82f09e597ec 513
lewiscameron 2:9d6daa8a091c 514 startup();
lewiscameron 2:9d6daa8a091c 515 lcd.clear();
lewiscameron 2:9d6daa8a091c 516 lcd.printString("TMP102",0,0);
lewiscameron 2:9d6daa8a091c 517 lcd.printString("Sensor Error",0,1);
lewiscameron 2:9d6daa8a091c 518
lewiscameron 2:9d6daa8a091c 519 while(1) {
lewiscameron 4:b82f09e597ec 520 //printf("Temp sensor error \n");
lewiscameron 2:9d6daa8a091c 521 led_red2 = 0;
lewiscameron 2:9d6daa8a091c 522 }
lewiscameron 2:9d6daa8a091c 523 }
lewiscameron 2:9d6daa8a091c 524
lewiscameron 0:089b4c4f2b6f 525
lewiscameron 0:089b4c4f2b6f 526
lewiscameron 0:089b4c4f2b6f 527
lewiscameron 1:87661a0c8ba3 528
lewiscameron 0:089b4c4f2b6f 529