Year Two Project ELEC 2645: Embedded Systems Project Portable Weather Station
Dependencies: BMP180 ConfigFile N5110 PowerControl beep mbed
TemperaturePlot.h
- Committer:
- OHstin
- Date:
- 2015-05-11
- Revision:
- 0:da2b8c7a1ec1
File content as of revision 0:da2b8c7a1ec1:
/** @file temperatureplot.h */ #ifndef TEMPERATUREPLOT_H #define TEMPERATUREPLOT_H /** @brief displays the temperature against time at various intervals @brief temperature is in degrees celsius @author Augustine K Kizito @data April 2015 */ class TemperaturePlot { private: bool changeScreen; // tracks if the user pressed a button that changes the screen int nextScreen; // tracks whether the user wants to go to //the previous screen or next screen int xCord; // tracks the x coordinate char tempString[32]; // temperature value as string bool pause; // tracks if the plotting has been paused int pInterval; // determines the intervals at which data is plotted Ticker timer; // plots data at particular intervals void onBack(); // user pressed the back button void onEnter(); // user pressed the on enter button void plotData(); // plot temperature data void clearPlot(); // clear the plotted data void pausePlot(); // it pauses plotting of data so that the user can see it public: /** Manages the execution of the Temperature Plot Screen @param - integer interval, the intervals after which temperature is plotted against time on the LCD screen @returns -1 - navigate to previous screen */ int start(int interval); }; int TemperaturePlot::start(int interval) { // Initialisations pInterval = interval; xCord = 0; // set the x cordinate to 0 pause = false; backButton.mode(PullDown); // activate pullDown Resistor enterButton.mode(PullDown); // activate pullDown Resistor backButton.rise(this,&TemperaturePlot::onBack); // call onBack when the back button is pressed enterButton.rise(this,&TemperaturePlot::onEnter); // call onBack when the back button is pressed plotData(); //plot data onto the screen lcd.printString("Deg Cel", 40,1); // plot data on LCD screen depending on the interval previously selected by the user if ( interval == 0) { timer.attach(this, &TemperaturePlot::plotData,0.1); // call ISR every 1.0 second } else if ( interval == 1) { timer.attach(this, &TemperaturePlot::plotData,0.5); // call ISR every 5 seconds } else if ( interval == 2) { timer.attach(this, &TemperaturePlot::plotData,1); // call ISR every 10 seconds } else { timer.attach(this, &TemperaturePlot::plotData,5); // call ISR every 30 seconds } changeScreen = false; debounce.start(); // start the debounce timer while (!changeScreen) { // mbed goes to sleep to save power Sleep(); } // remove all interrupts backButton.rise(NULL); enterButton.rise(NULL); timer.detach(); return nextScreen; } void TemperaturePlot::plotData() { if (xCord > 83 ) { xCord = 0; // reset the xCord back to zero clearPlot(); // clear the plot region } float temperature = getTemperature(); // retreive temperature from the sensor lcd.drawLine(xCord,(31*((50-temperature)/50)+16),xCord,47,1); // print temperature onto the screen sprintf(tempString,"%0.2f",temperature); lcd.printString(tempString,0,1); // increment the coordinate xCord++; } void TemperaturePlot::onBack() { if(debounceSuccess()) { // debouncing successful // soundt the buzze playSound(); nextScreen = -1; changeScreen = true; // user wants to go to a different screen // reset debounce timer debounce.reset(); } } void TemperaturePlot::clearPlot() { // clears the plot area for ( int x = 0; x < 84; x++) { for ( int y = 16; y < 48; y++) { lcd.clearPixel(x,y); } } lcd.refresh(); } void TemperaturePlot::onEnter() { if (debounceSuccess()) { // debouncing successful playSound(); // play sound pausePlot(); // pause any plotting debounce.reset(); // reset debounce timer } } void TemperaturePlot::pausePlot() { pause = !pause; if (pause) { timer.detach(); // detach timer and stop plotting data } else { clearPlot(); // clear the plot area xCord = 0; // start plotting from extreme left plotData(); // start plotting data again if ( pInterval == 0) { timer.attach(this, &TemperaturePlot::plotData,0.1); // call ISR every 0.1 second } else if ( pInterval == 1) { timer.attach(this, &TemperaturePlot::plotData,0.5); // call ISR every 0.5 seconds } else if ( pInterval == 2) { timer.attach(this, &TemperaturePlot::plotData,1); // call ISR every 1 seconds } else { timer.attach(this, &TemperaturePlot::plotData,5); // call ISR every 5 seconds } } } #endif