![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Rev 1.6 - Sample Period Work in progress
Dependencies: mbed Bitmap N5110 TMP102 Joystick
main.cpp
- Committer:
- louismarr
- Date:
- 2022-01-22
- Revision:
- 21:bf02fb9876b3
- Parent:
- 20:3bc5958190cd
- Child:
- 22:ef63c41689c2
File content as of revision 21:bf02fb9876b3:
/* Acknowledgements to (c) Craig A. Evans, University of Leeds, Feb 2016 for Temp Library Acknowledgements to (c) Dr. Edmond Nurellari, University of Lincoln, Dec 2021 for Classes used Using Various Libraries & Functions in order to create a Temperature Based Health Assistive Smart Device */ /* ======================== Library Imports ======================================= Importing the Header Files from the Class Libraries into the main.cpp */ #include "mbed.h" // Mbed OS Library #include "TMP102.h" // TMP102 Header File #include "N5110.h" // N5110 Header File #include "Bitmap.h" // Bitmap Header File #include "Joystick.h" // Joystick Header File /* ========================== Vairable Setup ====================================== Pre-Determining the various Variable names to hardware pins on the K64F Board */ TMP102 tmp102(I2C_SDA,I2C_SCL); // Create TMP102 object N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); // Create lcd objec Serial serial(USBTX,USBRX); // CoolTerm TX, RX Comms Setup for Debug AnalogIn SetP(PTB2); // Potentiometer for Setpoint Joystick Joystick(PTB10,PTB11,PTC16); // Create Joystick (PTB10 = Up/Down) (PTB11 = L/R) (PTB16 = Button) DigitalOut RED_led(LED_RED); // On-board K64F LED'S DigitalOut GRN_led(LED_GREEN); DigitalOut BLU_led(LED_BLUE); DigitalOut Clg_LED(PTA2); // Green LED on PCB for Cooling DigitalOut Ready_LED(PTA1); // Green LED on PCB for when water is ready DigitalOut Htg_LED(PTC3); // Red LED on PCB for Cooling DigitalOut Boil_LED(PTD3); InterruptIn sw2(SW2); // On-board K64F Switches InterruptIn sw3(SW3); InterruptIn R(PTB3); // Right Bumper Button InterruptIn L(PTB18); // Left Bumper Button InterruptIn A(PTB9); // A button Button InterruptIn Y(PTC12); // Y Button Button // Interrupt Services volatile flag which will change within the isr volatile int g_R_flag = 0; // g_ in order to show it is a global variable. volatile int g_L_flag = 0; volatile int g_A_flag = 0; volatile int g_Y_flag = 0; /* ========================= Void Declaration ===================================== Functions to be called throughout code in order to improve readability */ void error(); // Error Hang Code Function void init_serial(); // Setup serial port Function void init_K64F(); // K64F Disabling Onboard Components Function void R_isr(); // Interrupt Voids void L_isr(); void A_isr(); void Y_isr(); // Display Screen Voids used in the Menu void info(); void Page1(); void Page2(); void Home(); void MenuNav(); // Menu Navigation using the Joystick to move Left & Right void WWtr(); // Page 1 - Mode Functions void T_SP_Pg1(); void HtgClg_Pg1(); void CWtr(); // Page 2 - Mode Functions void T_SP_Pg2(); void HtgClg_Pg2(); void BWtr(); // Page 2 - Mode Functions void T_SP_Pg3(); void HtgClg_Pg3(); /*======================== Main Function =====================================*/ int Setpoint[4] = {8,37,80,24}; // Setpoint Array to be used dependant on Mode Selected int main() { init_K64F(); // Initialise K64F Board init_serial(); // Initialise Serial Port tmp102.init(); // Initialise Temp Sensor lcd.init(); // Initialise LCD Joystick.init(); lcd.setContrast(0.4); // Setup the contrast for the LCD Screen R.fall(&R_isr); R.mode(PullDown); L.fall(&L_isr); L.mode(PullDown); A.fall(&A_isr); A.mode(PullDown); Y.fall(&Y_isr); Y.mode(PullDown); Clg_LED = 1; // Disabling the LED's Ready_LED = 1; Htg_LED = 1; Boil_LED = 1; while (1) { MenuNav(); } } /* =========================== Void Setup ========================================= Custom Function's are called Void's, which are called upon inside the of the Main Function Code */ void init_serial() { // Baud Rate Communication for CoolTerm Debugging serial.baud(9600); } void init_K64F() { // on-board LEDs are active when 0, so setting the pin to 1 turns them off. RED_led = 1; GRN_led = 1; BLU_led = 1; /* since the on-board switches have external pull-ups, disable the * internal pull-down resistors that are enabled by default using * the InterruptIn Command */ sw2.mode(PullNone); sw3.mode(PullNone); } void R_isr() // Right Bumper Interrupt Service { g_R_flag = 1; // set flag in ISR } void L_isr() // Left Bumper Interrupt Service { g_L_flag = 1; // set flag in ISR } void A_isr() // A Button Interrupt Service { g_A_flag = 1; // set flag in ISR } void Y_isr() // Y Button Interrupt Service { g_Y_flag = 1; // set flag in ISR } void info() { serial.printf(" Information Page Selected "); // Debugging Print lcd.clear(); // Clear Screen lcd.printString("Info Page V",0,0); // Print Information Screen lcd.printString("Author: LM",0,1); lcd.printString("18689006",0,2); lcd.printString("R = Home",0,3); lcd.printString("A = Select",0,4); lcd.refresh(); wait(1); } void Home() { lcd.clear(); // Clear Screen serial.printf("Home Menu"); lcd.printString(" Navigate >",0,0); lcd.printString(" Use Joystick ",0,1); lcd.printString(" Welcome ",0,3); // Print Information Screen lcd.printString(" Main Menu: ",0,4); lcd.printString(" Y for Info ",0,5); lcd.refresh(); wait(1); if (g_Y_flag){ // Condition to change over into new loop g_Y_flag = 0; // When the Button has been pressed Y.rise(&Y_isr); serial.printf("Y Pressed"); info(); } } void Page1() { serial.printf(" Page 1 "); // Debugging Print lcd.clear(); // Clear Screen lcd.printString("< Page 1 >",0,0); // Print Information Screen lcd.printString(" MODE ",0,1); lcd.printString("Washing Water",0,2); lcd.printString(" Press A ",0,3); lcd.refresh(); wait(1); if (g_A_flag){ // Condition to change over into new loop g_A_flag = 0; // When the R Flag has been pressed A.rise(&A_isr); serial.printf("A Pressed"); WWtr(); wait(1); } } void Page2() { serial.printf(" Page 2 "); // Debugging Print lcd.clear(); // Clear Screen lcd.printString("< Page 2 >",0,0); // Print Information Screen lcd.printString(" MODE ",0,1); lcd.printString("Drinking Water",0,2); lcd.printString(" Press A ",0,3); lcd.refresh(); wait(1); if (g_A_flag){ // Condition to change over into new loop g_A_flag = 0; // When the R Flag has been pressed A.rise(&A_isr); serial.printf("A Pressed"); CWtr(); wait(1); } } void Page3() { serial.printf(" Page 3 "); // Debugging Print lcd.clear(); // Clear Screen lcd.printString("< Page 3",0,0); // Print Information Screen lcd.printString(" MODE ",0,1); lcd.printString("Boiling Water",0,2); lcd.printString(" Press A ",0,3); lcd.refresh(); wait(1); if (g_A_flag){ // Condition to change over into new loop g_A_flag = 0; // When the R Flag has been pressed A.rise(&A_isr); serial.printf("A Pressed"); BWtr(); wait(1); } } void MenuNav() { lcd.clear(); lcd.refresh(); int Mode = 0; while (1){ //serial.printf("Direction = %i ",d); Direction d = Joystick.get_direction(); // Joystick Direction used in order to switch between modes switch(Mode) { // Main External Switch to detetermine Mode case 0: // Main Initial Case instance switch(d) { // Looking at the Joystick Direction for internal switch case W: // If the direction is W (Left) carry out Case W wait(0.5); // Delay added to allow for joystick movement Mode = 0; // Remain in Mode 0 - Prevents idol cycling through the switch //serial.printf("LEFT.0"); // Debugging Print to see which state the Main switch is at via Direction break; // Break out from Loop case E: // If the direction is E (Right) carry out Case E wait(0.5); // Delay added to allow for joystick movement Mode = 1; // Switch to Mode 1 //serial.printf("RIGHT.0"); // Debugging Print break; // Break out from Loop } break; // Break out from Loop into Main Switch case 1: // Main Initial Case instance - When at Page 1 switch(d) { // Looking at the Joystick Direction for internal switch case W: // If the direction is W (Left) carry out Case W wait(0.5); // Delay added to allow for joystick movement Mode = 0; // Return to Mode 0 //serial.printf("LEFT.1"); // Debugging Print break; // Break out from Loop case E: // If the direction is E (Right) carry out Case E wait(0.5); // Delay added to allow for joystick movement Mode = 2; // Switch to Mode 0 //serial.printf("RIGHT.1"); // Debugging Print break; // Break out from Loop } break; // Break out from Loop into Main Switch case 2: // Main Initial Case instance - When at Page 1 switch(d) { // Looking at the Joystick Direction for internal switch case W: // If the direction is W (Left) carry out Case W wait(0.5); // Delay added to allow for joystick movement Mode = 1; // Return to Mode 1 //serial.printf("LEFT.2"); // Debugging Print break; // Break out from Loop case E: // If the direction is E (Right) carry out Case E wait(0.5); // Delay added to allow for joystick movement Mode = 3; // Remain in Mode 2 - Prevents idol cycling through the switch //serial.printf("RIGHT.2"); // Debugging Print break; // Break out from Loop } case 3: // Main Initial Case instance - When at Page 1 switch(d) { // Looking at the Joystick Direction for internal switch case W: // If the direction is W (Left) carry out Case W wait(0.5); // Delay added to allow for joystick movement Mode = 2; // Return to Mode 1 //serial.printf("LEFT.2"); // Debugging Print break; // Break out from Loop case E: // If the direction is E (Right) carry out Case E wait(0.5); // Delay added to allow for joystick movement Mode = 3; // Remain in Mode 2 - Prevents idol cycling through the switch //serial.printf("RIGHT.2"); // Debugging Print break; // Break out from Loop } break; // Break out from Loop into Main Switch } wait(0.5); if (Mode == 0){ Home(); } else if (Mode == 1){ Page1(); } else if (Mode == 2){ Page2(); } else if (Mode == 3){ Page3(); } } } void WWtr() { /** Warm Washing Water Mode * Using Parameters for Safe Washing Water Temperature */ while(1){ float T = tmp102.get_temperature(); // Reading Temperature as a floating variable float SP = Setpoint[1]; // Reading the Setpoint from the Array //serial.printf("SP = %.2f \n",CWtr_SP); // Debugging Print //serial.printf("SETPOINT = ",CWtr_SP); // Debugging Print if (SP-1 > T || T > SP+1){ // If the Temperature is not within the Tolerance HtgClg_Pg1(); // Heating Cooling Control Function lcd.clear(); // Clear LCD Screen T_SP_Pg1(); // Print Modes Temperature & Setpoint info lcd.printString(" Adjusting ",0,2); // Display string on screen, Determine Co-ordinates (..,Column, Row) lcd.printString(" Water Temp ",0,3); lcd.printString(" Please Wait! ",4,4); lcd.refresh(); // Refresh & Display printed strings to LCD wait(1); } else if (SP-1 <= T <= SP+1){ // If the Temperature is within the Tolerance HtgClg_Pg1(); // Heating Cooling Control Function lcd.clear(); // Clear LCD Screen T_SP_Pg1(); // Print Modes Temperature & Setpoint info lcd.printString(" Warm ",0,2); // Display string on screen, Determine Co-ordinates (..,Column, Row) lcd.printString("Washing Water",0,3); lcd.printString(" Ready! ",4,4); lcd.refresh(); // Refresh & Display printed strings to LCD Ready_LED = 0; // Enable the Ready LED wait(1); } if (g_R_flag){ // Condition to change over into new loop g_R_flag = 0; // When the Button has been pressed R.rise(&R_isr); // Button Rising edge //serial.printf("Home Pressed"); // Debugging Print Clg_LED = 1; // Disable the LED's for next Mode Htg_LED = 1; Ready_LED = 1; MenuNav(); // Return to Navigation Menu wait(1); } } } void CWtr() { /** Cold Drinking Water Mode * Using Parameters for Safe Drinking Water Temperature */ while(1){ float T = tmp102.get_temperature(); // Reading Temperature as a floating variable float SP = Setpoint[0]; // Reading the Setpoint from the Array //serial.printf("SP = %.2f \n",CWtr_SP); // Debugging Print //serial.printf("SETPOINT = ",CWtr_SP); // Debugging Print if (SP-1 > T || T > SP+1){ // If the Temperature is not within the Tolerance HtgClg_Pg2(); // Heating Cooling Control Function lcd.clear(); // Clear LCD Screen T_SP_Pg2(); // Print Modes Temperature & Setpoint info lcd.printString(" Adjusting ",0,2); // Display string on screen, Determine Co-ordinates (..,Column, Row) lcd.printString(" Water Temp ",0,3); lcd.printString(" Please Wait! ",4,4); lcd.refresh(); // Refresh & Display printed strings to LCD wait(1); } else if (SP-1 <= T <= SP+1){ // If the Temperature is within the Tolerance HtgClg_Pg2(); // Heating Cooling Control Function lcd.clear(); // Clear LCD Screen T_SP_Pg2(); // Print Modes Temperature & Setpoint info lcd.printString(" COLD ",0,2); // Display string on screen, Determine Co-ordinates (..,Column, Row) lcd.printString("Drinking Water",0,3); lcd.printString(" Ready! ",4,4); lcd.refresh(); // Refresh & Display printed strings to LCD Ready_LED = 0; // Enable the Ready LED wait(1); } if (g_R_flag){ // Condition to change over into new loop g_R_flag = 0; // When the Button has been pressed R.rise(&R_isr); // Button Rising edge //serial.printf("Home Pressed"); // Debugging Print Clg_LED = 1; // Disable the LED's for next Mode Htg_LED = 1; Ready_LED = 1; MenuNav(); // Return to Navigation Menu wait(1); } } } void BWtr() { /** Warm Washing Water Mode * Using Parameters for Safe Washing Water Temperature */ while(1){ float T = tmp102.get_temperature(); // Reading Temperature as a floating variable float SP = Setpoint[2]; // Reading the Setpoint from the Array //serial.printf("SP = %.2f \n",CWtr_SP); // Debugging Print //serial.printf("SETPOINT = ",CWtr_SP); // Debugging Print if (SP-1 > T || T > SP+1){ // If the Temperature is not within the Tolerance HtgClg_Pg3(); // Heating Cooling Control Function lcd.clear(); // Clear LCD Screen T_SP_Pg3(); // Print Modes Temperature & Setpoint info lcd.printString(" Adjusting ",0,2); // Display string on screen, Determine Co-ordinates (..,Column, Row) lcd.printString(" Water Temp ",0,3); lcd.printString(" Please Wait! ",4,4); lcd.refresh(); // Refresh & Display printed strings to LCD wait(1); } else if (SP-1 <= T <= SP+1){ // If the Temperature is within the Tolerance HtgClg_Pg3(); // Heating Cooling Control Function lcd.clear(); // Clear LCD Screen T_SP_Pg3(); // Print Modes Temperature & Setpoint info lcd.printString(" Boiling ",0,2); // Display string on screen, Determine Co-ordinates (..,Column, Row) lcd.printString("Boiling Water",0,3); lcd.printString(" Ready! ",4,4); lcd.printString(" WARNING HOT! ",0,5); lcd.refresh(); // Refresh & Display printed strings to LCD Ready_LED = 0; Boil_LED = 0; // Enable the Boiling LED wait(1); } if (g_R_flag){ // Condition to change over into new loop g_R_flag = 0; // When the Button has been pressed R.rise(&R_isr); // Button Rising edge //serial.printf("Home Pressed"); // Debugging Print Clg_LED = 1; // Disable the LED's for next Mode Htg_LED = 1; Ready_LED = 1; MenuNav(); // Return to Navigation Menu wait(1); } } } void T_SP_Pg1() { /** Mode Select * When a new mode is selected the LCD screen will update in order * to assist the user with the water temperature in order to provide * Assistance, Safety and Comfort */ float T = tmp102.get_temperature(); // Reading Temperature as a floating variable float SP_1 = Setpoint[1]; // Reading the Mode Setpoint from the Array char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14 Max amound of Characters) int length = sprintf(buffer,"T=%.2F 'C",T); // print the temperature from the float variable T if (length <= 14); // Ensuring string will fit on the screen (Printing at x=0) lcd.printString(buffer,18,0); // Display string on screen, Determine Co-ordinates (..,Column, Row) //serial.printf(" T = %f C\n",T); // Debugging Print length = sprintf(buffer,"SP=%.2f 'C",SP_1); // print the Setpoint from the Setpoint Variable if (length <= 14) // Ensuring string will fit on the screen (Printing at x=0) lcd.printString(buffer,13,1); // Display string on screen, Determine Co-ordinates (..,Column, Row) //serial.printf(" T = %f C\n",SP_1); // Debugging Print } void HtgClg_Pg1() { /** Water Temperature Control * Control Mode which enables LED's if the temperature goes outside * of the +/- Setpoint Tolerance. * Dependant on the Mode Application will depend on which setpoint is * selected from the Setpoint Array */ float T = tmp102.get_temperature(); // Reading Temperature as a floating variable float SP_1 = Setpoint[1]; // Reading the Mode Setpoint from the Array if (T > SP_1+2){ // If Temp is above the setpoint Clg_LED = 0; // Enable the Cooling LED Htg_LED = 1; // Disable other LED's Ready_LED = 1; serial.printf("cooling"); } else if (T < SP_1-2){ // If Temp is below the setpoint Htg_LED = 0; // Enable the Heating LED Clg_LED = 1; // Disable other LED's Ready_LED = 1; serial.printf("Heating"); } else { // If none of the conditions are satisfied Clg_LED = 1; // Disable Heating & cooling LED's Htg_LED = 1; } } void T_SP_Pg2() { /** Mode Select * When a new mode is selected the LCD screen will update in order * to assist the user with the water temperature in order to provide * Assistance, Safety and Comfort */ float T = tmp102.get_temperature(); // Reading Temperature as a floating variable float SP_2 = Setpoint[0]; // Reading the Mode Setpoint from the Array char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14 Max amound of Characters) int length = sprintf(buffer,"T=%.2F 'C",T); // print the temperature from the float variable T if (length <= 14); // Ensuring string will fit on the screen (Printing at x=0) lcd.printString(buffer,18,0); // Display string on screen, Determine Co-ordinates (..,Column, Row) //serial.printf(" T = %f C\n",T); // Debugging Print length = sprintf(buffer,"SP=%.2f 'C",SP_2); // print the Setpoint from the Setpoint Variable if (length <= 14) // Ensuring string will fit on the screen (Printing at x=0) lcd.printString(buffer,13,1); // Display string on screen, Determine Co-ordinates (..,Column, Row) //serial.printf(" T = %f C\n",SP_2); // Debugging Print } void HtgClg_Pg2() { /** Water Temperature Control * Control Mode which enables LED's if the temperature goes outside * of the +/- Setpoint Tolerance. * Dependant on the Mode Application will depend on which setpoint is * selected from the Setpoint Array */ float T = tmp102.get_temperature(); // Reading Temperature as a floating variable float SP_2 = Setpoint[0]; // Reading the Mode Setpoint from the Array if (T > SP_2+1){ // If Temp is above the setpoint Clg_LED = 0; // Enable the Cooling LED Htg_LED = 1; // Disable other LED's Ready_LED = 1; serial.printf("cooling"); } else if (T < SP_2-1){ // If Temp is below the setpoint Htg_LED = 0; // Enable the Heating LED Clg_LED = 1; // Disable other LED's Ready_LED = 1; } else { // If none of the conditions are satisfied Clg_LED = 1; // Disable Heating & cooling LED's Htg_LED = 1; } } void T_SP_Pg3() { /** Mode Select * When a new mode is selected the LCD screen will update in order * to assist the user with the water temperature in order to provide * Assistance, Safety and Comfort */ float T = tmp102.get_temperature(); // Reading Temperature as a floating variable float SP_3 = Setpoint[2]; // Reading the Mode Setpoint from the Array char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14 Max amound of Characters) int length = sprintf(buffer,"T=%.2F 'C",T); // print the temperature from the float variable T if (length <= 14); // Ensuring string will fit on the screen (Printing at x=0) lcd.printString(buffer,18,0); // Display string on screen, Determine Co-ordinates (..,Column, Row) //serial.printf(" T = %f C\n",T); // Debugging Print length = sprintf(buffer,"SP=%.2f 'C",SP_3); // print the Setpoint from the Setpoint Variable if (length <= 14) // Ensuring string will fit on the screen (Printing at x=0) lcd.printString(buffer,13,1); // Display string on screen, Determine Co-ordinates (..,Column, Row) //serial.printf(" T = %f C\n",SP_3); // Debugging Print } void HtgClg_Pg3() { /** Water Temperature Control * Control Mode which enables LED's if the temperature goes outside * of the +/- Setpoint Tolerance. * Dependant on the Mode Application will depend on which setpoint is * selected from the Setpoint Array */ float T = tmp102.get_temperature(); // Reading Temperature as a floating variable float SP_3 = Setpoint[2]; // Reading the Mode Setpoint from the Array if (T > SP_3+1){ // If Temp is above the setpoint Clg_LED = 0; // Enable the Cooling LED Htg_LED = 1; // Disable other LED's Ready_LED = 1; serial.printf("cooling"); } else if (T < SP_3-1){ // If Temp is below the setpoint Htg_LED = 0; // Enable the Heating LED Clg_LED = 1; // Disable other LED's Ready_LED = 1; } else { // If none of the conditions are satisfied Clg_LED = 1; // Disable Heating & cooling LED's Htg_LED = 1; } }