Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BMP180 N5110 PowerControl mbed
Diff: main.cpp
- Revision:
- 18:374c452e19db
- Parent:
- 17:99161153081d
- Child:
- 19:61eaa5235ccf
--- a/main.cpp Mon Apr 27 20:58:58 2015 +0000
+++ b/main.cpp Wed Apr 29 12:50:00 2015 +0000
@@ -12,9 +12,9 @@
InterruptIn button2(p17);
InterruptIn button3 (p15);
InterruptIn button4 (p18);
-PwmOut redLED(p22);//red
+PwmOut redLED(p24);//red
PwmOut yellowLED(p23);//yellow
-PwmOut greenLED(p24);//green
+PwmOut greenLED(p22);//green
PwmOut buzzer(p21); //buzzer
Ticker timer; //Create ticker object for temperature and pressure readings
@@ -84,7 +84,7 @@
int stateminus1 ;
int stateminus2 ;
-float frequency[]= {659,554,659,554,550,494,554,587,494,659,554,440};
+float frequency[]= {659,554,659,554,659,554,659,554,659,554,659,554};
//frequency array
float beat[]= {1,1,1,1,1,1,1,1,1,1,1,1};
//beat array
@@ -93,6 +93,7 @@
void savePower();
void loggerData();
void calculateUNIXTime();
+void thresholdCheck();
void alarmClockCheck();
struct State {
@@ -160,11 +161,18 @@
typedef struct State Stype7; // yes or no
Stype7 fsmG[2] = {
- {0,"Yes",{1,0}},
- {1,"No", {0,1}},
+ {1,"Yes",{1,0}},
+ {0,"No", {0,1}},
};
+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}},
+};
@@ -223,15 +231,13 @@
time_t seconds = time(NULL); // get current time
// format time into a string (time and date)
currentTime = seconds ; // sets the current time to an integer for alarm clock check
- if (currentTime == UNIXdate ) { // if the current time is equal to the time set by the alarm
- serial.printf("Alarm clock activated\n");
+ //serial.printf("current time :%i \n",currentTime);
+ //serial.printf("Unix date :%i \n",UNIXdate);
+ strftime(bufferTime, 14 , "%I:%M", localtime(&seconds));
+ strftime(bufferDate, 14 , "%d/%m/%y", localtime(&seconds));
+ if (alarmClockFlag == 1 ) { // if the the alarm clock flag is set by the user
alarmClockCheck();
}
- serial.printf("current time :%i \n",currentTime);
- serial.printf("Unix date :%i \n",UNIXdate);
- strftime(bufferTime, 14 , "%I:%M", localtime(&seconds));
- strftime(bufferDate, 14 , "%d/%m/%y", localtime(&seconds));
-
}
void display()
@@ -285,6 +291,13 @@
// it is important the format specifier ensures the length will fit in the buffer
}
+ if (thresholdAlarmFlag == 1) { // if the flag is set by the user to notify the thresholds
+ serial.printf("thresholds flag checked = 1\n");
+ serial.printf("real values: t %i p %f \n",temperature,pressure);
+ serial.printf("thresholds: mint%i maxt%i minP%i maxP %i \n",fsmH[0].output,fsmH[1].output,fsmH[2].output,fsmH[3].output);
+ thresholdCheck();
+ }
+
}
@@ -299,7 +312,7 @@
serial.printf("one of the buttons are pressed to turn on the lcd\n");
lcdPowerFlag = 1 ; // sets the status of the lcd to powered on
- serial.printf("lcd is on\n");
+ //serial.printf("lcd is on\n");
lcd.init(); // turns the LCD on
powerSaverTimeout.attach(&savePower, powerSaverTime); // setup a timeiut to call the savePower function
button1Flag = 0 ;
@@ -413,7 +426,7 @@
averageTemperature = sumTemperature/(k+1) ; //calculates the average value
sumPressure += arrayP[k]; // calculates the sum of the stored values
- averagePressure = sumPressure/(k+1) ; //calculates the average value
+ averagePressure =( 25*(sumPressure/(k+1))) ; //calculates the average value
if(arrayT[k]>maxTemperature) { // checks if any of the values in the array is bigger than the fist value
maxTemperature=arrayT[k]; // if any greater values, sets the max value to that
@@ -422,13 +435,15 @@
minTemperature=arrayT[k];
}
if(arrayP[k]>maxPressure) { // checks if any of the values in the array is bigger than the fist value
- maxPressure=arrayP[k]; // if any greater values, sets the max value to that
+ maxPressure=(25*arrayP[k]); // if any greater values, sets the max value to that
}
if(arrayP[k]<maxPressure) {
- minPressure=arrayP[k];
+ minPressure=(25*arrayP[k]);
}
}
+
+
i++; // moves to the next cell in the array
if (i>83) {
lcd.clear();
@@ -512,36 +527,229 @@
}
}
-void alarmClockCheck() //checks if the alarmClockFlag is set
+
+
+
+void thresholdCheck()
{
- // if (alarmClockFlag ==1) {
- serial.printf("Alarm clock flag is set\n");
- alarmClockFlag =0 ;
+ if (temperature == fsmH[0].output) { //if the current temp is less than the set threshold
+ while (1) {
+ redLED = 0 ;
+ strncpy(buffer0, bufferTime, 14);
+ int display2 = sprintf (buffer1, "");
+ int display0 = sprintf (buffer2, "Threshold");
+ int display1 = sprintf (buffer3, "Reached!");
+ int display4 = sprintf (buffer4, "%0.1d!",temperature);
+ int display5 = sprintf (buffer5, "Stop");
+ display();
+ for (int i=0; i<=11; i++) {
+ buzzer.period(1/(frequency[i])); // set PWM period
+ buzzer=0.5; // set duty cycle
+ wait(0.5*beat[i]); // hold for beat period
+ redLED = 1 ;
+ if (button3Flag) {
+ buzzer = 0 ;
+ button3Flag=0;
+ goto exit ;
+ }
+ }
+ }
+ }
+ if (temperature == fsmH[1].output) { //if the current temp is greater than the set threshold
+ while (1) {
+ redLED = 0 ;
+ strncpy(buffer0, bufferTime, 14);
+ int display2 = sprintf (buffer1, "");
+ int display0 = sprintf (buffer2, "Threshold");
+ int display1 = sprintf (buffer3, "Reached!");
+ int display4 = sprintf (buffer4, "%0.1d!",temperature );
+ int display5 = sprintf (buffer5, "Stop");
+ display();
+ for (int i=0; i<=11; i++) {
+ buzzer.period(1/(frequency[i])); // set PWM period
+ buzzer=0.5; // set duty cycle
+ wait(0.5*beat[i]); // hold for beat period
+ redLED = 1 ;
+ if (button3Flag) {
+ buzzer = 0 ;
+ button3Flag=0;
+ goto exit ;
+ }
+ }
+ }
+ }
+ if (pressure == fsmH[2].output) { //if the current pressure is less than the set threshold
+ while (1) {
+ redLED = 0 ;
+ strncpy(buffer0, bufferTime, 14);
+ int display2 = sprintf (buffer1, "");
+ int display0 = sprintf (buffer2, "Threshold");
+ int display1 = sprintf (buffer3, "Reached!");
+ int display4 = sprintf (buffer4, "%0.1f!",pressure);
+ int display5 = sprintf (buffer5, "Stop");
+ display();
+ for (int i=0; i<=11; i++) {
+ buzzer.period(1/(frequency[i])); // set PWM period
+ buzzer=0.5; // set duty cycle
+ wait(0.5*beat[i]); // hold for beat period
+ redLED = 1 ;
+ if (button3Flag) {
+ buzzer = 0 ;
+ button3Flag=0;
+ goto exit ;
+ }
+ }
+ }
+ }
+ if (pressure == fsmH[3].output) { //if the current pressure is greater than the set threshold
+ while (1) {
+ redLED = 0 ;
+ strncpy(buffer0, bufferTime, 14);
+ int display2 = sprintf (buffer1, "");
+ int display0 = sprintf (buffer2, "Threshold");
+ int display1 = sprintf (buffer3, "Reached!");
+ int display4 = sprintf (buffer4, "%0.1f!",pressure);
+ int display5 = sprintf (buffer5, "Stop");
+ display();
+ for (int i=0; i<=11; i++) {
+ buzzer.period(1/(frequency[i])); // set PWM period
+ buzzer=1; // set duty cycle
+ wait(0.5*beat[i]); // hold for beat period
+ redLED = 1 ;
+ if (button3Flag) {
+ buzzer = 0 ;
+ button3Flag=0;
+ goto exit ;
+ }
+ }
+ }
+ }
+ exit:
+ redLED = 0 ;
+
+}
+
+
+void threshold()
+{
+ powerSaverCheck();
+ state = 0;
+ //sets the initial threshhold values to the values recieved from the sensor
+ readData();
+ fsmH[0].output = temperature;
+ fsmH[1].output = temperature;
+ fsmH[2].output = pressure;
+ fsmH[3].output = pressure;
+
while (1) {
- int display0 = sprintf (buffer0, "");
- int display1 = sprintf (buffer1, "Alarm !");
- strncpy(buffer2, bufferTime, 14);
- int display2 = sprintf (buffer3, "");
- int display4 = sprintf (buffer4, "");
- int display5 = sprintf (buffer5, "Stop");
+
+ wakeUp();
+ updateTime();
+ loggerData();
+
+
+
+ int display0 = sprintf (buffer0, " Back Save");//convert integer to buffer str
+ int display1 = sprintf (buffer1, "");//convert integer to buffer str
+ int display2 = sprintf (buffer2, "");//convert integer to buffer str
+ int display3 = sprintf (buffer3, ">>%s %d", fsmH[state].title,fsmH[state].output);//convert integer to buffer str
+ int display4 = sprintf (buffer4, "");//convert integer to buffer str
+ int display5 = sprintf (buffer5, "");//convert integer to buffer str
+
+
display();
- for (int i=0; i<=11; i++) {
- buzzer.period(1/(frequency[i])); // set PWM period
- buzzer=0.5; // set duty cycle
- wait(0.5*beat[i]); // hold for beat period
+
+
+
+ if (button4Flag) {
+ button4Flag= 0;
+ fsmH[state].output ++;
+ }
+
+
+ //checks the limits of the values
+ if (fsmH[0].output >(temperature*2)) { //min temperature
+ fsmH[0].output = -(temperature*2) ;
+ }
+ if (fsmH[1].output>(temperature*2)) { // max temperature
+ fsmH[1].output = -(temperature*2) ;
+ }
+ if (fsmH[2].output>(pressure*2)) { //min pressure
+ fsmH[2].output = -(pressure*2) ;
+ }
+ if (fsmH[3].output>(pressure*2)) { //max pressure
+ fsmH[3].output = -(pressure*2) ;
+ }
+
+
+ if (button3Flag) {
+ button3Flag=0;
+ while (1) {
+ int display0 = sprintf (buffer0, "");
+ int display1 = sprintf (buffer1, "");
+ int display2 = sprintf (buffer2, "Set Thresholds?");
+ int display3 = sprintf (buffer3, ">>%s", fsmG[state].title); // yes or no (1 or 0 output)
+ int display4 = sprintf (buffer4, "");
+ int display5 = sprintf (buffer5, "");
+ display();
+ thresholdAlarmFlag = fsmG[state].output ; //yes or no (1 or 0)
+ if (state>1) {
+ state = 0;
+ }
+ if (state<0) {
+ state = 1;
+ }
+ if (button3Flag) {
+ button3Flag=0;
+ serial.printf("thresholds flag :%i \n",fsmG[state].output);
+ serial.printf("thresholds: mint%i maxt%i minP%i maxP %i \n",fsmH[0].output,fsmH[1].output,fsmH[2].output,fsmH[3].output);
+ goto exit;
+ }
+ }
+ }
+ }
+exit:
+ return;
+}
+
+
+
+
+
+
+
+void alarmClockCheck()
+{
+ if (currentTime == UNIXdate) { //if the current time is equal to the time set by user
+ //serial.printf("Alarm clock flag is set\n");
+ alarmClockFlag =0 ;
+ while (1) {
+ int display0 = sprintf (buffer0, "");
+ int display1 = sprintf (buffer1, "Alarm !");
+ strncpy(buffer2, bufferTime, 14);
+ int display2 = sprintf (buffer3, "");
+ int display4 = sprintf (buffer4, "");
+ int display5 = sprintf (buffer5, "Stop");
+ display();
+ for (int i=0; i<=11; i++) {
+ buzzer.period(1/(frequency[i])); // set PWM period
+ buzzer=0.5; // set duty cycle
+ wait(0.5*beat[i]); // hold for beat period
+ if (button3Flag) {
+ buzzer = 0 ;
+ break;
+ }
+ }
if (button3Flag) {
- buzzer = 0 ;
+ button3Flag=0;
break;
}
- }
- if (button3Flag) {
- button3Flag=0;
- break;
+
}
+ }
+}
- }
- // }
-}
+
@@ -613,6 +821,7 @@
int display4 = sprintf (buffer4, "");
int display5 = sprintf (buffer5, "");
display();
+ alarmClockFlag = fsmG[state].output ;
if (state>1) {
state = 0;
}
@@ -621,8 +830,6 @@
}
if (button3Flag) {
button3Flag=0;
- alarmClockFlag = fsmG[state].output ;
-
goto exit;
}
}
@@ -668,7 +875,7 @@
}
if (button4Flag) {
if (state == 0) { // temp and pressure thresholds
-
+ threshold();
}
if (state == 1) {// alarm clock
@@ -696,7 +903,7 @@
int display3 = sprintf (buffer3, ">>%s", fsmE[state].title);
if (state == 1) {
int display4 = sprintf (buffer4, "%i mins", fsmE[state].output/60);
- } else { // if the power saver is off it dowsnt show the time
+ } else { // if the power saver is off it doesnt show the time
int display4 = sprintf (buffer4, "");
}
int dispaly5 = sprintf (buffer5, "");
@@ -708,7 +915,7 @@
runLoggerFlag = state ; //sets the flag to the value of state (0 is off, 1 is on)
dataLoggerTime = fsmE[state].output; //sets the timer to to value of output from the fsm
- serial.printf("data logger Time = %i \n dataLoggerFlag = %i \n",dataLoggerTime , dataLoggerFlag);
+ serial.printf("data logger Time = %i \n dataLoggerFlag = %i \n",dataLoggerTime , runLoggerFlag);
if (button4Flag) {
button4Flag=0;