Program to display temperature and pressure readings along with date and time.
Dependencies: BMP180 N5110 PowerControl mbed
main.cpp
- Committer:
- el13akr
- Date:
- 2015-04-30
- Revision:
- 8:9461cda3310b
- Parent:
- 7:32a4756cba1d
- Child:
- 9:098f8e206770
File content as of revision 8:9461cda3310b:
#include "mbed.h" #include "N5110.h" #include "BMP180.h" // VCC,SCE,RST,D/C,MOSI,SCLK,LED N5110 lcd(p7,p8,p9,p10,p11,p13,p26); // Can also power (VCC) directly from VOUT (3.3 V) - // Can give better performance due to current limitation from GPIO pin Ticker timer ; //create a ticker object to read the data from the sensor Ticker ticker; //create ticker for RTC Timeout timeOut ; //only loops once to show menu BusOut leds(LED4,LED3,LED2,LED1); //leds used for error function BMP180 bmp180(p28,p27); Serial serial(USBTX,USBRX); AnalogIn POT(p20); InterruptIn graphButton(p16); //button to select graph InterruptIn currentButton(p15); //button to select current PwmOut red(p24); //led for displaying error PwmOut buzzer(p21); //buzzer for displaying error int timerFlag= 0; int timeOutFlag = 0 ; int graphFlag = 0 ; int currentFlag = 0; char rxString[16]; // buffer to store received string char bufferTime[14]; char bufferDate[14]; float temperature; //temperature has to be a float or graph doesn't work float pressure; void displayTemperature(); void displayPressure(); void receiveData(); void displayTemperatureGraph(); void displayPressureGraph(); void error(); void time(); void setTime(); // function to set the UNIX time void serialISR(); void interrupt(); //for RTC void screen() //welcome screen { lcd.printString("Weather Logger",0,2); lcd.printString("3000",32,3); lcd.printString("Alex Raper",15,5); lcd.refresh(); //clear screen } void menu() //main menu screen { lcd.clear(); if (POT>=(3.0/4.0)) { //if the potentiometer is pointing to the left (temperature) lcd.printString("Temperature",2,2); //data type label lcd.printString(">",76,2); //arrow denoting a different screen can be shown by pointing potentiometer in right direction lcd.printString("Graph",0,5);//graph button label lcd.printString("Current",42,5);//current button label if (graphFlag) { //if the graph button is pressed graphFlag = 0; //reset graph flag to 0 displayTemperatureGraph(); } if (currentFlag ==1 ) { // if the current button is pressed currentFlag = 0; //reset current flag to 0 displayTemperature(); //display current temperature value } } else if ((3.0/4.0)>POT && POT>=(1.0/2.0)) { lcd.printString("Pressure",18,2);//data type label lcd.printString("<",2,2);//arrow denoting a different screen can be shown by pointing potentiometer in left direction lcd.printString(">",76,2); //arrow denoting a different screen can be shown by pointing potentiometer in right direction lcd.printString("Graph",0,5);//graph button label lcd.printString("Current",42,5);//current button label if (graphFlag) { //if the graph button is pressed graphFlag = 0; //reset graph flag to 0 displayPressureGraph(); } if (currentFlag) { // if the current button is pressed currentFlag = 0; //reset current flag to 0 displayPressure();//display current pressure value } } else if ((1.0/2.0)>POT && POT>=(1.0/4.0)) { time(); lcd.printString("Date",30,0);//date label lcd.printString(">",76,2); //arrow denoting a different screen can be shown by pointing potentiometer in right direction lcd.printString("<",2,2);//arrow denoting a different screen can be shown by pointing potentiometer in left direction lcd.printString(bufferDate,19,2);//date } else { time(); lcd.printString("Time",30,0);//time stamp lcd.printString("<",2,2);//arrow denoting a different screen can be shown by pointing potentiometer in left direction lcd.printString(bufferTime,19,2);//time } } void time(){ time_t seconds = time(NULL); // get current time // format time into a string (time and date) strftime(bufferTime, 14 , "%X", localtime(&seconds)); strftime(bufferDate, 14 , "%D", localtime(&seconds)); } void timerExpired() { timerFlag = 1 ; } void timeOutStopped() { timeOutFlag = 1; } void graphButtonPressed () { graphFlag = 1; serial.printf("graph button pressed "); //used for debugging } void currentButtonPressed () { currentFlag = 1; serial.printf("current button pressed "); //used for debugging } void receiveData() //function to receive data from BMP { Measurement measurement; // measurement structure declared in BMP180 class // read values (T in Celsius and P in mb) and print over serial port measurement = bmp180.readValues(); //serial.printf("T = %.2f C P = %.2f mb\n",measurement.temperature,measurement.pressure); //used for debugging temperature = measurement.temperature ; //formatted temperature pressure = measurement.pressure ; //formatted pressure error(); } void displayTemperature() //function to display formatted temperature { while(1) { if (timerFlag ==1) { // if the timer flag is set (Timer every 1.0 second) timerFlag = 0; //reset flag to 0 lcd.clear(); //clear screen receiveData(); //get data from function char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) // so can display a string of a maximum 14 characters in length // or create formatted strings - ensure they aren't more than 14 characters long int length = sprintf(buffer,"T = %.2f C",temperature); // print formatted data to buffer // it is important the format specifier ensures the length will fit in the buffer serial.printf( " L %i",length); //used for debugging if (length <= 14) // if string will fit on display lcd.printString(buffer,0,2); // display on screen lcd.printString("Menu",60,5);//menu button label wait(0.1); //time inbetween each plot if (currentFlag == 1 ) { currentFlag = 0; break ; } } } } void displayPressure() //function to display formatted pressure { while(1) { if (timerFlag ==1) { // if the timer flag is set (Timer every 1.0 second) timerFlag = 0; //reset flag to 0 lcd.clear(); //clear screen receiveData(); //get data from function char buffer1[14]; //same as temperature int length1 = sprintf(buffer1,"P = %.2fmb",pressure); // print formatted data to buffer1 serial.printf( " L1 %i",length1); //used for debugging if (length1 <= 14) // if string will fit on display lcd.printString(buffer1,0,2); // display on screen lcd.printString("Menu",60,5);//menu button label wait(0.1); //time inbetween each plot if (currentFlag == 1 ) { currentFlag = 0; break ; } } } } void displayTemperatureGraph() //function to display temperature graph { float temperatureArray[84]; //maximum capacity of array is 84 int j=0; //initialise j to 0 while(1) { lcd.clear(); //clear screen lcd.printString("Menu",0,5);//menu button label receiveData(); //get data from function temperatureArray[j] = (temperature/47); //stores current temperature value in array j++; //adds 1 to value of j to store next temperature value lcd.plotArray(temperatureArray); //plots the array as a line if (j>83) { //if the array is full memset (temperatureArray,0, sizeof(temperatureArray)); //reset to 0 so line graph starts again j = 0; } wait(0.1); //time inbetween each plot if (graphFlag == 1 ) { graphFlag = 0; break ; } } } void displayPressureGraph() //function to display pressure graph { float pressureArray[84]; //maximum capacity of array is 84 int j=0; //initialise j to 0 while(1) { lcd.clear(); //clear screen lcd.printString("Menu",0,5);//menu button label receiveData(); //get data from function pressureArray[j] = (pressure/1100); //stores current pressure value in array j++; //adds 1 to value of j to store next pressure value lcd.plotArray(pressureArray); //plots the array as a line if (j>83) { //if the array is full memset (pressureArray,0, sizeof(pressureArray));//reset to 0 so line graph starts again j = 0; } wait(0.1); //time inbetween each plot if (graphFlag == 1 ) { graphFlag = 0; break ; } } } void error() { if (temperature > 29 || pressure > 1000) { red = 1; //buzzer.period(1/590); //buzzer=0.5; // set duty cycle can't use buzzer because PWM signal is affecting screen } else { red=0; } } int main() { lcd.init();//initialise display bmp180.init();// initiliase barometer timer.attach (&timerExpired , 1.0); //instead of using wait(1.0) timeOut.attach (&timeOutStopped , 2.0); //instead of using wait(1.0) graphButton.rise (&graphButtonPressed); currentButton.rise (¤tButtonPressed); red.period_us(25); //set_time(1430411800); // initialise time to now screen(); //show the welcome screen while(1) { time(); if (timeOutFlag ==1 ) { menu(); //display menu screen(s) } wait (0.1); //necessary wait so screen is clear and easy to read } }