Rev 1.6 - Sample Period Work in progress

Dependencies:   mbed Bitmap N5110 TMP102 Joystick

main.cpp

Committer:
louismarr
Date:
2022-01-28
Revision:
22:ef63c41689c2
Parent:
21:bf02fb9876b3
Child:
23:655780ba2686

File content as of revision 22:ef63c41689c2:

/* 

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 Tmp(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 Page0();
void Page1();
void Page2();
void Home();

void MenuNav();                                // Menu Navigation using the Joystick to move Left & Right

void Custom();                                 // Custom Setpoint - Mode Function
void T_SP_Pg0();
void HtgClg_Pg0();

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
    Tmp.init();                                 // Initialise Temp Sensor Libraries
    lcd.init();                                 // Initialise LCD
    Joystick.init();                            // Initialise Joystick
           
    lcd.setContrast(0.4);                       // Setup the contrast for the LCD Screen
    
    R.fall(&R_isr);                             // Flipping the Interrupt Function
    R.mode(PullDown);                           // When the PCB Button is Pulled Down
    
    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() 
{
    /** Serial Port Communications
     * Initialise the serial communication port for communication
     * to CoolTerm in order to Debug the code through various parts
     */
    serial.baud(9600);                  // Baud Rate Communication for CoolTerm Debugging                          
}

void init_K64F() 
{
    /* K64F Board Set up
     * since the on-board switches have external pull-ups, disable the 
     * internal pull-down resistors that are enabled by default using
     * the InterruptIn Command */
        
    RED_led = 1;                        // on-board LEDs are active when 0, so setting the pin to 1 turns them off
    GRN_led = 1;
    BLU_led = 1;       
                       
    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()
{
        /** Printing Information Page
          * Pre-defined software information page to be printed when called upon
        */
        
        //serial.printf(" Information Page Selected ");    // Debugging Print
        lcd.clear();                                       // Clear Screen
        lcd.printString("  Info Page   ",0,0);             // Print Information Screen
        lcd.printString("  Author: LM  ",0,1);
        lcd.printString("   18689006   ",0,2);
        lcd.printString("   Version 1  ",0,3);
        lcd.printString("   R = Home   ",0,4);
        lcd.printString("  A = Select  ",0,5);   
        
        lcd.refresh();                                     // Refresh & Display printed strings to LCD
        wait(1);

} 
void Home()
{              
        /** Printing Home Page
          * Pre-defined Home page to be printed when called upon
        */
        
        //serial.printf("Home Menu");                    // Debugging Print
        lcd.clear();                                     // Clear Screen
        lcd.printString("   Navigate  >",0,0);           // Print Home Screen
        lcd.printString(" Use Joystick ",0,1);
        lcd.printString("   Welcome   ",0,3);           
        lcd.printString("  Main Menu: ",0,4); 
        lcd.printString("  Y for Info  ",0,5);   
                
        lcd.refresh();                                   // Refresh & Display printed strings to LCD
        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");            // Debugging Print
                info();                                  // Display Information Screen                
                       }
}
void Page0()
{        
        /** Printing Page 0
          * Pre-defined PCustom Page to be printed when called upon
        */
        
        //serial.printf(" Custom Page ");                 // Debugging Print
        lcd.clear();                                      // Clear Screen
        lcd.printString("<   Custom   >",0,0);            // Print Page 1 Screen
        lcd.printString("     MODE:    ",0,1);
        lcd.printString("    Custom    ",0,2);
        lcd.printString("   Setpoint   ",0,3);
        lcd.printString("    Press A   ",0,4);
           
        lcd.refresh();                                     // Refresh & Display printed strings to LCD
        wait(1);
        
            if (g_A_flag){                                 // Condition to change over into new loop
                g_A_flag = 0;                              // When the A Flag has been pressed
                A.rise(&A_isr);
                //serial.printf("A Pressed");              // Debugging Print
                Custom();                                  // Select Custom Mode
                wait(1);
                        }
}
void Page1()
{        
        /** Printing Page 1
          * Pre-defined Page 1 to be printed when called upon
        */
        
        //serial.printf(" Page 1 ");                      // Debugging Print
        lcd.clear();                                      // Clear Screen
        lcd.printString("<   Page 1   >",0,0);            // Print Page 1 Screen
        lcd.printString("     MODE:    ",0,1);
        lcd.printString("Washing Water",0,2);
        lcd.printString("    Press A   ",0,3);
           
        lcd.refresh();                                     // Refresh & Display printed strings to LCD
        wait(1);
        
            if (g_A_flag){                                 // Condition to change over into new loop
                g_A_flag = 0;                              // When the A Flag has been pressed
                A.rise(&A_isr);
                //serial.printf("A Pressed");              // Debugging Print
                WWtr();                                    // Select Mode 2
                wait(1);
                        }
}
void Page2()
{       
        /** Printing Page 2
          * Pre-defined Page 2 to be printed when called upon
        */ 
        
        //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();                                      // Refresh & Display printed strings to LCD
        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");                // Debugging Print
                 CWtr();                                    // Select Mode 3
                 wait(1);
                        }                       
}
void Page3()
{        
        /** Printing Page 3
          * Pre-defined Page 3 to be printed when called upon
        */
        
        //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",4,2);
        lcd.printString("    Press A   ",0,3);
           
        lcd.refresh();                                 // Refresh & Display printed strings to LCD
        wait(1);
         
            if (g_A_flag){                             // Condition to change over into new loop
                g_A_flag = 0;                          // When the A Flag has been pressed
                A.rise(&A_isr);
                //serial.printf("A Pressed");          // Debugging Print
                BWtr();                                // Select Mode 3
                wait(1);
                        }                       
}   
void MenuNav()
{ 
  /** Menu Navigation Function
      * Using the Joystick and a Switch-Case Function Operation
      * in order to build the menu system that will be printing
      * onto the LCD N5110 Screen by calling upon funcitons
    */
    
    lcd.clear();                                            // Clear LCD Screen
    lcd.refresh();                                          // Refresh & Display printed strings to LCD
    
    int Mode = 0;                                           // Initialise Mode to 0
    while (1){
        
    //serial.printf("Direction = %i ",d);                   // Debugging Print
    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 2
                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
                          }
                break;                                      // Break out from Loop into Main Switch
            
            case 3:                                         // Main Initial Case instance - When at Page 3
                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.3");          // 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 = 4;                           // Remain in Mode 2 - Prevents idol cycling through the switch
                        //serial.printf("RIGHT.3");         // Debugging Print
                        break;                              // Break out from Loop
                          }
                break;                                      // Break out from Loop into Main Switch
            
            case 4:                                         // Main Initial Case instance - When at Page 2
                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 = 3;                           // Return to Mode 1
                        //serial.printf("LEFT.4");          // 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 = 4;                           // Remain in Mode 2 - Prevents idol cycling through the switch
                        //serial.printf("RIGHT.4");         // Debugging Print
                        break;                              // Break out from Loop
                          }
            break;                                          // Break out from Loop into Main Switch
                default:
                    Mode = 0;
            
            break;
                        }
        wait(0.5);
                                                            // Mode Actions
            if (Mode == 0){                                 // When the Mode is 0                                 
                Home();                                     // Go to Home Page Function
                            }
            else if (Mode == 1){                            // When the Mode is 1
                Page0();                                    // Go to Page 0 Function
                            }
            else if (Mode == 2){                            // When the Mode is 2
                Page1();                                    // Go to Page 1 Function
                            }
            else if (Mode == 3){                            // When the Mode is 3
                Page2();                                    // Go to Page 2 Function
                            } 
            else if (Mode == 4){                            // When the Mode is 4
                Page3();                                    // Go to Page 3 Function
                            }
        }
} 
void Custom()
{
  /** Custom Monitoring Mode
      * Using Parameters for Temperature with a custom setpoint
      */
    while(1){
    
    Setpoint[3] = SetP * 100;
    float T = Tmp.get_temperature();                    // Reading Temperature as a floating variable
    float SP = Setpoint[3];                             // 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_Pg0();                           // Heating Cooling Control Function
                lcd.clear();                            // Clear LCD Screen
                T_SP_Pg0();                             // 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_Pg0();                           // Heating Cooling Control Function
                lcd.clear();                            // Clear LCD Screen
                T_SP_Pg0();                             // Print Modes Temperature & Setpoint info
                lcd.printString("  Temperature ",0,2);  // Display string on screen, Determine Co-ordinates (..,Column, Row)
                lcd.printString("   Satisfied  ",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 WWtr()
{
  /** Warm Washing Water Mode
      * Using Parameters for Safe Washing Water Temperature
      */
    while(1){
    
    float T = Tmp.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 = Tmp.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 = Tmp.get_temperature();                    // Reading Temperature as a floating variable
    float SP = Setpoint[3];                             // 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;                          // Enable the Ready LED
                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_Pg0()
{
      /** Mode Select = Cutsom
          * 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
        */
    
    Setpoint[3] = SetP * 100;                                     // Use Potentiometer for custom setpoint and assign value into the array
        
    float T = Tmp.get_temperature();                              // Reading Temperature as a floating variable
    float SP_0 = Setpoint[3];                                     // 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_0);           // 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_Pg0()
{
        /** 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        
        */
        
        Setpoint[3] = SetP * 100;                   // Use Potentiometer for custom setpoint and assign value into the array
        
        float T = Tmp.get_temperature();            // Reading Temperature as a floating variable
        float SP_0 = Setpoint[3];                   // Reading the Mode Setpoint from the Array
            if (T > SP_0+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");         // Debugging Print
                              }
            else if (T < SP_0-1){                   // 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");         // Debugging Print
                                   }
            else {                                  // If none of the conditions are satisfied
                Clg_LED = 1;                        // Disable Heating & cooling LED's
                Htg_LED = 1;                    
                 }
}
void T_SP_Pg1()
{
      /** Mode Select = Washing Water
          * 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 = Tmp.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 = Tmp.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");         // Debugging Print
                              }
            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");         // Debugging Print
                                   }
            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 = Drinking Water
          * 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 = Tmp.get_temperature();                              // Reading Temperature as a floating variable
    float SP_2 = 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_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 = Tmp.get_temperature();          // Reading Temperature as a floating variable
        float SP_2 = Setpoint[2];                 // 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");       // Debugging Print
                              }
            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;
                //serial.printf("Heating");       // Debugging Print
                                   }
            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 = Boiling water
          * 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 = Tmp.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 = Tmp.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");       // Debugging Print
                              }
            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;
                //serial.printf("Heating");       // Debugging Print
                                   }
            else {                                // If none of the conditions are satisfied
                Clg_LED = 1;                      // Disable Heating & cooling LED's
                Htg_LED = 1;                    
                 }
}