A Weather station designed to read the values of temperature and pressure from the sensor (BMP180), data displayed via a nokia N5110 display.

Dependencies:   BMP180 N5110 PowerControl mbed

Barometer.h

Committer:
amiraseman
Date:
2015-05-11
Revision:
26:c0d8d2f68406
Parent:
23:a0ce9fa869c2
Child:
27:06fbad36c15e

File content as of revision 26:c0d8d2f68406:

/**

@file Barometer.h
@brief Header file containing member functions and variables
@author Amir M. Asemanpayeh
@date May 2015

@brief Header file - Contains Global Variables, GPIO and Pins and Function prototypes

*/


#include "mbed.h"
#include "N5110.h"
#include "BMP180.h"
#include "PowerControl/PowerControl.h"
#include "PowerControl/EthernetPowerControl.h"

/**
@namespace bmp180
@brief A I2C instance to interact with the BMP sensor \n SDA, SCL
*/
BMP180 bmp180(p28,p27);


/**
@namespace lcd
@brief A serial data protocol to operate with a master/slave relationship to interact with the lcd \n VCC,SCE,RST,D/C,MOSI,SCLK,LED
*/
N5110 lcd(p7,p8,p9,p10,p11,p13,p26);


/**
@namespace leds
@brief GPIO bus output for status LEDs
*/
BusOut leds(LED4,LED3,LED2,LED1);


/**
@namespace serial
@brief A USB Virtual Serial Port to print out messages to a host PC terminal
*/
Serial serial(USBTX,USBRX);


/**
@namespace local
@brief A local file system declared to store data files
*/
LocalFileSystem local("local");


/**
@namespace button1
@brief An Interrupt on digital pushbutton1 input p16
*/
InterruptIn button1(p16);


/**
@namespace button2
@brief An Interrupt on digital pushbutton2 input p17
*/
InterruptIn button2(p17);


/**
@namespace button3
@brief An Interrupt on digital pushbutton3 input p15
*/
InterruptIn button3 (p15);


/**
@namespace button4
@brief An Interrupt on digital pushbutton4 input p18
*/
InterruptIn button4 (p18);




/**
@namespace redLED
@brief A PwmOut interface is used to control the frequency and mark-space ratio of a led (The red LED)
*/
PwmOut redLED(p24);//red


/**
@namespace yellowLED
@brief A PwmOut interface is used to control the frequency and mark-space ratio of a led (The yellow LED)
*/
PwmOut yellowLED(p23);//yellow


/**
@namespace greenLED
@brief A PwmOut interface is used to control the frequency and mark-space ratio of a led (The green LED)
*/
PwmOut greenLED(p22);


/**
@namespace buzzer
@brief A PwmOut interface is used to control the frequency and mark-space ratio of a buzzer
pulse train
*/
PwmOut buzzer(p21);


/**
@namespace timer
@brief Create ticker object for temperature and pressure readings
*/
Ticker timer;


/**
@namespace dataLoggerTimer
@brief a ticker object for the data logger functions
*/
Ticker dataLoggerTimer ;


/**
@namespace powerSaverTimeout
@brief create a timeout object for the poweerSaver function
*/
Timeout powerSaverTimeout;

/**
@namespace debounce
@brief create a debounce timer object to implement a debounce counter to avoid multiple interrupts.
*/
Timer debounce;


int timerFlag = 1; /*!< Flag for tempesrature pressure reading ISR */
int tickerFlag = 0 ;  /*!<Flag to show the minutes passed */
int button1Flag = 0; /*!< Flag set in button1Pressed ISR */
int button2Flag = 0 ; /*!<Flag set in button2Pressed ISR  */
int button3Flag = 0 ; /*!< Flag set in button3Pressed ISR  */
int button4Flag = 0 ; /*!< Flag set in button4Pressed ISR */
int unitFlag = 1 ; /*!< Flag set in the unitSettings function, indicates the units picked by user */
int powerSaverFlag = 0 ; /*!<Flag set in the powerSettings function when the powerSaver is switched on */
int lcdPowerFlag = 1 ; /*!< Flag set in the savePower function to indicate the status of the LCD (ON or OFF) */
int dataLoggerFlag = 0 ; /*!< Flag set by user in the dataLoggerSetting function to turn on the logger */
int runLoggerFlag = 0 ;  /*!< Fag set when the logger is switched on, allows user to navigate to this option in the main menu */
int alarmClockFlag = 0 ; /*!< Flag set in the AlarmClock function, indicates if the alarm clock has been turned on */
int thresholdAlarmFlag = 0 ; /*!<Flag set in the thresholdAlarmmenu function,indicates if the thresholds are set */

int UNIXdate=0;   /*!<An integer to store the value of UNIX time calculated by mktime function */
int currentTime ;/*!<An integer to store the UNIX value of the current time */
int powerSaverTime = 60;    /*!<An integer to set the initial value of the power saver ticker */
int dataLoggerTime = 60;    /*!<An integer used to set the initial value of the data logger ticker */

float temperature;  /*!<A float value to store the value of the temperature recieved from the sensor */
float pressure; /*!<A float value to store the value of the pressure recieved from the sensor */
float averageTemperature ;  /*!<A float value to store the average value of temperature readingsn taken over a period of time */
float averagePressure ; /*!<A float value to store the average value of pressure readings over a period of time */
float minTemperature ;  /*!<A float value to save the minimum value of temperature readings */
float maxTemperature ;  /*!<A float value to store the maximum value of temperature readings */
float minPressure;  /*!<A float value to store the minimum value of pressure readings */
float maxPressure;  /*!<A float value to store the maximum value of pressure readings */




float arrayT[83] ; /*!<A A float array to store the values of temperature to calculate the average,minimum and maximum values*/
float arrayP[83] ; /*!<A A float array to store the values of pressure to calculate the average,minimum and maximum values*/
float arrayTG[83] ; /*!<A A float array to store the values of temperature to plot the related graph */
float arrayPG[83] ;/*!<A A float array to store the values of pressure to plot the related graph */


char bufferTime[14]; /*!<A A char array (buffer) to store time*/
char bufferDate[14]; /*!<A A char array (buffer) to store date*/
char bufferT[14];/*!<A A char array (buffer) to store the value of temperature in char*/
char bufferP[14];  /*!<A A char array (buffer) to store the value of pressure in char */
// 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



char buffer0[14];   /*!<A A char array (buffer) used to display data on the LCD at (0,0)*/
char buffer1[14];   /*!<A A char array (buffer) used to display data on the LCD at (0,1)*/
char buffer2[14];   /*!<A A char array (buffer) used to display data on the LCD at (0,2)*/
char buffer3[14];   /*!<A A char array (buffer) used to display data on the LCD at (0,3)*/
char buffer4[14];   /*!<A A char array (buffer) used to display data on the LCD at (0,4)*/
char buffer5[14];   /*!<A A char array (buffer) used to display data on the LCD at (0,5)*/



//arrays used to store data to the local file
char timeSent[1000]; /*!<A A char array used to save time staps to the local file */
char dateSent[1000]; /*!<A A char array used to save date stamps the local file */
char temperatureSent[1000]; /*!<A A char array used to save the temperature readings to the local file */
char pressureSent[1000]; /*!<A A char array used to save the pressure readings to the local file */
char temperatureRecieved[1000]; /*!<A A char array used to retrive the saved temperature readings from the local file */
char pressureRecieved[1000]; /*!<A A char array used to retrive the saved pressure readings from the local file  */
char timeRecieved[1000]; /*!<A A char array used to retrive the saved time stamps from the local file  */
char dateRecieved[1000]; /*!<A A char array used to retrive the saved date stamps from the local file */



char * pch; /*!<A A char array used to split the char arrays of temperature values retrived from the local file to the individual temperature strings */
char * pch1; /*!<A A char array used to split the char arrays of pressure values retrived from the local file to the individual pressure strings*/
char * pch2; /*!<A  A char array used to split the char arrays of times retrived from the local file to the individual time strings*/
char * pch3; /*!<A  A char array used to split the char arrays of dates retrived from the local file to the individual date strings*/


int state=0; /*!<A An integer used to navigate through the finite machines (indexes)*/

float frequency[]= {659,554,659,554,659,554,659,554,659,554,659,554}; /*!<A An array of floats with different frequencies for the buzzer*/





struct  State {
    int output;
    char title[14];
    int nextState[2];
};

typedef struct State STyp1; // for the start menu

STyp1 fsmA[4] = {
    {0,"Live Data",{1,3}},
    {1,"Saved Data",{2,0}},
    {2,"Alarms",{3,1}},
    {3,"Settings",{0,2}},
};

typedef struct State STyp2; // for the settings menu

STyp2 fsmB[4] = {
    {0,"Date/Time",{1,3}},
    {1,"Units",{2,0}},
    {2,"Power Saver",{3,1}},
    {3,"Data Logger",{0,2}},
};

typedef struct State STyp3; // for the time/date settings

STyp3 fsmC[5] = {
    {12,"Hour:",{1,4}},
    {0,"Min:",{2,0}},
    {21,"Day:",{3,1}},
    {4,"Month:",{4,2}},
    {2015,"Year:",{0,3}},
};


typedef struct State STyp4; // for the units settings

STyp3 fsmD[4] = {
    {1,"C/mb",{1,3}},
    {2,"C/atm",{2,0}},
    {3,"F/mb",{3,1}},
    {4,"F/atm",{0,2}},
};


typedef struct State STyp5; // for the Power saver settings

STyp5 fsmE[2] = {
    {0,"Off",{1,1}},
    {60,"On",{0,0}},
};


typedef struct State Stype6; // for the alarms menu

Stype6 fsmF[2] = {
    {0,"Thresholds",{1,1}},
    {1,"Alarm Clock", {0,0}},
};

typedef struct State Stype7; // yes or no

Stype7 fsmG[2] = {
    {1,"Yes",{1,1}},
    {0,"No", {0,0}},
};

typedef struct State Stype8; // for the thresholds

Stype8 fsmH[4] = {
    {20,"Min T:",{1,3}},
    {30,"Max T:",{2,0}},
    {1000,"Min P:",{3,1}},
    {1100,"Max P:",{0,2}},
};


/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void button1Pressed();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void button2Pressed();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void button3Pressed();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void button4Pressed();



void sliderPulled();




void sliderRisen();



/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void timerExpired();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void dataLoggerTimerExpired ();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void tickerExpired ();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void saveToFile(char *data,char *data1,char *data2,char *data3);

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void updateTime();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void display();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void readData();


/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void powerSaverExpired();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void powerSaverCheck();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void liveData();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void loggerData();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void dataLogger();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void forecast();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void thresholdCheck();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void threshold();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void alarmClockCheck();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void alarmClock ();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void alarmsMenu ();

/**
Adds up two integer variables
@param a - integer to add
@param b - integer to add
@returns the sum of a and b
*/
void dataLoggerSetting();

/**
*Third option in the settings menu./n
*Allows the user to turn on the power saving option and set the value of time out /n
*Attaches a timeout to set the powerSaverFlag /n
@param powerSaverFlag - integer used as a flag to indicate if the power saver option is switched on or off
@param state - integer used to navigate through fsm states
*/
void powerSaverSetting();

/**
*Calculates the UNIX time value./n
*Sets the integer values entered by user to the tm structure mebers /n
*Converts the tm structure to time_t /n
@param timeinfo - tm struct sent to mktime function
@param rawtime - fundamental arithmetic type to represent the current time informations
*/
void calculateUNIXTime();

/**
*The second option in the settings menu./n
*Allows the user to change the units /n
@param unitFlag - integer used as a flag to indicate the units set
@param state - integer used to navigate through fsm states
*/
void unitsSetting();


/**
*The first option in the settings menu./n
*Allows the user to enter time and date /n
*Sends the recieved int arrays to the calculateUNIXtime function to calculate the unix time /n
*sets the current time to the calculated unix time.
@param state - integer used to navigate through fsm states
*/
void timeDateSetting();


/**
*The setting menu displayed when the fourth state of fsmA is picked from the main menu /n
*Depends on the state of the finite state machine used for this function, put the related title in the screen buffers /n
*Also copy the bufferTime (buffer used to store time) on the first screen buffer (at the top) /n
*Displays the screen buffers on the LCD/n
*switch statement checks the current state of the fsm (fsmB),
*The related function to each fsm state is executed as when a rising edge from the 4th button interrupts (button 4 is pressed)

*/
void settingsMenu();

/**
*The main menu displayed at the start /n
*Depends on the state of the finite state machine (fsmA) used for this function, put the related title in the screen buffers /n
*Also copy the bufferTime (buffer used to store time) on the first screen buffer (at the top) /n
*Displays the screen buffers on the LCD/n
*switch statement checks the current state of the fsm (fsmA),
*The related function to each fsm state is executed as when a rising edge from the 4th button interrupts (button 4 is pressed)

*/
void startMenu();