Program to display temperature and pressure readings along with date and time.
Dependencies: BMP180 N5110 PowerControl mbed
main.cpp@8:9461cda3310b, 2015-04-30 (annotated)
- Committer:
- el13akr
- Date:
- Thu Apr 30 16:37:52 2015 +0000
- Revision:
- 8:9461cda3310b
- Parent:
- 7:32a4756cba1d
- Child:
- 9:098f8e206770
date and time works yayyyy
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 | 8:9461cda3310b | 11 | Ticker ticker; //create ticker for RTC |
el13akr | 3:075786ca7621 | 12 | Timeout timeOut ; //only loops once to show menu |
el13akr | 7:32a4756cba1d | 13 | BusOut leds(LED4,LED3,LED2,LED1); //leds used for error function |
el13akr | 0:c2a88630fb72 | 14 | BMP180 bmp180(p28,p27); |
el13akr | 0:c2a88630fb72 | 15 | Serial serial(USBTX,USBRX); |
el13akr | 0:c2a88630fb72 | 16 | AnalogIn POT(p20); |
el13akr | 2:63ef0a1afcbe | 17 | InterruptIn graphButton(p16); //button to select graph |
el13akr | 2:63ef0a1afcbe | 18 | InterruptIn currentButton(p15); //button to select current |
el13akr | 7:32a4756cba1d | 19 | PwmOut red(p24); //led for displaying error |
el13akr | 7:32a4756cba1d | 20 | PwmOut buzzer(p21); //buzzer for displaying error |
el13akr | 0:c2a88630fb72 | 21 | |
el13akr | 0:c2a88630fb72 | 22 | int timerFlag= 0; |
el13akr | 0:c2a88630fb72 | 23 | int timeOutFlag = 0 ; |
el13akr | 2:63ef0a1afcbe | 24 | int graphFlag = 0 ; |
el13akr | 2:63ef0a1afcbe | 25 | int currentFlag = 0; |
el13akr | 8:9461cda3310b | 26 | char rxString[16]; // buffer to store received string |
el13akr | 8:9461cda3310b | 27 | char bufferTime[14]; |
el13akr | 8:9461cda3310b | 28 | char bufferDate[14]; |
el13akr | 7:32a4756cba1d | 29 | float temperature; //temperature has to be a float or graph doesn't work |
el13akr | 0:c2a88630fb72 | 30 | float pressure; |
el13akr | 2:63ef0a1afcbe | 31 | void displayTemperature(); |
el13akr | 2:63ef0a1afcbe | 32 | void displayPressure(); |
el13akr | 3:075786ca7621 | 33 | void receiveData(); |
el13akr | 3:075786ca7621 | 34 | void displayTemperatureGraph(); |
el13akr | 3:075786ca7621 | 35 | void displayPressureGraph(); |
el13akr | 7:32a4756cba1d | 36 | void error(); |
el13akr | 8:9461cda3310b | 37 | void time(); |
el13akr | 8:9461cda3310b | 38 | void setTime(); // function to set the UNIX time |
el13akr | 8:9461cda3310b | 39 | void serialISR(); |
el13akr | 8:9461cda3310b | 40 | void interrupt(); //for RTC |
el13akr | 0:c2a88630fb72 | 41 | |
el13akr | 3:075786ca7621 | 42 | void screen() //welcome screen |
el13akr | 0:c2a88630fb72 | 43 | { |
el13akr | 0:c2a88630fb72 | 44 | lcd.printString("Weather Logger",0,2); |
el13akr | 0:c2a88630fb72 | 45 | lcd.printString("3000",32,3); |
el13akr | 0:c2a88630fb72 | 46 | lcd.printString("Alex Raper",15,5); |
el13akr | 3:075786ca7621 | 47 | lcd.refresh(); //clear screen |
el13akr | 0:c2a88630fb72 | 48 | } |
el13akr | 0:c2a88630fb72 | 49 | |
el13akr | 3:075786ca7621 | 50 | void menu() //main menu screen |
el13akr | 0:c2a88630fb72 | 51 | { |
el13akr | 1:026d80a2f7a9 | 52 | lcd.clear(); |
el13akr | 8:9461cda3310b | 53 | if (POT>=(3.0/4.0)) { //if the potentiometer is pointing to the left (temperature) |
el13akr | 3:075786ca7621 | 54 | lcd.printString("Temperature",2,2); //data type label |
el13akr | 3:075786ca7621 | 55 | lcd.printString(">",76,2); //arrow denoting a different screen can be shown by pointing potentiometer in right direction |
el13akr | 3:075786ca7621 | 56 | lcd.printString("Graph",0,5);//graph button label |
el13akr | 3:075786ca7621 | 57 | lcd.printString("Current",42,5);//current button label |
el13akr | 3:075786ca7621 | 58 | if (graphFlag) { //if the graph button is pressed |
el13akr | 3:075786ca7621 | 59 | graphFlag = 0; //reset graph flag to 0 |
el13akr | 4:f4154181d941 | 60 | displayTemperatureGraph(); |
el13akr | 6:49a3fb0956ef | 61 | |
el13akr | 0:c2a88630fb72 | 62 | |
el13akr | 2:63ef0a1afcbe | 63 | } |
el13akr | 2:63ef0a1afcbe | 64 | if (currentFlag ==1 ) { // if the current button is pressed |
el13akr | 3:075786ca7621 | 65 | currentFlag = 0; //reset current flag to 0 |
el13akr | 6:49a3fb0956ef | 66 | |
el13akr | 6:49a3fb0956ef | 67 | displayTemperature(); //display current temperature value |
el13akr | 2:63ef0a1afcbe | 68 | } |
el13akr | 8:9461cda3310b | 69 | } else if ((3.0/4.0)>POT && POT>=(1.0/2.0)) { |
el13akr | 3:075786ca7621 | 70 | lcd.printString("Pressure",18,2);//data type label |
el13akr | 3:075786ca7621 | 71 | lcd.printString("<",2,2);//arrow denoting a different screen can be shown by pointing potentiometer in left direction |
el13akr | 8:9461cda3310b | 72 | lcd.printString(">",76,2); //arrow denoting a different screen can be shown by pointing potentiometer in right direction |
el13akr | 3:075786ca7621 | 73 | lcd.printString("Graph",0,5);//graph button label |
el13akr | 3:075786ca7621 | 74 | lcd.printString("Current",42,5);//current button label |
el13akr | 3:075786ca7621 | 75 | if (graphFlag) { //if the graph button is pressed |
el13akr | 3:075786ca7621 | 76 | graphFlag = 0; //reset graph flag to 0 |
el13akr | 4:f4154181d941 | 77 | displayPressureGraph(); |
el13akr | 8:9461cda3310b | 78 | |
el13akr | 0:c2a88630fb72 | 79 | |
el13akr | 2:63ef0a1afcbe | 80 | } |
el13akr | 8:9461cda3310b | 81 | |
el13akr | 2:63ef0a1afcbe | 82 | if (currentFlag) { // if the current button is pressed |
el13akr | 3:075786ca7621 | 83 | currentFlag = 0; //reset current flag to 0 |
el13akr | 6:49a3fb0956ef | 84 | displayPressure();//display current pressure value |
el13akr | 2:63ef0a1afcbe | 85 | } |
el13akr | 8:9461cda3310b | 86 | } else if ((1.0/2.0)>POT && POT>=(1.0/4.0)) { |
el13akr | 8:9461cda3310b | 87 | time(); |
el13akr | 8:9461cda3310b | 88 | lcd.printString("Date",30,0);//date label |
el13akr | 8:9461cda3310b | 89 | lcd.printString(">",76,2); //arrow denoting a different screen can be shown by pointing potentiometer in right direction |
el13akr | 8:9461cda3310b | 90 | lcd.printString("<",2,2);//arrow denoting a different screen can be shown by pointing potentiometer in left direction |
el13akr | 8:9461cda3310b | 91 | lcd.printString(bufferDate,19,2);//date |
el13akr | 8:9461cda3310b | 92 | } else { |
el13akr | 8:9461cda3310b | 93 | time(); |
el13akr | 8:9461cda3310b | 94 | lcd.printString("Time",30,0);//time stamp |
el13akr | 8:9461cda3310b | 95 | lcd.printString("<",2,2);//arrow denoting a different screen can be shown by pointing potentiometer in left direction |
el13akr | 8:9461cda3310b | 96 | lcd.printString(bufferTime,19,2);//time |
el13akr | 0:c2a88630fb72 | 97 | } |
el13akr | 0:c2a88630fb72 | 98 | } |
el13akr | 0:c2a88630fb72 | 99 | |
el13akr | 6:49a3fb0956ef | 100 | |
el13akr | 8:9461cda3310b | 101 | |
el13akr | 8:9461cda3310b | 102 | |
el13akr | 8:9461cda3310b | 103 | void time(){ |
el13akr | 8:9461cda3310b | 104 | |
el13akr | 8:9461cda3310b | 105 | time_t seconds = time(NULL); // get current time |
el13akr | 8:9461cda3310b | 106 | // format time into a string (time and date) |
el13akr | 8:9461cda3310b | 107 | strftime(bufferTime, 14 , "%X", localtime(&seconds)); |
el13akr | 8:9461cda3310b | 108 | strftime(bufferDate, 14 , "%D", localtime(&seconds)); |
el13akr | 8:9461cda3310b | 109 | } |
el13akr | 8:9461cda3310b | 110 | |
el13akr | 2:63ef0a1afcbe | 111 | void timerExpired() |
el13akr | 2:63ef0a1afcbe | 112 | { |
el13akr | 0:c2a88630fb72 | 113 | timerFlag = 1 ; |
el13akr | 0:c2a88630fb72 | 114 | } |
el13akr | 0:c2a88630fb72 | 115 | |
el13akr | 2:63ef0a1afcbe | 116 | void timeOutStopped() |
el13akr | 2:63ef0a1afcbe | 117 | { |
el13akr | 2:63ef0a1afcbe | 118 | |
el13akr | 0:c2a88630fb72 | 119 | timeOutFlag = 1; |
el13akr | 2:63ef0a1afcbe | 120 | } |
el13akr | 0:c2a88630fb72 | 121 | |
el13akr | 2:63ef0a1afcbe | 122 | void graphButtonPressed () |
el13akr | 2:63ef0a1afcbe | 123 | { |
el13akr | 2:63ef0a1afcbe | 124 | graphFlag = 1; |
el13akr | 4:f4154181d941 | 125 | serial.printf("graph button pressed "); //used for debugging |
el13akr | 2:63ef0a1afcbe | 126 | } |
el13akr | 2:63ef0a1afcbe | 127 | |
el13akr | 2:63ef0a1afcbe | 128 | void currentButtonPressed () |
el13akr | 2:63ef0a1afcbe | 129 | { |
el13akr | 2:63ef0a1afcbe | 130 | currentFlag = 1; |
el13akr | 4:f4154181d941 | 131 | serial.printf("current button pressed "); //used for debugging |
el13akr | 2:63ef0a1afcbe | 132 | } |
el13akr | 3:075786ca7621 | 133 | void receiveData() //function to receive data from BMP |
el13akr | 0:c2a88630fb72 | 134 | { |
el13akr | 0:c2a88630fb72 | 135 | |
el13akr | 0:c2a88630fb72 | 136 | Measurement measurement; // measurement structure declared in BMP180 class |
el13akr | 0:c2a88630fb72 | 137 | |
el13akr | 0:c2a88630fb72 | 138 | // read values (T in Celsius and P in mb) and print over serial port |
el13akr | 0:c2a88630fb72 | 139 | measurement = bmp180.readValues(); |
el13akr | 7:32a4756cba1d | 140 | //serial.printf("T = %.2f C P = %.2f mb\n",measurement.temperature,measurement.pressure); //used for debugging |
el13akr | 0:c2a88630fb72 | 141 | |
el13akr | 3:075786ca7621 | 142 | temperature = measurement.temperature ; //formatted temperature |
el13akr | 3:075786ca7621 | 143 | pressure = measurement.pressure ; //formatted pressure |
el13akr | 0:c2a88630fb72 | 144 | |
el13akr | 7:32a4756cba1d | 145 | error(); |
el13akr | 7:32a4756cba1d | 146 | |
el13akr | 0:c2a88630fb72 | 147 | } |
el13akr | 0:c2a88630fb72 | 148 | |
el13akr | 0:c2a88630fb72 | 149 | |
el13akr | 3:075786ca7621 | 150 | void displayTemperature() //function to display formatted temperature |
el13akr | 0:c2a88630fb72 | 151 | { |
el13akr | 6:49a3fb0956ef | 152 | while(1) { |
el13akr | 6:49a3fb0956ef | 153 | if (timerFlag ==1) { // if the timer flag is set (Timer every 1.0 second) |
el13akr | 6:49a3fb0956ef | 154 | timerFlag = 0; //reset flag to 0 |
el13akr | 6:49a3fb0956ef | 155 | lcd.clear(); //clear screen |
el13akr | 6:49a3fb0956ef | 156 | receiveData(); //get data from function |
el13akr | 6:49a3fb0956ef | 157 | char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) |
el13akr | 6:49a3fb0956ef | 158 | // so can display a string of a maximum 14 characters in length |
el13akr | 6:49a3fb0956ef | 159 | // or create formatted strings - ensure they aren't more than 14 characters long |
el13akr | 6:49a3fb0956ef | 160 | int length = sprintf(buffer,"T = %.2f C",temperature); // print formatted data to buffer |
el13akr | 6:49a3fb0956ef | 161 | // it is important the format specifier ensures the length will fit in the buffer |
el13akr | 6:49a3fb0956ef | 162 | serial.printf( " L %i",length); //used for debugging |
el13akr | 6:49a3fb0956ef | 163 | if (length <= 14) // if string will fit on display |
el13akr | 6:49a3fb0956ef | 164 | lcd.printString(buffer,0,2); // display on screen |
el13akr | 7:32a4756cba1d | 165 | |
el13akr | 6:49a3fb0956ef | 166 | lcd.printString("Menu",60,5);//menu button label |
el13akr | 6:49a3fb0956ef | 167 | wait(0.1); //time inbetween each plot |
el13akr | 6:49a3fb0956ef | 168 | if (currentFlag == 1 ) { |
el13akr | 6:49a3fb0956ef | 169 | currentFlag = 0; |
el13akr | 6:49a3fb0956ef | 170 | break ; |
el13akr | 6:49a3fb0956ef | 171 | } |
el13akr | 6:49a3fb0956ef | 172 | } |
el13akr | 6:49a3fb0956ef | 173 | } |
el13akr | 0:c2a88630fb72 | 174 | } |
el13akr | 0:c2a88630fb72 | 175 | |
el13akr | 6:49a3fb0956ef | 176 | void displayPressure() //function to display formatted pressure |
el13akr | 2:63ef0a1afcbe | 177 | { |
el13akr | 6:49a3fb0956ef | 178 | while(1) { |
el13akr | 6:49a3fb0956ef | 179 | if (timerFlag ==1) { // if the timer flag is set (Timer every 1.0 second) |
el13akr | 6:49a3fb0956ef | 180 | timerFlag = 0; //reset flag to 0 |
el13akr | 6:49a3fb0956ef | 181 | lcd.clear(); //clear screen |
el13akr | 6:49a3fb0956ef | 182 | receiveData(); //get data from function |
el13akr | 6:49a3fb0956ef | 183 | char buffer1[14]; //same as temperature |
el13akr | 6:49a3fb0956ef | 184 | int length1 = sprintf(buffer1,"P = %.2fmb",pressure); // print formatted data to buffer1 |
el13akr | 6:49a3fb0956ef | 185 | serial.printf( " L1 %i",length1); //used for debugging |
el13akr | 6:49a3fb0956ef | 186 | if (length1 <= 14) // if string will fit on display |
el13akr | 6:49a3fb0956ef | 187 | lcd.printString(buffer1,0,2); // display on screen |
el13akr | 7:32a4756cba1d | 188 | |
el13akr | 6:49a3fb0956ef | 189 | lcd.printString("Menu",60,5);//menu button label |
el13akr | 6:49a3fb0956ef | 190 | wait(0.1); //time inbetween each plot |
el13akr | 7:32a4756cba1d | 191 | |
el13akr | 6:49a3fb0956ef | 192 | if (currentFlag == 1 ) { |
el13akr | 6:49a3fb0956ef | 193 | currentFlag = 0; |
el13akr | 6:49a3fb0956ef | 194 | break ; |
el13akr | 6:49a3fb0956ef | 195 | } |
el13akr | 6:49a3fb0956ef | 196 | } |
el13akr | 6:49a3fb0956ef | 197 | } |
el13akr | 2:63ef0a1afcbe | 198 | } |
el13akr | 0:c2a88630fb72 | 199 | |
el13akr | 5:fb18fa86ebc3 | 200 | void displayTemperatureGraph() //function to display temperature graph |
el13akr | 4:f4154181d941 | 201 | { |
el13akr | 4:f4154181d941 | 202 | |
el13akr | 5:fb18fa86ebc3 | 203 | float temperatureArray[84]; //maximum capacity of array is 84 |
el13akr | 5:fb18fa86ebc3 | 204 | int j=0; //initialise j to 0 |
el13akr | 4:f4154181d941 | 205 | while(1) { |
el13akr | 5:fb18fa86ebc3 | 206 | lcd.clear(); //clear screen |
el13akr | 4:f4154181d941 | 207 | lcd.printString("Menu",0,5);//menu button label |
el13akr | 7:32a4756cba1d | 208 | |
el13akr | 5:fb18fa86ebc3 | 209 | receiveData(); //get data from function |
el13akr | 7:32a4756cba1d | 210 | temperatureArray[j] = (temperature/47); //stores current temperature value in array |
el13akr | 5:fb18fa86ebc3 | 211 | j++; //adds 1 to value of j to store next temperature value |
el13akr | 5:fb18fa86ebc3 | 212 | lcd.plotArray(temperatureArray); //plots the array as a line |
el13akr | 5:fb18fa86ebc3 | 213 | if (j>83) { //if the array is full |
el13akr | 6:49a3fb0956ef | 214 | memset (temperatureArray,0, sizeof(temperatureArray)); //reset to 0 so line graph starts again |
el13akr | 4:f4154181d941 | 215 | j = 0; |
el13akr | 4:f4154181d941 | 216 | } |
el13akr | 5:fb18fa86ebc3 | 217 | wait(0.1); //time inbetween each plot |
el13akr | 7:32a4756cba1d | 218 | |
el13akr | 6:49a3fb0956ef | 219 | if (graphFlag == 1 ) { |
el13akr | 6:49a3fb0956ef | 220 | graphFlag = 0; |
el13akr | 6:49a3fb0956ef | 221 | break ; |
el13akr | 6:49a3fb0956ef | 222 | } |
el13akr | 4:f4154181d941 | 223 | } |
el13akr | 3:075786ca7621 | 224 | } |
el13akr | 3:075786ca7621 | 225 | |
el13akr | 5:fb18fa86ebc3 | 226 | void displayPressureGraph() //function to display pressure graph |
el13akr | 4:f4154181d941 | 227 | { |
el13akr | 4:f4154181d941 | 228 | |
el13akr | 5:fb18fa86ebc3 | 229 | float pressureArray[84]; //maximum capacity of array is 84 |
el13akr | 5:fb18fa86ebc3 | 230 | int j=0; //initialise j to 0 |
el13akr | 4:f4154181d941 | 231 | while(1) { |
el13akr | 5:fb18fa86ebc3 | 232 | lcd.clear(); //clear screen |
el13akr | 5:fb18fa86ebc3 | 233 | lcd.printString("Menu",0,5);//menu button label |
el13akr | 7:32a4756cba1d | 234 | |
el13akr | 5:fb18fa86ebc3 | 235 | receiveData(); //get data from function |
el13akr | 5:fb18fa86ebc3 | 236 | pressureArray[j] = (pressure/1100); //stores current pressure value in array |
el13akr | 5:fb18fa86ebc3 | 237 | j++; //adds 1 to value of j to store next pressure value |
el13akr | 5:fb18fa86ebc3 | 238 | lcd.plotArray(pressureArray); //plots the array as a line |
el13akr | 5:fb18fa86ebc3 | 239 | if (j>83) { //if the array is full |
el13akr | 6:49a3fb0956ef | 240 | memset (pressureArray,0, sizeof(pressureArray));//reset to 0 so line graph starts again |
el13akr | 4:f4154181d941 | 241 | j = 0; |
el13akr | 4:f4154181d941 | 242 | } |
el13akr | 5:fb18fa86ebc3 | 243 | wait(0.1); //time inbetween each plot |
el13akr | 7:32a4756cba1d | 244 | |
el13akr | 6:49a3fb0956ef | 245 | if (graphFlag == 1 ) { |
el13akr | 6:49a3fb0956ef | 246 | graphFlag = 0; |
el13akr | 6:49a3fb0956ef | 247 | break ; |
el13akr | 6:49a3fb0956ef | 248 | } |
el13akr | 4:f4154181d941 | 249 | } |
el13akr | 3:075786ca7621 | 250 | } |
el13akr | 0:c2a88630fb72 | 251 | |
el13akr | 7:32a4756cba1d | 252 | void error() |
el13akr | 7:32a4756cba1d | 253 | { |
el13akr | 7:32a4756cba1d | 254 | |
el13akr | 7:32a4756cba1d | 255 | if (temperature > 29 || pressure > 1000) { |
el13akr | 7:32a4756cba1d | 256 | red = 1; |
el13akr | 7:32a4756cba1d | 257 | //buzzer.period(1/590); |
el13akr | 7:32a4756cba1d | 258 | //buzzer=0.5; // set duty cycle can't use buzzer because PWM signal is affecting screen |
el13akr | 7:32a4756cba1d | 259 | |
el13akr | 7:32a4756cba1d | 260 | } else { |
el13akr | 7:32a4756cba1d | 261 | red=0; |
el13akr | 7:32a4756cba1d | 262 | } |
el13akr | 7:32a4756cba1d | 263 | } |
el13akr | 0:c2a88630fb72 | 264 | |
el13akr | 0:c2a88630fb72 | 265 | int main() |
el13akr | 0:c2a88630fb72 | 266 | { |
el13akr | 3:075786ca7621 | 267 | lcd.init();//initialise display |
el13akr | 3:075786ca7621 | 268 | bmp180.init();// initiliase barometer |
el13akr | 3:075786ca7621 | 269 | timer.attach (&timerExpired , 1.0); //instead of using wait(1.0) |
el13akr | 3:075786ca7621 | 270 | timeOut.attach (&timeOutStopped , 2.0); //instead of using wait(1.0) |
el13akr | 2:63ef0a1afcbe | 271 | graphButton.rise (&graphButtonPressed); |
el13akr | 2:63ef0a1afcbe | 272 | currentButton.rise (¤tButtonPressed); |
el13akr | 7:32a4756cba1d | 273 | red.period_us(25); |
el13akr | 8:9461cda3310b | 274 | //set_time(1430411800); // initialise time to now |
el13akr | 3:075786ca7621 | 275 | screen(); //show the welcome screen |
el13akr | 1:026d80a2f7a9 | 276 | |
el13akr | 0:c2a88630fb72 | 277 | while(1) { |
el13akr | 8:9461cda3310b | 278 | time(); |
el13akr | 2:63ef0a1afcbe | 279 | if (timeOutFlag ==1 ) { |
el13akr | 3:075786ca7621 | 280 | menu(); //display menu screen(s) |
el13akr | 2:63ef0a1afcbe | 281 | } |
el13akr | 4:f4154181d941 | 282 | wait (0.1); //necessary wait so screen is clear and easy to read |
el13akr | 0:c2a88630fb72 | 283 | } |
el13akr | 0:c2a88630fb72 | 284 | } |