Program to display temperature and pressure readings along with date and time.

Dependencies:   BMP180 N5110 PowerControl mbed

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?

UserRevisionLine numberNew 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 (&currentButtonPressed);
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 }