Program to display temperature and pressure readings along with date and time.
Dependencies: BMP180 N5110 PowerControl mbed
main.cpp@6:49a3fb0956ef, 2015-04-29 (annotated)
- Committer:
- el13akr
- Date:
- Wed Apr 29 16:57:55 2015 +0000
- Revision:
- 6:49a3fb0956ef
- Parent:
- 5:fb18fa86ebc3
- Child:
- 7:32a4756cba1d
all the buttons and display functions work hooray
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
el13akr | 0:c2a88630fb72 | 1 | #include "mbed.h" |
el13akr | 0:c2a88630fb72 | 2 | #include "N5110.h" |
el13akr | 0:c2a88630fb72 | 3 | #include "BMP180.h" |
el13akr | 0:c2a88630fb72 | 4 | |
el13akr | 0:c2a88630fb72 | 5 | // VCC,SCE,RST,D/C,MOSI,SCLK,LED |
el13akr | 0:c2a88630fb72 | 6 | N5110 lcd(p7,p8,p9,p10,p11,p13,p26); |
el13akr | 0:c2a88630fb72 | 7 | // Can also power (VCC) directly from VOUT (3.3 V) - |
el13akr | 0:c2a88630fb72 | 8 | // Can give better performance due to current limitation from GPIO pin |
el13akr | 0:c2a88630fb72 | 9 | |
el13akr | 0:c2a88630fb72 | 10 | Ticker timer ; //create a ticker object to read the data from the sensor |
el13akr | 3:075786ca7621 | 11 | Timeout timeOut ; //only loops once to show menu |
el13akr | 0:c2a88630fb72 | 12 | BMP180 bmp180(p28,p27); |
el13akr | 0:c2a88630fb72 | 13 | Serial serial(USBTX,USBRX); |
el13akr | 0:c2a88630fb72 | 14 | AnalogIn POT(p20); |
el13akr | 2:63ef0a1afcbe | 15 | InterruptIn graphButton(p16); //button to select graph |
el13akr | 2:63ef0a1afcbe | 16 | InterruptIn currentButton(p15); //button to select current |
el13akr | 0:c2a88630fb72 | 17 | |
el13akr | 0:c2a88630fb72 | 18 | int timerFlag= 0; |
el13akr | 0:c2a88630fb72 | 19 | int timeOutFlag = 0 ; |
el13akr | 2:63ef0a1afcbe | 20 | int graphFlag = 0 ; |
el13akr | 2:63ef0a1afcbe | 21 | int currentFlag = 0; |
el13akr | 5:fb18fa86ebc3 | 22 | float temperature ; |
el13akr | 0:c2a88630fb72 | 23 | float pressure; |
el13akr | 2:63ef0a1afcbe | 24 | void displayTemperature(); |
el13akr | 2:63ef0a1afcbe | 25 | void displayPressure(); |
el13akr | 3:075786ca7621 | 26 | void receiveData(); |
el13akr | 3:075786ca7621 | 27 | void displayTemperatureGraph(); |
el13akr | 3:075786ca7621 | 28 | void displayPressureGraph(); |
el13akr | 2:63ef0a1afcbe | 29 | |
el13akr | 2:63ef0a1afcbe | 30 | |
el13akr | 2:63ef0a1afcbe | 31 | |
el13akr | 0:c2a88630fb72 | 32 | |
el13akr | 3:075786ca7621 | 33 | void screen() //welcome screen |
el13akr | 0:c2a88630fb72 | 34 | { |
el13akr | 0:c2a88630fb72 | 35 | lcd.printString("Weather Logger",0,2); |
el13akr | 0:c2a88630fb72 | 36 | lcd.printString("3000",32,3); |
el13akr | 0:c2a88630fb72 | 37 | lcd.printString("Alex Raper",15,5); |
el13akr | 3:075786ca7621 | 38 | lcd.refresh(); //clear screen |
el13akr | 0:c2a88630fb72 | 39 | } |
el13akr | 0:c2a88630fb72 | 40 | |
el13akr | 3:075786ca7621 | 41 | void menu() //main menu screen |
el13akr | 0:c2a88630fb72 | 42 | { |
el13akr | 1:026d80a2f7a9 | 43 | lcd.clear(); |
el13akr | 6:49a3fb0956ef | 44 | if (POT>(1.0/2.0)) { //if the potentiometer is pointing to the left (temperature) |
el13akr | 3:075786ca7621 | 45 | lcd.printString("Temperature",2,2); //data type label |
el13akr | 3:075786ca7621 | 46 | lcd.printString(">",76,2); //arrow denoting a different screen can be shown by pointing potentiometer in right direction |
el13akr | 3:075786ca7621 | 47 | lcd.printString("Graph",0,5);//graph button label |
el13akr | 3:075786ca7621 | 48 | lcd.printString("Current",42,5);//current button label |
el13akr | 3:075786ca7621 | 49 | if (graphFlag) { //if the graph button is pressed |
el13akr | 3:075786ca7621 | 50 | graphFlag = 0; //reset graph flag to 0 |
el13akr | 4:f4154181d941 | 51 | displayTemperatureGraph(); |
el13akr | 6:49a3fb0956ef | 52 | |
el13akr | 0:c2a88630fb72 | 53 | |
el13akr | 2:63ef0a1afcbe | 54 | } |
el13akr | 2:63ef0a1afcbe | 55 | if (currentFlag ==1 ) { // if the current button is pressed |
el13akr | 3:075786ca7621 | 56 | currentFlag = 0; //reset current flag to 0 |
el13akr | 6:49a3fb0956ef | 57 | |
el13akr | 6:49a3fb0956ef | 58 | displayTemperature(); //display current temperature value |
el13akr | 2:63ef0a1afcbe | 59 | } |
el13akr | 0:c2a88630fb72 | 60 | } else { |
el13akr | 3:075786ca7621 | 61 | lcd.printString("Pressure",18,2);//data type label |
el13akr | 3:075786ca7621 | 62 | lcd.printString("<",2,2);//arrow denoting a different screen can be shown by pointing potentiometer in left direction |
el13akr | 3:075786ca7621 | 63 | lcd.printString("Graph",0,5);//graph button label |
el13akr | 3:075786ca7621 | 64 | lcd.printString("Current",42,5);//current button label |
el13akr | 3:075786ca7621 | 65 | if (graphFlag) { //if the graph button is pressed |
el13akr | 3:075786ca7621 | 66 | graphFlag = 0; //reset graph flag to 0 |
el13akr | 4:f4154181d941 | 67 | displayPressureGraph(); |
el13akr | 4:f4154181d941 | 68 | //lcd.printString("Menu",0,5);//menu button label |
el13akr | 4:f4154181d941 | 69 | //lcd.printString("Current",42,5);//current button label |
el13akr | 0:c2a88630fb72 | 70 | |
el13akr | 2:63ef0a1afcbe | 71 | } |
el13akr | 2:63ef0a1afcbe | 72 | if (currentFlag) { // if the current button is pressed |
el13akr | 3:075786ca7621 | 73 | currentFlag = 0; //reset current flag to 0 |
el13akr | 6:49a3fb0956ef | 74 | displayPressure();//display current pressure value |
el13akr | 2:63ef0a1afcbe | 75 | } |
el13akr | 0:c2a88630fb72 | 76 | } |
el13akr | 0:c2a88630fb72 | 77 | } |
el13akr | 0:c2a88630fb72 | 78 | |
el13akr | 6:49a3fb0956ef | 79 | |
el13akr | 2:63ef0a1afcbe | 80 | void timerExpired() |
el13akr | 2:63ef0a1afcbe | 81 | { |
el13akr | 0:c2a88630fb72 | 82 | timerFlag = 1 ; |
el13akr | 0:c2a88630fb72 | 83 | } |
el13akr | 0:c2a88630fb72 | 84 | |
el13akr | 2:63ef0a1afcbe | 85 | void timeOutStopped() |
el13akr | 2:63ef0a1afcbe | 86 | { |
el13akr | 2:63ef0a1afcbe | 87 | |
el13akr | 0:c2a88630fb72 | 88 | timeOutFlag = 1; |
el13akr | 2:63ef0a1afcbe | 89 | } |
el13akr | 0:c2a88630fb72 | 90 | |
el13akr | 2:63ef0a1afcbe | 91 | void graphButtonPressed () |
el13akr | 2:63ef0a1afcbe | 92 | { |
el13akr | 2:63ef0a1afcbe | 93 | graphFlag = 1; |
el13akr | 4:f4154181d941 | 94 | serial.printf("graph button pressed "); //used for debugging |
el13akr | 2:63ef0a1afcbe | 95 | } |
el13akr | 2:63ef0a1afcbe | 96 | |
el13akr | 2:63ef0a1afcbe | 97 | void currentButtonPressed () |
el13akr | 2:63ef0a1afcbe | 98 | { |
el13akr | 2:63ef0a1afcbe | 99 | currentFlag = 1; |
el13akr | 4:f4154181d941 | 100 | serial.printf("current button pressed "); //used for debugging |
el13akr | 2:63ef0a1afcbe | 101 | } |
el13akr | 3:075786ca7621 | 102 | void receiveData() //function to receive data from BMP |
el13akr | 0:c2a88630fb72 | 103 | { |
el13akr | 0:c2a88630fb72 | 104 | |
el13akr | 0:c2a88630fb72 | 105 | Measurement measurement; // measurement structure declared in BMP180 class |
el13akr | 0:c2a88630fb72 | 106 | |
el13akr | 0:c2a88630fb72 | 107 | // read values (T in Celsius and P in mb) and print over serial port |
el13akr | 0:c2a88630fb72 | 108 | measurement = bmp180.readValues(); |
el13akr | 3:075786ca7621 | 109 | serial.printf("T = %.2f C P = %.2f mb\n",measurement.temperature,measurement.pressure); //used for debugging |
el13akr | 0:c2a88630fb72 | 110 | |
el13akr | 3:075786ca7621 | 111 | temperature = measurement.temperature ; //formatted temperature |
el13akr | 3:075786ca7621 | 112 | pressure = measurement.pressure ; //formatted pressure |
el13akr | 0:c2a88630fb72 | 113 | |
el13akr | 0:c2a88630fb72 | 114 | } |
el13akr | 0:c2a88630fb72 | 115 | |
el13akr | 0:c2a88630fb72 | 116 | |
el13akr | 3:075786ca7621 | 117 | void displayTemperature() //function to display formatted temperature |
el13akr | 0:c2a88630fb72 | 118 | { |
el13akr | 6:49a3fb0956ef | 119 | while(1) { |
el13akr | 6:49a3fb0956ef | 120 | if (timerFlag ==1) { // if the timer flag is set (Timer every 1.0 second) |
el13akr | 6:49a3fb0956ef | 121 | timerFlag = 0; //reset flag to 0 |
el13akr | 6:49a3fb0956ef | 122 | lcd.clear(); //clear screen |
el13akr | 6:49a3fb0956ef | 123 | receiveData(); //get data from function |
el13akr | 6:49a3fb0956ef | 124 | char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) |
el13akr | 6:49a3fb0956ef | 125 | // so can display a string of a maximum 14 characters in length |
el13akr | 6:49a3fb0956ef | 126 | // or create formatted strings - ensure they aren't more than 14 characters long |
el13akr | 6:49a3fb0956ef | 127 | int length = sprintf(buffer,"T = %.2f C",temperature); // print formatted data to buffer |
el13akr | 6:49a3fb0956ef | 128 | // it is important the format specifier ensures the length will fit in the buffer |
el13akr | 6:49a3fb0956ef | 129 | serial.printf( " L %i",length); //used for debugging |
el13akr | 6:49a3fb0956ef | 130 | if (length <= 14) // if string will fit on display |
el13akr | 6:49a3fb0956ef | 131 | lcd.printString(buffer,0,2); // display on screen |
el13akr | 6:49a3fb0956ef | 132 | |
el13akr | 6:49a3fb0956ef | 133 | lcd.printString("Menu",60,5);//menu button label |
el13akr | 6:49a3fb0956ef | 134 | wait(0.1); //time inbetween each plot |
el13akr | 6:49a3fb0956ef | 135 | if (currentFlag == 1 ) { |
el13akr | 6:49a3fb0956ef | 136 | currentFlag = 0; |
el13akr | 6:49a3fb0956ef | 137 | break ; |
el13akr | 6:49a3fb0956ef | 138 | } |
el13akr | 6:49a3fb0956ef | 139 | } |
el13akr | 6:49a3fb0956ef | 140 | } |
el13akr | 0:c2a88630fb72 | 141 | } |
el13akr | 0:c2a88630fb72 | 142 | |
el13akr | 6:49a3fb0956ef | 143 | void displayPressure() //function to display formatted pressure |
el13akr | 2:63ef0a1afcbe | 144 | { |
el13akr | 6:49a3fb0956ef | 145 | while(1) { |
el13akr | 6:49a3fb0956ef | 146 | if (timerFlag ==1) { // if the timer flag is set (Timer every 1.0 second) |
el13akr | 6:49a3fb0956ef | 147 | timerFlag = 0; //reset flag to 0 |
el13akr | 6:49a3fb0956ef | 148 | lcd.clear(); //clear screen |
el13akr | 6:49a3fb0956ef | 149 | receiveData(); //get data from function |
el13akr | 6:49a3fb0956ef | 150 | char buffer1[14]; //same as temperature |
el13akr | 6:49a3fb0956ef | 151 | int length1 = sprintf(buffer1,"P = %.2fmb",pressure); // print formatted data to buffer1 |
el13akr | 6:49a3fb0956ef | 152 | serial.printf( " L1 %i",length1); //used for debugging |
el13akr | 6:49a3fb0956ef | 153 | if (length1 <= 14) // if string will fit on display |
el13akr | 6:49a3fb0956ef | 154 | lcd.printString(buffer1,0,2); // display on screen |
el13akr | 6:49a3fb0956ef | 155 | |
el13akr | 6:49a3fb0956ef | 156 | lcd.printString("Menu",60,5);//menu button label |
el13akr | 6:49a3fb0956ef | 157 | wait(0.1); //time inbetween each plot |
el13akr | 6:49a3fb0956ef | 158 | |
el13akr | 6:49a3fb0956ef | 159 | if (currentFlag == 1 ) { |
el13akr | 6:49a3fb0956ef | 160 | currentFlag = 0; |
el13akr | 6:49a3fb0956ef | 161 | break ; |
el13akr | 6:49a3fb0956ef | 162 | } |
el13akr | 6:49a3fb0956ef | 163 | } |
el13akr | 6:49a3fb0956ef | 164 | } |
el13akr | 2:63ef0a1afcbe | 165 | } |
el13akr | 0:c2a88630fb72 | 166 | |
el13akr | 5:fb18fa86ebc3 | 167 | void displayTemperatureGraph() //function to display temperature graph |
el13akr | 4:f4154181d941 | 168 | { |
el13akr | 4:f4154181d941 | 169 | |
el13akr | 5:fb18fa86ebc3 | 170 | float temperatureArray[84]; //maximum capacity of array is 84 |
el13akr | 5:fb18fa86ebc3 | 171 | int j=0; //initialise j to 0 |
el13akr | 4:f4154181d941 | 172 | while(1) { |
el13akr | 5:fb18fa86ebc3 | 173 | lcd.clear(); //clear screen |
el13akr | 4:f4154181d941 | 174 | lcd.printString("Menu",0,5);//menu button label |
el13akr | 6:49a3fb0956ef | 175 | |
el13akr | 5:fb18fa86ebc3 | 176 | receiveData(); //get data from function |
el13akr | 5:fb18fa86ebc3 | 177 | temperatureArray[j] = (temperature/50); //stores current temperature value in array |
el13akr | 5:fb18fa86ebc3 | 178 | j++; //adds 1 to value of j to store next temperature value |
el13akr | 5:fb18fa86ebc3 | 179 | lcd.plotArray(temperatureArray); //plots the array as a line |
el13akr | 5:fb18fa86ebc3 | 180 | if (j>83) { //if the array is full |
el13akr | 6:49a3fb0956ef | 181 | memset (temperatureArray,0, sizeof(temperatureArray)); //reset to 0 so line graph starts again |
el13akr | 4:f4154181d941 | 182 | j = 0; |
el13akr | 4:f4154181d941 | 183 | } |
el13akr | 5:fb18fa86ebc3 | 184 | wait(0.1); //time inbetween each plot |
el13akr | 6:49a3fb0956ef | 185 | |
el13akr | 6:49a3fb0956ef | 186 | if (graphFlag == 1 ) { |
el13akr | 6:49a3fb0956ef | 187 | graphFlag = 0; |
el13akr | 6:49a3fb0956ef | 188 | break ; |
el13akr | 6:49a3fb0956ef | 189 | } |
el13akr | 4:f4154181d941 | 190 | } |
el13akr | 3:075786ca7621 | 191 | } |
el13akr | 3:075786ca7621 | 192 | |
el13akr | 5:fb18fa86ebc3 | 193 | void displayPressureGraph() //function to display pressure graph |
el13akr | 4:f4154181d941 | 194 | { |
el13akr | 4:f4154181d941 | 195 | |
el13akr | 5:fb18fa86ebc3 | 196 | float pressureArray[84]; //maximum capacity of array is 84 |
el13akr | 5:fb18fa86ebc3 | 197 | int j=0; //initialise j to 0 |
el13akr | 4:f4154181d941 | 198 | while(1) { |
el13akr | 5:fb18fa86ebc3 | 199 | lcd.clear(); //clear screen |
el13akr | 5:fb18fa86ebc3 | 200 | lcd.printString("Menu",0,5);//menu button label |
el13akr | 6:49a3fb0956ef | 201 | |
el13akr | 5:fb18fa86ebc3 | 202 | receiveData(); //get data from function |
el13akr | 5:fb18fa86ebc3 | 203 | pressureArray[j] = (pressure/1100); //stores current pressure value in array |
el13akr | 5:fb18fa86ebc3 | 204 | j++; //adds 1 to value of j to store next pressure value |
el13akr | 5:fb18fa86ebc3 | 205 | lcd.plotArray(pressureArray); //plots the array as a line |
el13akr | 5:fb18fa86ebc3 | 206 | if (j>83) { //if the array is full |
el13akr | 6:49a3fb0956ef | 207 | memset (pressureArray,0, sizeof(pressureArray));//reset to 0 so line graph starts again |
el13akr | 4:f4154181d941 | 208 | j = 0; |
el13akr | 4:f4154181d941 | 209 | } |
el13akr | 5:fb18fa86ebc3 | 210 | wait(0.1); //time inbetween each plot |
el13akr | 6:49a3fb0956ef | 211 | |
el13akr | 6:49a3fb0956ef | 212 | if (graphFlag == 1 ) { |
el13akr | 6:49a3fb0956ef | 213 | graphFlag = 0; |
el13akr | 6:49a3fb0956ef | 214 | break ; |
el13akr | 6:49a3fb0956ef | 215 | } |
el13akr | 4:f4154181d941 | 216 | } |
el13akr | 3:075786ca7621 | 217 | } |
el13akr | 0:c2a88630fb72 | 218 | |
el13akr | 0:c2a88630fb72 | 219 | |
el13akr | 0:c2a88630fb72 | 220 | int main() |
el13akr | 0:c2a88630fb72 | 221 | { |
el13akr | 3:075786ca7621 | 222 | lcd.init();//initialise display |
el13akr | 3:075786ca7621 | 223 | bmp180.init();// initiliase barometer |
el13akr | 3:075786ca7621 | 224 | timer.attach (&timerExpired , 1.0); //instead of using wait(1.0) |
el13akr | 3:075786ca7621 | 225 | timeOut.attach (&timeOutStopped , 2.0); //instead of using wait(1.0) |
el13akr | 2:63ef0a1afcbe | 226 | graphButton.rise (&graphButtonPressed); |
el13akr | 2:63ef0a1afcbe | 227 | currentButton.rise (¤tButtonPressed); |
el13akr | 3:075786ca7621 | 228 | screen(); //show the welcome screen |
el13akr | 1:026d80a2f7a9 | 229 | |
el13akr | 0:c2a88630fb72 | 230 | while(1) { |
el13akr | 2:63ef0a1afcbe | 231 | if (timeOutFlag ==1 ) { |
el13akr | 3:075786ca7621 | 232 | menu(); //display menu screen(s) |
el13akr | 2:63ef0a1afcbe | 233 | } |
el13akr | 4:f4154181d941 | 234 | wait (0.1); //necessary wait so screen is clear and easy to read |
el13akr | 0:c2a88630fb72 | 235 | } |
el13akr | 0:c2a88630fb72 | 236 | } |