//This is the main software for smart mug project that I wrote for my senior design //It includes utilization of different components of mbed board //Other important components used by this code //-Serial Miniature LCD Module (uLCD-144-G2 GFX) //-micro-sd card stored inside LCD module //-tilt sensor //-CLC level sensor //-temperature sensor //-three input buttons //-battery fuel gauge(very difficult to configure)

Dependencies:   mbed

main.cpp

Committer:
kuldipmaharjan
Date:
2014-01-08
Revision:
0:ea78ba769912

File content as of revision 0:ea78ba769912:

//Author: Kuldip Maharjan
//Email : kuldipmaharjan@gmail.com
//Anyone can use this code if it helps in their projects or
//for learning programing in mbed besides for commercial purposes


//This is the main software for smart mug project that I wrote for my senior design
//It includes utilization of different components of mbed board
//Other important components used by this code
//-Serial Miniature LCD Module (uLCD-144-G2 GFX)
//-micro-sd card stored inside LCD module
//-tilt sensor
//-CLC level sensor
//-temperature sensor
//-three input buttons
//-battery fuel gauge(very difficult to configure)

//I don't expect people to understand everything in this code but I am sure
//someone can utilize some parts of it to understand mbed platform better

#include "mbed.h"               //loads the main library for mbed board
#include "string.h"             //loads library to control strings


// for testing
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);


//DigitalOut lcd_reset(p19);     // used to reset the lcd
I2C    i2c( p28, p27 );          // sda, scl for fuel gauge
AnalogIn temperature(p20);       // for temp sensor input
AnalogIn tiltsensor(p19);        // for clc sensor input
AnalogIn clcLevelSensor(p18);    // for clc sensor input

//Serial pc(USBTX, USBRX);         // tx, rx if wire used pc terminal
Serial pc(p9, p10);              // tx, rx
Serial lcd(p13,p14);             // tx, rx for lcd connection


//setting up interrupt buttons
InterruptIn up_button(p5);
InterruptIn down_button(p6);
InterruptIn ok_button(p7);

/*======================================global functions=====================================================*/
void button_onrise_function_link();                                         //for interrupt buttons

void auto_baud();                                                           //sets baud of lcd to that of the arm
void clear_screen();                                                        //clears the screen of lcd
void set_font();                                                            //sets font size
void set_color();                                                           //sets background color
void lcd_reset_function();                                                  //used to reset lcd
void display_image(int menu_num);                                           //displays menu picture in the lcd
void display_string(int row, int col, char* str,int color1,int color2);     //displays string on lcd

void loadLiquidList();                                                      //load the 10 liquid list
void display_liquid_list(int track);                                        // display liquid list and keep track of the choosen one
void initial_setup();                                                       //the main screen

void readTemperature();                                                     //reads the temperature
void readLiquidLevel();                                                     //reads liquid level in the MUG
void read_time_date();                                                      //reads the current time and date

void readVolumeChange(float volume);


void get_database();                                                        //sync the new liquid database when 'D' is sent from the GUI
void send_userdata();                                                       //send liquidname, amount, and time info
void save_drink_animation();



void readDatabase();                                                        //load name and calorie from the memory card
void writeDatabase();                                                       //write name and calorie into memory card
void writeByte(char a);                                                     //for writing byte to memory


void set_address(int hex1, int hex2, int hex3, int hex4);                   //for setting address pointer to read or write data on memory card
void write_byte(char a);                                                    //writes a byte into the memory card
void read_byte();                                                           //reads a byte but not currently used!!!!!
void write_name_to_memory();                                                //write the whole liquid data to the memory
void read_name_from_memory();                                               //read the liquid data from the memory to the array

void write_user_counters();                      //for writing three counter values
void read_user_counters();                       // for reading three counter values
void read_user_history();                        // for reading user history
void write_user_history();                       // for writing user history


void interrupt_condition_handler(int button);                               //handles the logics after interrupt
void drink_session_handler();                                               //handles drinking session
void level_sensor_handler();                                                //handles the task of reading values from level sensor
void download_handler();                                                    //handles the download of 10 liquids
void read_temperature();                                                    //for reading temperature


/*==============================================global variables===============================================*/
int current_state=0;                //0=first display, 1=menu page, 2=liquid page
int inside_if_tracker=1;
int current_liquid_index=1;         //keeps track of current liquid
int drink_session_on =0;            //lets us know if drinking session is going on which is state 2
int drink_session_off_signal =0;    //used to limit interrupt problems
int counter_for_display=0;          //used to limit the refresh rate of session
char current_temperature[10]="";    //stores current temperature
char current_date[16]="";           //stores date after we call the function
char current_time[16]="";           //stores time after we call the function

double max_level=0.7;               //stores the max output of the level sensor
double min_level=0.2;               //stores the min output of the level sensor
double scale_to_register=0;         //this scale is used as a threshold to know when to count the level as increased or decreased
double current_level=0;             //stores the current level of liquid
double previous_level=0;            //stores the previous level of liquid so that we cand decide it liquid increased or decreased
double consumed_level=0;            //stores the amount of drink that the user consumed in a session

char data_counter=48;               //this will keep track of the user data
char data_cursor=48;                //this keeps track of which value to read
char synced_GUI_counter=48;         //this will keep track of the synced GUI data
char synced_app_counter=48;         //this will keep track of the synced app data
char current_history[50];           //stores the current history

char temp_string[50];               //whenever there is need to print temporary string
bool hand_shake  = false;
int countEntry=1;

char liquid[15][25];                //handles liquid name
char calorie[15][5];                //handles calorie data



/*
char name1[20] = "juice1";
char name2[20] = "Juice2";
char name3[20] = "Coffee 5";
char name4[20] = "Milk";
char name5[20] = "Pepsi";
char name6[20] = "D. Pepsi";
char name7[20] = "M. Dew";
char name8[20] = "D. M. Dew";
char name9[20] = "Coke";
char name10[20] = "Fanta";
*/

/*=============================================================================================
                                       WHEN UP BUTTON IS PRESSED
===============================================================================================*/
void up_pressed_func()
{
    led1=!led1;

    if (current_state == 1) {
        interrupt_condition_handler(1);
    }

}

/*=============================================================================================
                                       WHEN DOWN BUTTON IS PRESSED
===============================================================================================*/
void down_pressed_func()
{
    led2=!led2;
    if (current_state==1) {
        interrupt_condition_handler(2);
    }
}

/*=============================================================================================
                                     WHEN OK BUTTON IS PRESSED
===============================================================================================*/
void ok_pressed_func()
{
    inside_if_tracker=1;
    led3=!led3;
    if (current_state==1 && inside_if_tracker==1) {
        //go inside the liquid
        current_state=2;
        inside_if_tracker=0;
    } else if (current_state==2 && inside_if_tracker==1) {
        //show first item in liquid list
        current_state=1;
        inside_if_tracker=0;
    }
    interrupt_condition_handler(3);
}


int main()
{
    initial_setup();


    //read top ten liquids from the databse

    set_time(1366476350);  // http://www.epochconverter.com/
    //display_image(1);
    read_time_date();

    /*  here we load the liquid names into the array
        sprintf(liquid[1],"%s",name1);
        sprintf(liquid[2],"%s",name2);
        sprintf(liquid[3],"%s",name3);
        sprintf(liquid[4],"%s",name4);
        sprintf(liquid[5],"%s",name5);
        sprintf(liquid[6],"%s",name6);
        sprintf(liquid[7],"%s",name7);
        sprintf(liquid[8],"%s",name8);
        sprintf(liquid[9],"%s",name9);
        sprintf(liquid[10],"%s",name10);
    */
    //clear_screen();
    //display_string(5,1, "writing on database",0xFF,0xFF);
    //writeDatabase();
    //clear_screen();
    //display_string(5,1, "writing done" ,0xFF,0xFF);
    //clear_screen();
    //display_string(5,1, "reading from database" ,0xFF,0xFF);

    //readDatabase();
    //clear_screen();
    //display_string(5,1, "read from database done" ,0xFF,0xFF);


    //pc.printf("lskdjflsf");
    //pc.printf("%s readliquid",liquid[2]);
    // clear_screen();
    //display_string(5,1, liquid[3],0xFF,0xFF);
    /*=============================================================================================
                                           THE MAIN LOOP
    ===============================================================================================*/
    while(1) {
        counter_for_display++;
        download_handler();

        if (drink_session_on ==1 && counter_for_display>= 10000000) {
            drink_session_handler();
            //if (drink_session_on == 1) wait(3);             //cause value of drink_session_on can change from interrupt
            if (drink_session_on==0) {
                counter_for_display=0;
                clear_screen();

                save_drink_animation();
                //here we need to save the new data in the memory

                sprintf(current_history,"%s,%s,%s,%0.2f,%s",current_date, current_time,liquid[current_liquid_index],consumed_level,calorie[current_liquid_index]);
                // while (data_counter < 58) {
                write_user_history();
                //     read_user_history();
                //}*/
                clear_screen();
                //resetting the values
                current_level=0;
                previous_level=0;
                consumed_level=0;
                display_string(2,0,"||||||||||||||||",0x00,0x00);
                display_string(4,1,liquid[current_liquid_index],0xFF,0xFF);
                display_string(5,1,calorie[current_liquid_index],0xFF,0xFF);
                display_string(5,4," cal/8 oz",0xFF,0xFF);
                display_string(7,0,"||||||||||||||||",0x00,0x00);
                display_string(9,0," <     ok     > ",0XFF, 0x00);
            }
            counter_for_display=0;
        }


    }//end  main while

}

void initial_setup()
{
    button_onrise_function_link();          //setup interrupt for buttons
    pc.baud(9600);                          // for setting baud rate for cellphone or pc connection
    auto_baud();                            // for setting baud rate for the lcd
    clear_screen();                         // clear the screen in the beginning
    set_font();                             // set font size and stuffs
    set_color();
    display_string(5,1,"Smart Mug v1",0xFF,0xFF);
    readDatabase();
    write_user_counters();
    read_user_counters();

    wait(0.5);
    clear_screen();
    current_state=1;
    display_string(2,0,"||||||||||||||||",0x00,0x00);
    display_string(4,1,liquid[current_liquid_index],0xFF,0xFF);
    display_string(5,1,calorie[current_liquid_index],0xFF,0xFF);
    display_string(5,4," cal/8 oz",0xFF,0xFF);
    display_string(7,0,"||||||||||||||||",0x00,0x00);
    display_string(9,0," <     ok     > ",0XFF, 0x00);
    scale_to_register= (max_level - min_level)/10;
}

/*===========================THE BUTTONS===============================================*/
void button_onrise_function_link()
{
    up_button.rise(&up_pressed_func);
    down_button.rise(&down_pressed_func);
    ok_button.rise(&ok_pressed_func);
}

void interrupt_condition_handler(int button)
{
    if (button == 1) {
        current_liquid_index--;
        if(current_liquid_index <1) current_liquid_index=10;
        clear_screen();
        display_string(2,0,"||||||||||||||||",0x00,0x00);
        display_string(4,1,liquid[current_liquid_index],0xFF,0xFF);
        display_string(5,1,calorie[current_liquid_index],0xFF,0xFF);
        display_string(5,4," cal/8 oz",0xFF,0xFF);
        display_string(7,0,"||||||||||||||||",0x00,0x00);
        display_string(9,0," <     ok     > ",0XFF, 0x00);


    }
    if (button ==2) {
        current_liquid_index++;
        if (current_liquid_index >10) current_liquid_index=1;
        clear_screen();
        display_string(2,0,"||||||||||||||||",0x00,0x00);
        display_string(4,1,liquid[current_liquid_index],0xFF,0xFF);
        display_string(5,1,calorie[current_liquid_index],0xFF,0xFF);
        display_string(5,4," cal/8 oz",0xFF,0xFF);
        display_string(7,0,"||||||||||||||||",0x00,0x00);
        display_string(9,0," <     ok     > ",0XFF, 0x00);
    }

    if (button==3) {
        if ( current_state==1) {
            //clear_screen();
            //display_string(5,1,liquid[current_liquid_index],0xFF,0xFF);
            drink_session_off_signal=1;
            //here we need to save value from the drink sessions
        } else if (current_state==2) {
            drink_session_on=1;
        }
        counter_for_display= 9999999;
    }

}

void drink_session_handler()
{
    char level[5]="";
    if(drink_session_off_signal==0) {
        clear_screen();
        //display_string(4,1,liquid[current_liquid_index],0x00,0x00);
        //display_string(5,1,"remainng liquid",0x00,0x00);
        //display_string(6,1,"current temperature",0x00,0x00);

        display_string(0,0,"----------------", 0xFF,0xFF);
        display_string(1,1,"Drink Session",0xFF,0xFF);
        display_string(2,0,"----------------", 0xFF,0xFF);
        display_string(3,1,liquid[current_liquid_index],0xFF,0xFF);
        display_string(4,1,calorie[current_liquid_index],0xFF,0xFF);
        display_string(4,4," cal/8 oz",0xFF,0xFF);

        level_sensor_handler();
        sprintf(level,"%.2f",current_level);
        display_string(5,1,level,0xFF,0xFF);
        sprintf(level,"%.2f",previous_level);
        display_string(5,6,level,0xFF,0xFF);
        sprintf(level,"%.2f",consumed_level);
        display_string(5,11,level,0xFF,0xFF);


        read_temperature();
        display_string(7,1,current_temperature,0xFF,0xFF);
        read_time_date();
        display_string(8,1,current_time,0xFF,0xFF);
        display_string(9,0,"     -back-     ",0xFF,0xFF);
    }
    if(drink_session_off_signal==1) {
        drink_session_on=0;
        drink_session_off_signal=0;
    }

}


void download_handler()
{
    char options[1];
    if (pc.readable()) {

        if(hand_shake == false) {
            options[0]=pc.getc();
            if(options[0]=='D') {
                // pc.printf("%s\n","got it");
                pc.printf("%s\n","D!");
                hand_shake = true;
                display_string(9,1,"Downloading...",0xFF,0xFF);
            } else if (options[0]=='S') {
                pc.printf("%s\n","S!");
                if (synced_app_counter < data_counter) {

                    for (data_cursor= synced_app_counter; data_cursor<data_counter; data_cursor++) {

                        display_string(0,1,"for loop",0xFF,0xFF);
                        wait(0.5);
                        display_string( 0,1,"for loop",0x00,0x00);
                        read_user_history();
                        pc.printf("%s",temp_string);
                        pc.printf("data_cursor=%c data_counter=%c synced_app_counter%c",data_cursor,data_counter, synced_app_counter);
                        //if (data_cursor+1<data_counter) pc.printf(",");
                    }

                    synced_app_counter=data_cursor;
                    pc.printf("data_cursor=%c data_counter=%c synced_app_counter%c",data_cursor,data_counter, synced_app_counter);
                    write_user_counters();
                    pc.printf("\n");
                } else if (synced_app_counter > data_counter) {
                    data_cursor = synced_app_counter;
                    while( data_cursor < 58) {
                        display_string(0,1,"for loop",0xFF,0xFF);
                        wait(0.5);
                        display_string( 0,1,"for loop",0x00,0x00);
                        read_user_history();
                        pc.printf("%s",temp_string);
                        pc.printf("data_cursor=%c data_counter=%c synced_app_counter%c",data_cursor,data_counter, synced_app_counter);
                        data_cursor++;
                    }
                    if (data_cursor == 58) data_cursor = 48;

                    for (; data_cursor<data_counter; data_cursor++) {

                        display_string(0,1,"for loop",0xFF,0xFF);
                        wait(0.5);
                        display_string( 0,1,"for loop",0x00,0x00);
                        read_user_history();
                        pc.printf("%s",temp_string);
                        pc.printf("data_cursor=%c data_counter=%c synced_app_counter%c",data_cursor,data_counter, synced_app_counter);
                        //if (data_cursor+1<data_counter) pc.printf(",");
                    }

                    synced_app_counter=data_cursor;
                    pc.printf("data_cursor=%c data_counter=%c synced_app_counter%c",data_cursor,data_counter, synced_app_counter);
                    write_user_counters();
                    pc.printf("\n");




                } else if (synced_app_counter == data_counter) {

                    pc.printf("nothing\n");


                }
                //   pc.printf("\n");
                //read_user_history();
                //pc.printf("%s",temp_string);
                //pc.printf(",");
                //pc.printf("%s",temp_string);
                //pc.printf("\n");
                display_string(8,1,"inside upload",0xFF,0xFF);
            } else
                display_string(8,1,"mistake",0xFF,0xFF);

        } else if (hand_shake == true) {
            pc.scanf("%[^\n]s",temp_string);
            //pc.printf("%s\n",buffer);
            char *p;
            p = strtok(temp_string, "#");
            strcpy(liquid[countEntry], p);

            p = strtok(NULL, "#");
            strcpy(calorie[countEntry], p);
            countEntry++;

            if(countEntry >10) {
                hand_shake = false;
                display_string(2,1,"handsake true",0xFF,0xFF);
                countEntry = 1;
                if(liquid[1][0]=='D') {
                    for (int i=0; i<15; i++) {
                        liquid[1][i]=liquid[1][i+1];
                    }

                }
                writeDatabase();
                readDatabase();
                display_string(9,1,"Downloading...",0x70,0xDB);
                pc.printf("%s\n","E!");
                //now update database;
            } else {
                pc.printf("%s\n","D!");

            }
        }
    } else if(1) {
        //pc.printf("\r%s\n","A");
    }


}

void save_drink_animation()
{
    display_string(5,1," saving drink", 0xFF,0xFF);
    display_string(6,1," session", 0xFF, 0xFF);
    //save the values here which will be later sent to the gui and app
    wait(0.2);
    display_string(6,10,".", 0xFF, 0xFF);
    wait(0.2);
    display_string(6,11,".", 0xFF, 0xFF);
    wait (0.2);
    display_string(6,12,".", 0xFF, 0xFF);
    wait (0.2);
}

void writeDatabase()
{
    set_address(0x00,0x00,0x50,0x50);

    //for loop below writes liquid names to the sd card
    for(int i=1; i<=10; i++) {
        for(int j=0; j<=20; j++) {
            writeByte(liquid[i][j]);
        }

    }
    //for loop below writes calories into the sd card
    for(int i=1; i<=10; i++) {
        for(int j=0; j<=5; j++) {
            writeByte(calorie[i][j]);
        }
    }
}


void readDatabase()
{
    set_address(0x00,0x00,0x50,0x50);
    //char g[2];
    for(int i=1; i<=10; i++) {
        for(int j=0; j<=20; j++) {
            while (!lcd.writeable()) {}
            lcd.putc(0x40);

            while (!lcd.writeable()) {}
            lcd.putc(0x72);

            while (!lcd.readable()) {}     //receiving the acknowledgement bit
            liquid[i][j]=lcd.getc();
            //sprintf(g,"%c",lcd.getc());
            // clear_screen();
            //display_string(10,10,g,0xFF,0xFF);
            //wait(0.01);
        }
    }
    for(int i=1; i<=10; i++) {
        for(int j=0; j<=5; j++) {
            while (!lcd.writeable()) {}
            lcd.putc(0x40);

            while (!lcd.writeable()) {}
            lcd.putc(0x72);

            while (!lcd.readable()) {}     //receiving the acknowledgement bit
            calorie[i][j]=lcd.getc();
            // sprintf(g,"%c",lcd.getc());
            //clear_screen();
            //display_string(10,10,g,0xFF,0xFF);
            //wait(0.5);
        }
    }

}

void set_address(int hex1, int hex2, int hex3, int hex4)
{
    while (!lcd.writeable()) {}
    lcd.putc(0x40);

    while (!lcd.writeable()) {}
    lcd.putc(0x41);

    while (!lcd.writeable()) {}
    lcd.putc(hex1);

    while (!lcd.writeable()) {}
    lcd.putc(hex2);

    while (!lcd.writeable()) {}
    lcd.putc(hex3);

    while (!lcd.writeable()) {}
    lcd.putc(hex4);

    while (!lcd.readable()) {}
    lcd.getc();
    //pc.printf("\n\rpointer set %x ",lcd.getc());
}



void read_time_date()
{
    time_t seconds = time(NULL);
    //http://mbed.org/handbook/Time?action=view&revision=11592
    //char buffer[32];
    //strftime(date_time, 16, "time:%X date:%m/%d/%y", localtime(&seconds));
    //pc.printf("\r %s \n", buffer);
    strftime(current_time, 16, "%H:%M %p", localtime(&seconds));
    strftime(current_date, 16, "%m/%d/%y", localtime(&seconds));
    //clear_screen();
    //display_string(1,1,buffer,0xE0,0xE0);
}

void writeByte(char a)
{
    while (!lcd.writeable()) {}
    lcd.putc(0x40);

    while (!lcd.writeable()) {}
    lcd.putc(0x77);

    while (!lcd.writeable()) {}
    lcd.putc(a);

    while (!lcd.readable()) {}     //receiving the acknowledgement bit
    lcd.getc();
}

void auto_baud()
{
    while (!lcd.writeable()) {}    //command to set the auto baud
    lcd.putc('U');

    while (!lcd.readable()) {}     //receiving the acknowledgement bit
    while(lcd.getc() != 0x06) lcd.putc('U');
    //pc.printf("\n\rauto baud set");
}

void clear_screen()
{
    while (!lcd.writeable()) {}    //command to clear the screen
    lcd.putc('E');

    while (!lcd.readable()) {}     //receiving the acknowledgement bit
    // pc.printf("\n\rlcd screen cleared");
    // pc.putc(lcd.getc());
    lcd.getc();
}

void display_image(int menu_num)
{
    clear_screen();

    int address=0xC0;
    if (menu_num == 0)address=0x80;
    if (menu_num == 1)address=0xC0;
    if (menu_num == 2)address=0x00;
    if (menu_num == 3)address=0x40;
    pc.printf("%d  %x", menu_num, address);

    while (!lcd.writeable()) {}    //ext_cmd
    lcd.putc('@');
    while (!lcd.writeable()) {}    //command header byte
    lcd.putc(0x49);
    while (!lcd.writeable()) {}    //horizontal start position
    lcd.putc(0x00);
    while (!lcd.writeable()) {}    //vertical start position
    lcd.putc(0x00);
    while (!lcd.writeable()) {}    //width
    lcd.putc(0x80);
    while (!lcd.writeable()) {}    //height
    lcd.putc(0x80);
    while (!lcd.writeable()) {}    //colormode
    lcd.putc(0x10);
    while (!lcd.writeable()) {}    //address
    lcd.putc(0x00);
    while (!lcd.writeable()) {}    //address
    lcd.putc(0x00);
    while (!lcd.writeable()) {}    //address
    lcd.putc(address);
    while (!lcd.readable()) {}     //receiving the acknowledgement bit
    pc.putc(lcd.getc());
}

void display_string(int row, int col, char* str,int color1,int color2)
{
    while (!lcd.writeable()) {}    //string text
    lcd.putc(0x73);
    while (!lcd.writeable()) {}    //col
    lcd.putc(col);
    while (!lcd.writeable()) {}    //row
    lcd.putc(row);
    while (!lcd.writeable()) {}    //5x7 font
    lcd.putc(0x02);
    while (!lcd.writeable()) {}    //color1
    lcd.putc(color1);
    while (!lcd.writeable()) {}    //color2
    lcd.putc(color2);
    while (!lcd.writeable()) {}    //string
    //lcd.putc(0x41);
    lcd.printf("%s",str);
    while (!lcd.writeable()) {}    //terminator
    lcd.putc(0x00);
    while (!lcd.readable()) {}     //receiving the acknowledgement bit
    //pc.putc(lcd.getc());
    lcd.getc();
}

void set_font()
{
    while (!lcd.writeable()) {}    //command to set the font
    lcd.putc(0x46);
    while (!lcd.writeable()) {}    //command to set 5x7 small sized font
    lcd.putc(0x02);
    while (!lcd.readable()) {}     //receiving the acknowledgement bit
    //pc.putc(lcd.getc());
    lcd.getc();
    //pc.printf("\nfont is set");
}

void set_color()
{
    while (!lcd.writeable()) {}    //command to change the background color
    lcd.putc(0x4B);
    while (!lcd.writeable()) {}    //command to set msb for color
    lcd.putc(0x70);
    while (!lcd.writeable()) {}    //command to set lsb for color
    lcd.putc(0xDB);
    lcd.getc();

}

void read_temperature()
{
    sprintf(current_temperature,"%.1f C",temperature.read()*3.3*100);
}


void level_sensor_handler()
{

    /*  to print tilt level
    char tilt[5]="";
    sprintf(tilt,"%.2f",tiltsensor.read());
    display_string(9,0,tilt,0xFF,0xFF);
    */
    if (tiltsensor.read() >0.7) display_string(9,0,"mug tilted",0xFF,0xFF);
    if (tiltsensor.read() < 0.5) {
        current_level=clcLevelSensor.read();
        if (current_level >= previous_level) {      //it means liquid added
            if((current_level - previous_level) > scale_to_register) {
                previous_level=current_level;
            }
        }
        if (current_level<previous_level) {         //it means liquid drank
            if ((previous_level - current_level) > scale_to_register) {
                consumed_level += (previous_level - current_level);
                previous_level=current_level;
            }
        }
    }

}

void write_user_counters()
{
    set_address(0x00,0x50,0x00,0x00);
    writeByte(data_counter);
    writeByte(synced_GUI_counter);
    writeByte(synced_app_counter);
}

void read_user_counters()
{
    set_address(0x00,0x50,0x00,0x00);

    while (!lcd.writeable()) {}
    lcd.putc(0x40);

    while (!lcd.writeable()) {}
    lcd.putc(0x72);

    while (!lcd.readable()) {}     //receiving the acknowledgement bit
    data_counter=lcd.getc();

    while (!lcd.writeable()) {}
    lcd.putc(0x40);

    while (!lcd.writeable()) {}
    lcd.putc(0x72);

    while (!lcd.readable()) {}     //receiving the acknowledgement bit
    synced_GUI_counter=lcd.getc();

    while (!lcd.writeable()) {}
    lcd.putc(0x40);

    while (!lcd.writeable()) {}
    lcd.putc(0x72);

    while (!lcd.readable()) {}     //receiving the acknowledgement bit
    synced_app_counter=lcd.getc();

    //pc.printf("%c %c %c", data_counter, synced_GUI_counter, synced_app_counter);


}
void write_user_history()
{
    if (data_counter == 48) {
        set_address(0x00,0x70,0x00,0x00);
        //for loop below writes history to the sd card
        for(int i=0; i<50; i++) {
            writeByte(current_history[i]);
        }
    }
    if (data_counter == 49) {
        set_address(0x00,0x71,0x00,0x00);
        //for loop below writes history to the sd card
        for(int i=0; i<50; i++) {
            writeByte(current_history[i]);
        }
    }
    if (data_counter == 50) {
        set_address(0x00,0x72,0x00,0x00);
        //for loop below writes history to the sd card
        for(int i=0; i<50; i++) {
            writeByte(current_history[i]);
        }
    }
    if (data_counter == 51) {
        set_address(0x00,0x73,0x00,0x00);
        //for loop below writes history to the sd card
        for(int i=0; i<50; i++) {
            writeByte(current_history[i]);
        }
    }
    if (data_counter == 52) {
        set_address(0x00,0x74,0x00,0x00);
        //for loop below writes history to the sd card
        for(int i=0; i<50; i++) {
            writeByte(current_history[i]);
        }
    }
    if (data_counter == 53) {
        set_address(0x00,0x75,0x00,0x00);
        //for loop below writes history to the sd card
        for(int i=0; i<50; i++) {
            writeByte(current_history[i]);
        }
    }
    if (data_counter == 54) {
        set_address(0x00,0x76,0x00,0x00);
        //for loop below writes history to the sd card
        for(int i=0; i<50; i++) {
            writeByte(current_history[i]);
        }
    }
    if (data_counter == 55) {
        set_address(0x00,0x77,0x00,0x00);
        //for loop below writes history to the sd card
        for(int i=0; i<50; i++) {
            writeByte(current_history[i]);
        }
    }
    if (data_counter == 56) {
        set_address(0x00,0x78,0x00,0x00);
        //for loop below writes history to the sd card
        for(int i=0; i<50; i++) {
            writeByte(current_history[i]);
        }
    }
    if (data_counter == 57) {
        set_address(0x00,0x79,0x00,0x00);
        //for loop below writes history to the sd card
        for(int i=0; i<50; i++) {
            writeByte(current_history[i]);
        }
    }


    data_counter++;
    if (data_counter >57) data_counter=48;
    write_user_counters();

}



void read_user_history()
{
    if (data_cursor == 48) {
        set_address(0x00,0x70,0x00,0x00);
        for(int i=0; i<50; i++) {
            while (!lcd.writeable()) {}
            lcd.putc(0x40);

            while (!lcd.writeable()) {}
            lcd.putc(0x72);

            while (!lcd.readable()) {}     //receiving the acknowledgement bit
            temp_string[i]=lcd.getc();
        }
        //pc.printf("after reading from memory 70 %s",temp_string);
    }
    if (data_cursor == 49) {
        int address= 0x71;
        display_string(0,1,"inside slot2",0xFF,0xFF);

        set_address(0x00,address,0x00,0x00);
        for(int i=0; i<50; i++) {
            while (!lcd.writeable()) {}
            lcd.putc(0x40);

            while (!lcd.writeable()) {}
            lcd.putc(0x72);

            while (!lcd.readable()) {}     //receiving the acknowledgement bit
            temp_string[i]=lcd.getc();
        }


        //pc.printf("after reading from memory 71 %s",temp_string);
    }

    if (data_cursor == 50) {
        set_address(0x00,0x72,0x00,0x00);
        for(int i=0; i<50; i++) {
            while (!lcd.writeable()) {}
            lcd.putc(0x40);

            while (!lcd.writeable()) {}
            lcd.putc(0x72);

            while (!lcd.readable()) {}     //receiving the acknowledgement bit
            temp_string[i]=lcd.getc();
        }

        //pc.printf("after reading from memory 72 %s",temp_string);
    }

    if (data_cursor == 51) {
        set_address(0x00,0x73,0x00,0x00);
        for(int i=0; i<50; i++) {
            while (!lcd.writeable()) {}
            lcd.putc(0x40);

            while (!lcd.writeable()) {}
            lcd.putc(0x72);

            while (!lcd.readable()) {}     //receiving the acknowledgement bit
            temp_string[i]=lcd.getc();
        }

        //pc.printf("after reading from memory 73 %s",temp_string);
    }
    if (data_cursor == 52) {
        set_address(0x00,0x74,0x00,0x00);
        for(int i=0; i<50; i++) {
            while (!lcd.writeable()) {}
            lcd.putc(0x40);

            while (!lcd.writeable()) {}
            lcd.putc(0x72);

            while (!lcd.readable()) {}     //receiving the acknowledgement bit
            temp_string[i]=lcd.getc();
        }

        //pc.printf("after reading from memory 74%s",temp_string);
    }
    if (data_cursor == 53) {
        set_address(0x00,0x75,0x00,0x00);
        for(int i=0; i<50; i++) {
            while (!lcd.writeable()) {}
            lcd.putc(0x40);

            while (!lcd.writeable()) {}
            lcd.putc(0x72);

            while (!lcd.readable()) {}     //receiving the acknowledgement bit
            temp_string[i]=lcd.getc();
        }

        // pc.printf("after reading from memory 75%s",temp_string);
    }
    if (data_cursor == 54) {
        set_address(0x00,0x76,0x00,0x00);
        for(int i=0; i<50; i++) {
            while (!lcd.writeable()) {}
            lcd.putc(0x40);

            while (!lcd.writeable()) {}
            lcd.putc(0x72);

            while (!lcd.readable()) {}     //receiving the acknowledgement bit
            temp_string[i]=lcd.getc();
        }

        //pc.printf("after reading from memory 76 %s",temp_string);
    }
    if (data_cursor == 55) {
        set_address(0x00,0x77,0x00,0x00);
        for(int i=0; i<50; i++) {
            while (!lcd.writeable()) {}
            lcd.putc(0x40);

            while (!lcd.writeable()) {}
            lcd.putc(0x72);

            while (!lcd.readable()) {}     //receiving the acknowledgement bit
            temp_string[i]=lcd.getc();
        }

        //pc.printf("after reading from memory 77 %s",temp_string);
    }
    if (data_cursor == 56) {
        set_address(0x00,0x78,0x00,0x00);
        for(int i=0; i<50; i++) {
            while (!lcd.writeable()) {}
            lcd.putc(0x40);

            while (!lcd.writeable()) {}
            lcd.putc(0x72);

            while (!lcd.readable()) {}     //receiving the acknowledgement bit
            temp_string[i]=lcd.getc();
        }
        // pc.printf("after reading from memory 78%s",temp_string);
    }
    if (data_cursor == 57) {
        set_address(0x00,0x79,0x00,0x00);
        for(int i=0; i<50; i++) {
            while (!lcd.writeable()) {}
            lcd.putc(0x40);

            while (!lcd.writeable()) {}
            lcd.putc(0x72);

            while (!lcd.readable()) {}     //receiving the acknowledgement bit
            temp_string[i]=lcd.getc();
        }

        //pc.printf("after reading from memory 79 %s",temp_string);
    }
}