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

Dependencies:   BMP180 N5110 PowerControl mbed

main.cpp

Committer:
el13akr
Date:
2015-05-02
Revision:
10:0783c29dc776
Parent:
9:098f8e206770
Child:
11:b97dd4410d72

File content as of revision 10:0783c29dc776:

#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(); //display temperature graph from function


        }
        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();//display pressure graph from function


        }

        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);//display 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);//display time
    }
}




void time(){

time_t seconds = time(NULL); // get current time
        strftime(bufferTime, 14 , "%X", localtime(&seconds));// format time into a string
        strftime(bufferDate, 14 , "%D", localtime(&seconds));// format date into a string
}

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) { //if temperature or pressure goes above threshold values
        red = 1; //red LED turns on
        //buzzer.period(1/590);
        //buzzer=0.5; // set duty cycle
        //can't use buzzer because PWM signal is affecting LCD screen

    } else {
        red=0; //red LED stays off
    }
}

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 (&currentButtonPressed);
    red.period_us(25);
    //set_time(1430415950); // initialise time to now
    screen(); //show the welcome screen

    while(1) {
        time();//get time and date
        if (timeOutFlag ==1 ) {
            menu(); //display menu screen(s)
        }
        wait (0.1); //necessary wait so screen is clear and easy to read
    }
}