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

Dependencies:   BMP180 N5110 PowerControl mbed

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?

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