Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BMP180 N5110 PowerControl mbed
Diff: main.cpp
- Revision:
- 6:0aca5c17c988
- Parent:
- 5:6d85cafa1085
- Child:
- 7:104ac8e707e6
--- a/main.cpp Mon Apr 13 20:35:21 2015 +0000 +++ b/main.cpp Sun Apr 19 00:32:26 2015 +0000 @@ -86,6 +86,11 @@ {4,70.0} //state 4, 70'C }; +char tempUnit [4] = {'C','F','K','R'}; //character that stores temperature unit type. + +char pressUnit[3] = {'M','P','A'}; //character that stores pressure units. M - millibars P - Pascals A - atmospheres + +char AltUnit[3] = {'m','f','y'}; //character that stores altitude units. m - metres f - feet y - yards /** @namespace bmp180 @@ -157,7 +162,7 @@ @namespace displayTimer @brief Ticker object to display readings on screen with a specified interval. Can be varied with Interrupt Service Routines. */ -Ticker displayTimer; +Ticker displayTimer; //ticker object to display readings /* @namespace leds @@ -178,20 +183,25 @@ @brief Object that belongs to the N5110 class. Set up pin outputs for the Nokia 5110 display. Defined in N5110.h. @see https://developer.mbed.org/users/eencae/code/N5110/ */ -void printReadings(); -void clearCells(); +void printReadings(); // declare function to print readings here, which is then defined after the main() function. +void clearCells(); //declare function to clear all cells should there be a need for it. Even though lcd.clear() also does the job this can be handy in case of failure. -float temp = 0.0; -float press = 0.0; -float altitude = 0.0; +float temp = 0.0; //declare the temp variable for temperature universally so that it can be shared across functions to represent temperature. +float press = 0.0; //do the same for pressure using press. +float altitude = 0.0; //and altitude using, well, altitude :P -int i = 0; -int j = 0; +int i = 0; //represents the column number (horizontal pixel number) of the display. +int j = 0; //represents the row number of the display. int dispSetting = 0; //set display setting to default. int recSetting = 3; //set log setting to default. int tempSetting = 2; //set temperature threshold to default. +int tempUnitSetting = 0; //set temperature unit setting to default. +int pressUnitSetting = 0; //set pressure unit setting to default. +int altUnitSetting = 0; //and do the same for altitude. +int subMenuId = 0; //int used to store sub-menu number. For instance pressing the menu button once and then Button One gives Sub-Menu 1. + N5110 lcd(p7,p8,p9,p10,p11,p13,p21); //VCC,SCE,RST,DC,MOSI,SCLK,BACKLIGHT ///////////The following pieces of code are to configure real-time clock for the data logger.************* @@ -257,7 +267,11 @@ void menuButtonPressed() { - menuButtonFlag = !menuButtonFlag; //if set to 1, set it back to 0. If not set, set the flag. + menuButtonFlag++; //increment the flag to access different menu states. + + if(menuButtonFlag > 2) { //if menu button has been clicked three times + menuButtonFlag = 0; //go back to the measurements menu + } } int buttonOneFlag = 0; /*!< Button One flag set in ISR */ @@ -265,10 +279,10 @@ void buttonOnePressed() { - if(menuButtonFlag) { //if menu button has been pressed and main menu entered - menuButtonFlag = 0; //set menu button flag to 0 so that one can proceed to the temperature setting menu and go back by pressing again + if(menuButtonFlag > 0) { //if menu button has been pressed and main menu entered buttonOneAltFlag = !buttonOneAltFlag; //set/reset-if-set alternate flag and proceed to next menu - } else { + } + else { buttonOneFlag = !buttonOneFlag; //set/reset-if-set flag if not navigated to a menu } } @@ -278,10 +292,10 @@ void buttonTwoPressed() { - if(menuButtonFlag) { - menuButtonFlag = 0; + if(menuButtonFlag > 0) { buttonTwoAltFlag = !buttonTwoAltFlag; - } else { + } + else { buttonTwoFlag = !buttonTwoFlag; } } @@ -293,7 +307,8 @@ { if(menuButtonFlag > 0) { buttonThreeAltFlag = !buttonThreeAltFlag; - } else + } + else buttonThreeFlag = !buttonThreeFlag; } @@ -328,7 +343,7 @@ */ void timerExpiLog() { - logTimerFlag = 0; + logTimerFlag = 1; } void displayInitSplash() //display splash screen @@ -340,6 +355,100 @@ lcd.printString("Esendag",20,5); } +void displayMenuOne(){ + lcd.printString("Settings Menu",0,0); + lcd.printString("One",0,1); + lcd.printString("Use Buttons",0,2); + lcd.printString("To change",0,3); + lcd.printString("Settings",0,4); + lcd.refresh(); +} + +void displayMenuTwo(){ + lcd.printString("Settings Menu",0,0); + lcd.printString("Two",0,1); + lcd.printString("Use menuButton",0,2); + lcd.printString("To Go Back To",0,3); + lcd.printString("Display menu",0,4); + lcd.refresh(); +} + +void displayTempUnit(){ + lcd.printString("Use Button 2",0,0); + lcd.printString("To decrease",0,1); + lcd.printString("Temp. Setting;",0,2); + lcd.printString("Button 3",0,3); + lcd.printString("To increase.",0,4); + + char bufferSt[14]; //buffer to store string + sprintf(bufferSt,"current:%c",tempUnit[tempUnitSetting]); //write the typed string and the current unit setting onto the buffer + + lcd.printString(bufferSt,0,5); //print the buffer + lcd.refresh(); //needs to refresh to write the string buffers to the display +} + +void displayPressUnit(){ + lcd.printString("Use Button 1",0,0); + lcd.printString("To decrease",0,1); + lcd.printString("Press Setting;",0,2); + lcd.printString("Button 3",0,3); + lcd.printString("To increase.",0,4); + + char bufferSt[14]; //buffer to store string + sprintf(bufferSt,"current:%c",pressUnit[pressUnitSetting]); + + lcd.printString(bufferSt,0,5); + lcd.refresh(); +} + +void displayDispMenu(){ + lcd.printString("Use Button 2",0,0); + lcd.printString("To decrease",0,1); + lcd.printString("Time Setting;",0,2); + lcd.printString("Button 3",0,3); + lcd.printString("To increase.",0,4); + + char bufferSt[14]; //buffer to store string + //just a universally applicable if-else if statement to create a string out of current time setting should more time settings be added... + if(dispInterval[dispSetting].time >= 1.0){ //if time setting is a second or more + sprintf(bufferSt,"set:%.1f s",dispInterval[dispSetting].time); + } + else if(dispInterval[dispSetting].time < 1.0){ //if time setting is less than a second + float tempTime = dispInterval[dispSetting].time * 1000.0; //convert time to milliseconds + sprintf(bufferSt,"set:%.1f ms",tempTime); + } + lcd.printString(bufferSt,0,5); + lcd.refresh(); +} + +void displayThresholdTemp(){ + lcd.printString("Use Button 1",0,0); + lcd.printString("To decrease",0,1); + lcd.printString("Temp Thresh;",0,2); + lcd.printString("Button 3",0,3); + lcd.printString("To increase.",0,4); + + char bufferSt[14]; //buffer to store string + sprintf(bufferSt,"current:%.1f",tempThres[tempSetting].thresTemp); + + lcd.printString(bufferSt,0,5); + lcd.refresh(); +} + +void displayAltitudeUnit(){ + lcd.printString("Use Button 1",0,0); + lcd.printString("To decrease",0,1); + lcd.printString("Altitude Set;",0,2); + lcd.printString("Button 2",0,3); + lcd.printString("To increase.",0,4); + + char bufferSt[14]; //buffer to store string + sprintf(bufferSt,"current:%c",AltUnit[altUnitSetting]); + + lcd.printString(bufferSt,0,5); + lcd.refresh(); +} + //1 bar is 100000 Pa. An atm is 101325 Pa. Therefore an mb is 100 Pa. int main() @@ -347,9 +456,17 @@ splashFlip.attach(&splashDelay,3.0); //attach timer and wait for ISR to be called - displayTimer.attach(&timerExpiDisplay,1.0); //do the same for display dispInterval[dispSetting].time + displayTimer.attach(&timerExpiDisplay,dispInterval[dispSetting].time); //do the same for display dispInterval[dispSetting].time + + //logTimer.attach(&timerExpiLog,recInterval[recSetting].time); + + menuButton.rise(&menuButtonPressed); //event generated on rising edge (a positive spike in voltage), indicated by .rise - logTimer.attach(&timerExpiLog,recInterval[recSetting].time); //do the same for logging + buttonOne.rise(&buttonOnePressed); + + buttonTwo.rise(&buttonTwoPressed); + + buttonThree.rise(&buttonThreePressed); // first need to initialise display lcd.init(); @@ -372,11 +489,9 @@ splashFlip.detach(); //detach Timeout object lcd.clear(); clearCells(); - lcd.refresh(); + lcd.refresh(); //need to refresh to write buffer on lcd if(dispTimerFlag) { - dispTimerFlag = 0; - //read values (T in degrees Celsius and P in mb). measurement = bmp180.readValues(); temp = measurement.temperature; @@ -387,10 +502,121 @@ Also to bear in mind is that a metre is 3.2808399 feet; or 1.0936133 yards. Three feet equals a yard. */ altitude = 44330.0*(1.0-(pow((press/PNought),(1.0/5.255)))); + dispTimerFlag = 0; + printReadings(); lcd.refresh(); + } + + if(menuButtonFlag == 1){ //if menu button has been pressed once + + lcd.clear(); //clear the lcd display + displayMenuOne(); //display the menu strings function + while(buttonOneAltFlag){ //if Button One is pressed AND the menu button is; + lcd.clear(); //clear lcd + displayTempUnit(); //display unit change menu + subMenuId = 1; //set sub-menu number to avoid confusions for the processor as it might change other settings! + + if(buttonTwoAltFlag && subMenuId == 1){ //if added to the above conditions button 2 is pressed + tempUnitSetting--; //decrease the unit setting + buttonTwoAltFlag = 0; //reset flag to avoid repeated unit changes on loop + if(tempUnitSetting < 0) //if it goes below 0 + tempUnitSetting = 3; //go back to the highest value + } + if(buttonThreeAltFlag && subMenuId == 1){ //if otherwise button 3 has been pressed + tempUnitSetting++; //increase temp setting + buttonThreeAltFlag = 0; + if(tempUnitSetting > 3) //if the upper limit has been exceeded (3) + tempUnitSetting = 0; //reset it to zero + } + } //close button one alt + buttonOneAltFlag = 0; + + while(buttonTwoAltFlag){ //if Button Two flag is set AND the menu button is; + lcd.clear(); //clear lcd + displayPressUnit(); //display unit change menu + subMenuId = 2; + + if(buttonOneAltFlag && subMenuId == 2){ //if added to the above conditions button 1 is pressed + pressUnitSetting--; //decrease the unit setting + buttonOneAltFlag = 0; //reset flag to avoid repeated unit changes on loop + if(pressUnitSetting < 0) //if it goes below 0 + pressUnitSetting = 2; //go back to the highest value + } + if(buttonThreeAltFlag && subMenuId == 2){ //if otherwise button 3 has been pressed + pressUnitSetting++; //increase pressure setting + buttonThreeAltFlag = 0; + if(pressUnitSetting > 2) //if the upper limit has been exceeded (2) + pressUnitSetting = 0; //reset it to zero + } + } //close button two alt + buttonTwoAltFlag = 0; + } //close menu button flag + + + else if(menuButtonFlag == 2){ //if menu button has been pressed twice + + lcd.clear(); //clear the lcd display + displayMenuTwo(); //display the menu strings function + while(buttonOneAltFlag){ //if Button One is pressed AND the menu button is; + lcd.clear(); //clear lcd + displayDispMenu(); //display unit change menu + subMenuId = 4; + if(buttonTwoAltFlag && subMenuId == 4){ //if added to the above conditions button 2 is pressed + dispSetting--; //decrease setting + buttonTwoAltFlag = 0; //reset flag to avoid repeated unit changes on loop + if(dispSetting < 0) //if it goes below 0 + dispSetting = 5; //go back to the highest value + } + if(buttonThreeAltFlag && subMenuId == 4){ //if otherwise button 3 has been pressed + dispSetting++; //increase setting + buttonThreeAltFlag = 0; + if(dispSetting > 5) //if the upper limit has been exceeded (3) + dispSetting = 0; //reset it to zero + } + } //close button one alt + buttonOneAltFlag = 0; + + while(buttonTwoAltFlag){ //if Button Two flag is set AND the menu button is; + lcd.clear(); //clear lcd + displayThresholdTemp(); //display unit change menu + subMenuId = 5; + if(buttonOneAltFlag && subMenuId == 5){ //if added to the above conditions button 1 is pressed + tempSetting--; //decrease setting + buttonOneAltFlag = 0; //reset flag to avoid repeated unit changes on loop + if(tempSetting < 0) //if it goes below 0 + tempSetting = 4; //go back to the highest value + } + if(buttonThreeAltFlag && subMenuId == 5){ //if otherwise button 3 has been pressed + tempSetting++; //increase setting + buttonThreeAltFlag = 0; + if(tempSetting > 4) //if the upper limit has been exceeded (2) + tempSetting = 0; //reset it to zero + } + } //close button two alt + buttonTwoAltFlag = 0; + + while(buttonThreeAltFlag){ //if Button Three flag is set AND the menu button is; + lcd.clear(); //clear lcd + displayAltitudeUnit(); //display unit change menu + subMenuId = 6; + if(buttonOneAltFlag && subMenuId == 6){ //if added to the above conditions button 1 is pressed + altUnitSetting--; //decrease the unit setting + buttonOneAltFlag = 0; //reset flag to avoid repeated unit changes on loop + if(altUnitSetting < 0) //if it goes below 0 + altUnitSetting = 2; //go back to the highest value + } + if(buttonTwoAltFlag && subMenuId == 6){ //if otherwise button 2 has been pressed + altUnitSetting++; //increase pressure setting + buttonTwoAltFlag = 0; + if(altUnitSetting > 2) //if the upper limit has been exceeded (2) + altUnitSetting = 0; //reset it to zero + } + } //close button three alt + buttonThreeAltFlag = 0; + } //close menu button flag + - } Sleep(); //put the mbed to sleep once the program flow has been completed.