Rev 1.6 - Sample Period Work in progress

Dependencies:   mbed Bitmap N5110 TMP102 Joystick

main.cpp

Committer:
louismarr
Date:
2022-01-22
Revision:
18:8e025b809dfb
Parent:
17:be8dd797e60b
Child:
19:00cdcf5a5b7a

File content as of revision 18:8e025b809dfb:

/* 

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 SP(PTB2);                             // Potentiometer for Setpoint
Joystick Joystick(PTB10,PTB11,PTC16);          // Create Joystick (PTB10 = Up/Down) (PTB11 = L/R) (PTB16 = Button)

//Timer timer();                                 // USE FOR LOGGING BETWEEN 0-10s
Ticker joystickDelay;

DigitalOut RED_led(LED_RED);                   // On-board K64F LED'S
DigitalOut GRN_led(LED_GREEN);
DigitalOut BLU_led(LED_BLUE);

DigitalOut Clg_LED(PTA2);
DigitalOut Ready_LED(PTA1);

DigitalOut Htg_LED(PTC3);

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);                         // Right Bumper Button
InterruptIn Y(PTC12);                        // Left Bumper Button

volatile int g_R_flag = 0;                    // g_ in order to show it is a global variable. 
volatile int g_L_flag = 0;                    // volatile flag as it will change within the isr
volatile int g_A_flag = 0;                    // g_ in order to show it is a global variable. 
volatile int g_Y_flag = 0;

/*======================= Void Declaration ===================================*/
void error();                                  // Error Hang Code Function
void init_serial();                            // Setup serial port Function
void init_K64F();                              // K64F Disabling Onboard Components Function
void R_isr();
void L_isr();
void A_isr();
void Y_isr();
void info();
void temp_SP();
void MenuNav();
void Page1();
void Page2();
void CWtr();
void SP_Array();
void T_SP_Pg2();
void HtgClg_Pg2();

/*======================== Main Function =====================================*/
int Setpoint[4] = {8,37.65,80,24};

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;
    Ready_LED = 1;
    
    Htg_LED = 1;
    
    while (1) {        
        //timer.start(); 
        //for(i = 0; i < 10; i++){
        // read temperature and print over serial port
        
        
        MenuNav();                                         // Call the info function                                              
        //Page1();
        //Page2();
        //temp_SP();
        
                                                                
    }

}


/*
=========================== 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()                            // Left Bumper Interrupt Service     
{
    g_A_flag = 1;                       // set flag in ISR
}
void Y_isr()                            // Left Bumper 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",0,0);              // Print Information Screen
        lcd.printString("Author:",0,1);
        lcd.printString("Louis M",0,2);
        lcd.printString("18689006",0,3);
        lcd.printString("Version 1.9.1",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);
}
void Page1()
{
        serial.printf(" Page 1 ");  // Debugging Print
        lcd.clear();                                   // Clear Screen
        lcd.printString("<   Page 1   >",0,0);              // Print Information Screen
        lcd.printString("Temperature",0,1);
        lcd.printString("Logging",0,2);
        lcd.printString("Press A",0,3);
           
        lcd.refresh();
        wait(1);
        //while (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");
                temp_SP();
                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 temp_SP()
{
        //while(1){
        float T = tmp102.get_temperature();             // Reading Temperature as a floating variable
        float Set = SP * 100;                           // Reading Potentiometer as a floating variable. Multiplied by 100 to give larger range        
        
        lcd.clear();                                    // clearing the LCD buffer at the begining of the loop        
        lcd.printString("Temperature",0,0);             // Can also pre-determine the co-ordinates of the ',0,0' (must be less than 84 pixels to fit on display)            
        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,0,1);                // display on screen
        serial.printf("T = %f C\n",T);                  // Printing the Temperature over Serial Port
        
        length = sprintf(buffer,"SP=%.2F 'C",Set);      // Print the Setpoint from the Float Variable Set 
        if (length <= 14)                               // Ensuring string will fit on the screen (Printing at x=0)
          lcd.printString(buffer,0,2);                  // display on screen
        serial.printf("   SP = %f",  Set);              // 
        lcd.refresh();
                wait(1);
        //while (1){
        if (Set < T){                                // Condition to change over into new loop
            lcd.clear();                                    // clearing the LCD buffer at the begining of the loop
            lcd.printString("Over Heating",3,2);            // Print New Message
            serial.printf("OverTemp");                      // Debugging Print   
        lcd.refresh();
                wait(1);
        //}
        }
}       
//}    
void MenuNav()
{ 

    lcd.clear();
    lcd.refresh();
    
    int select = 0;
    while (1){
    
    
    //serial.printf("Direction = %i ",d);
    Direction d = Joystick.get_direction();

        switch(select) {
            case 0:
                switch(d) {
                    case W:
                        wait(0.5);
                        select = 0;
                        serial.printf("LEFT.0");
                        break;
                    case E:
                        wait(0.5);
                        select = 1;
                        serial.printf("RIGHT.0");
                        break;
                }
                break;
            case 1:
                switch(d) {
                    case W:
                        wait(0.5);
                        select = 0;
                        serial.printf("LEFT.1");                
                        break;
                    case E:
                        wait(0.5);
                        select = 2;
                        serial.printf("RIGHT.1");
                        break;
                }
                break;
            case 2:
                switch(d) {
                    case W:
                        wait(0.5);
                        select = 1;
                        serial.printf("LEFT.2");
                        break;
                    case E:
                        wait(0.5);
                        select = 2;
                        serial.printf("RIGHT.2");
                        break;
            }
            break;
        }
        wait(0.1);

            if (select == 0){
                Home();    
                }    
            if (g_Y_flag){                               // Condition to change over into new loop
                g_Y_flag = 0;                                   // When the R Flag has been pressed
                Y.rise(&Y_isr);
                serial.printf("Y Pressed");
                info();                
                }
            
            if (select == 1){
                Page1();                            
                }
            
            if (select == 2){
                Page2();
                
                }
}
}      
void CWtr()
{
    while(1){
    float CWtr_SP = Setpoint[3];
    //serial.printf("SP = %.2f \n",CWtr_SP);
    float T = tmp102.get_temperature();             // Reading Temperature as a floating variable
    serial.printf("SETPOINT = ",CWtr_SP);
    if (CWtr_SP-1 > T || T > CWtr_SP+1){
                                
                HtgClg_Pg2();
                lcd.clear();
                T_SP_Pg2();
                lcd.printString("  Adjusting   ",0,2);              // Print Information Screen
                lcd.printString("  Water Temp  ",0,3);
                lcd.printString(" Please Wait! ",4,4);
                
                lcd.refresh();
                wait(1);
                }

            else if (CWtr_SP-1 <= T <= CWtr_SP+1){
                HtgClg_Pg2();
                lcd.clear();
                T_SP_Pg2();
                lcd.printString("     COLD     ",0,2);              // Print Information Screen
                lcd.printString("Drinking Water",0,3);
                lcd.printString("    Ready!    ",4,4);    
                
                Ready_LED = 0;
        
                lcd.refresh();
                Ready_LED = 0;
                wait(1);  
                }
            
            if (g_R_flag){                               // Condition to change over into new loop
                g_R_flag = 0;                                   // When the R Flag has been pressed
                R.rise(&R_isr);
                serial.printf("Home Pressed");
                
                Clg_LED = 1;
                Htg_LED = 1;
                Ready_LED = 1;
                
                MenuNav();
                wait(1);
                }
}
}

void T_SP_Pg2()
{
        float T = tmp102.get_temperature();
        float CWtr_SP = Setpoint[3];
        char buffer[14];
        
        int  length = sprintf(buffer,"T=%.2F 'C",T);     // print the temperature from the float variable T
            if (length <= 14);
            lcd.printString(buffer,18,0);
            serial.printf("    T = %f C\n",T);
        
        length = sprintf(buffer,"SP=%.2f 'C",CWtr_SP);     // 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,13,1);                // display on screen
            serial.printf("    T = %f C\n",CWtr_SP);
}
void HtgClg_Pg2()
{
        float T = tmp102.get_temperature();
        float CWtr_SP = Setpoint[3];
            if (T > CWtr_SP+1){
                Clg_LED = 0;
                Htg_LED = 1;
                Ready_LED = 1;
                }
            else if (T < CWtr_SP-1){
                Clg_LED = 1;
                Htg_LED = 0;
                Ready_LED = 1;
                }
            else {
                Clg_LED = 1;
                Htg_LED = 1;
                
                }
}