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
Revision 17:99161153081d, committed 2015-04-27
- Comitter:
- amiraseman
- Date:
- Mon Apr 27 20:58:58 2015 +0000
- Parent:
- 16:5ce95c8f4e89
- Child:
- 18:374c452e19db
- Commit message:
- Alarm clock done;
Changed in this revision
| N5110.lib | Show annotated file Show diff for this revision Revisions of this file |
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/N5110.lib Mon Apr 27 11:46:25 2015 +0000 +++ b/N5110.lib Mon Apr 27 20:58:58 2015 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/eencae/code/N5110/#813422c7e899 +http://mbed.org/users/eencae/code/N5110/#ba8addc061ea
--- a/main.cpp Mon Apr 27 11:46:25 2015 +0000
+++ b/main.cpp Mon Apr 27 20:58:58 2015 +0000
@@ -12,7 +12,10 @@
InterruptIn button2(p17);
InterruptIn button3 (p15);
InterruptIn button4 (p18);
-
+PwmOut redLED(p22);//red
+PwmOut yellowLED(p23);//yellow
+PwmOut greenLED(p24);//green
+PwmOut buzzer(p21); //buzzer
Ticker timer; //Create ticker object for temperature and pressure readings
Ticker dataLoggerTimer ; // a ticker object for the data logger functions
@@ -31,9 +34,12 @@
int lcdPowerFlag = 1 ; // Indicates if the LCD is switched on or powered off
int dataLoggerFlag = 0 ;
int saveToFileFlag = 0 ;
-int runLoggerFlag = 0 ; // if the logger is switched on allows user to pick this option
+int runLoggerFlag = 0 ; // if the logger is switched on allows user to go to this option
+int alarmClockFlag = 0 ; //indicates if the alarm clock has been turned on
+int thresholdAlarmFlag = 0 ; // indicates if the thresholds are set
int UNIXdate;
+int currentTime ;
int powerSaverTime = 60;
int dataLoggerTime = 60;
@@ -72,19 +78,22 @@
char buffer5[14];
-int state=0; // used to navigate through the finite machines fsmA and fsmB
+int state=0; // used to navigate through the finite machines
int stateplus1 ;
int stateplus2 ;
int stateminus1 ;
int stateminus2 ;
-
+float frequency[]= {659,554,659,554,550,494,554,587,494,659,554,440};
+//frequency array
+float beat[]= {1,1,1,1,1,1,1,1,1,1,1,1};
+//beat array
void savePower();
void loggerData();
-
-
+void calculateUNIXTime();
+void alarmClockCheck();
struct State {
int output;
@@ -141,6 +150,20 @@
};
+typedef struct State Stype6; // for the alarms menu
+
+Stype6 fsmF[2] = {
+ {0,"Thresholds",{1,0}},
+ {1,"Alarm Clock", {0,1}},
+};
+
+typedef struct State Stype7; // yes or no
+
+Stype7 fsmG[2] = {
+ {0,"Yes",{1,0}},
+ {1,"No", {0,1}},
+};
+
@@ -176,53 +199,39 @@
-void serialISR()
-{
- //reads rx string into buffer when a serial interrupt occurs
- serial.gets(rxString,16);
- //set flag
- setTimeFlag=1;
-}
-
-
void timerExpired() // ISR which sets the timer flag (flag used to display the buffers on LCD)
{
+ yellowLED = 0;
timerFlag=1;
+
}
void dataLoggerTimerExpired ()
{
+ yellowLED = 0;
dataLoggerFlag = 1 ;
}
-void setTime() // sets the time every second
-{
-//print time for debugging
- //serial.printf("set_time -%s ",rxString);
-//atoi() converts a string to an integer
- int time = atoi(rxString);
-//update the time
- set_time(time);
-}
-
-
void updateTime()
{
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");
+ 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));
- if (setTimeFlag) {
- setTimeFlag=0;
- setTime();
- }
}
void display()
@@ -234,6 +243,7 @@
lcd.printString(buffer3,0,3);
lcd.printString(buffer4,0,4);
lcd.printString(buffer5,0,5);
+ wait(0.1);
}
@@ -348,8 +358,10 @@
while (1) {
updateTime();
wakeUp();
- loggerData();
+ loggerData();
if (timerFlag) {
+
+ yellowLED = 1;
timerFlag=0;
readData();
strncpy(buffer1, bufferTime, 14);
@@ -360,6 +372,7 @@
int dispaly1 = sprintf (buffer0, "");//convert integer to buffer str
display();
}
+ yellowLED = 0;
if (button3Flag) {
button3Flag = 0;
timer.detach();
@@ -373,14 +386,15 @@
void loggerData() // gets the temp and pressure data and stores to suitable arrays (the arrays are used to plot the desired graphs)
{
if(dataLoggerFlag ==1) {
- int k ;
- int sumTemperature = 0;
- int sumPressure = 0;
- minTemperature = arrayT[0]; // sets the min to the first value in the array
- minPressure = arrayP[0];
- maxTemperature = arrayT[0];
- maxPressure = arrayP[0];
- readData();
+ int k ;
+ int sumTemperature = 0;
+ int sumPressure = 0;
+ minTemperature = arrayT[0]; // sets the min to the first value in the array
+ minPressure = arrayP[0];
+ maxTemperature = arrayT[0];
+ maxPressure = arrayP[0];
+ yellowLED = 1;
+ readData();
dataLoggerFlag=0;
//write the data to the arrays (arrays used to plot graphs)
@@ -421,6 +435,7 @@
i=0;
}
}
+ yellowLED = 0;
}
@@ -494,10 +509,178 @@
button3Flag=0;
break;
}
- wait(0.1);
}
}
+void alarmClockCheck() //checks if the alarmClockFlag is set
+{
+ // if (alarmClockFlag ==1) {
+ 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) {
+ button3Flag=0;
+ break;
+ }
+
+ }
+ // }
+}
+
+
+
+
+
+void alarmClock ()
+{
+ powerSaverCheck();
+ state = 0;
+ while (1) {
+
+ wakeUp();
+ updateTime();
+ loggerData();
+ stateminus1=fsmC[state].nextState[0];
+ stateminus2=fsmC[stateminus1].nextState[0];
+ stateplus1=fsmC[state].nextState[1];
+ stateplus2=fsmC[stateplus1].nextState[1];
+
+
+
+
+ int display0 = sprintf (buffer0, " Back Save");//convert integer to buffer str
+ int display1 = sprintf (buffer1, "%s %d", fsmC[stateminus2].title,fsmC[stateminus2].output);//convert integer to buffer str
+ int display2 = sprintf (buffer2, "%s %d", fsmC[stateminus1].title,fsmC[stateminus1].output);//convert integer to buffer str
+ int display3 = sprintf (buffer3, ">>%s %d", fsmC[state].title,fsmC[state].output);//convert integer to buffer str
+ int display4 = sprintf (buffer4, "%s %d", fsmC[stateplus1].title,fsmC[stateplus1].output);//convert integer to buffer str
+ int display5 = sprintf (buffer5, "%s %d", fsmC[stateplus2].title,fsmC[stateplus2].output);//convert integer to buffer str
+
+
+
+ display();
+
+
+
+ if (button4Flag) {
+ button4Flag= 0;
+ fsmC[state].output ++;
+ calculateUNIXTime();
+ }
+
+
+ //checks the limits of the values
+ if (fsmC[0].output >23) { //hour
+ fsmC[0].output = 0 ;
+ }
+ if (fsmC[1].output>59) { // minute
+ fsmC[1].output = 0 ;
+ }
+ if (fsmC[3].output>11) { //month
+ fsmC[3].output = 0 ;
+ }
+ if (fsmC[2].output>31) { //day
+ fsmC[2].output = 1 ;
+ }
+ if (fsmC[4].output>2030) { //year
+ fsmC[4].output = 2015 ;
+ }
+
+
+
+ if (button3Flag) {
+ button3Flag=0;
+ while (1) {
+ int display0 = sprintf (buffer0, "");
+ int display1 = sprintf (buffer1, "");
+ int display2 = sprintf (buffer2, "Set Alarm?");
+ int display3 = sprintf (buffer3, ">>%s", fsmG[state].title);
+ int display4 = sprintf (buffer4, "");
+ int display5 = sprintf (buffer5, "");
+ display();
+ if (state>1) {
+ state = 0;
+ }
+ if (state<0) {
+ state = 1;
+ }
+ if (button3Flag) {
+ button3Flag=0;
+ alarmClockFlag = fsmG[state].output ;
+
+ goto exit;
+ }
+ }
+ }
+ }
+exit:
+ return;
+}
+
+
+
+
+
+void alarmsMenu ()
+{
+ state = 0 ;
+ powerSaverCheck();
+ while (1) {
+ wakeUp();
+ updateTime();
+ loggerData();
+ int display0 = sprintf (buffer0, " Back Next");
+ int display1 = sprintf (buffer1, "");
+ int display2 = sprintf (buffer2, "");
+ int display3 = sprintf (buffer3, ">>%s", fsmF[state].title);
+ int display4 = sprintf (buffer4, "");
+ int display5 = sprintf (buffer5, "");
+
+ display();
+
+
+
+ if (state > 1) {
+ state = 0 ;
+ }
+ if (state < 0) {
+ state = 1 ;
+ }
+ if (button3Flag) {
+ button3Flag=0;
+ state = 0;
+ break;
+ }
+ if (button4Flag) {
+ if (state == 0) { // temp and pressure thresholds
+
+
+ }
+ if (state == 1) {// alarm clock
+
+ alarmClock();
+ }
+ }
+ }
+}
+
+
+
void dataLoggerSetting()
{
@@ -548,6 +731,7 @@
}
dataLoggerFlag = 1;
button3Flag=0;
+ state = 0;
break;
}
wait (0.1);
@@ -609,6 +793,7 @@
if (button3Flag) {
button3Flag=0;
powerSaverCheck();
+ state = 0;
break;
}
wait (0.1);
@@ -627,12 +812,11 @@
time_t rawtime;
struct tm * timeinfo;
- /* get current timeinfo: */
- time ( &rawtime ); //or: rawtime = time(0);
- /* convert to struct: */
+ // get current timeinfo
+ time ( &rawtime );
+ // convert to struct
timeinfo = localtime ( &rawtime );
-
- /* now modify the timeinfo to the given date: */
+ // now modify the timeinfo to the given date
timeinfo->tm_year = (fsmC[4].output) - 1900;
timeinfo->tm_mon = (fsmC[3].output) - 1; //months since January - [0,11]
timeinfo->tm_mday = (fsmC[2].output) ; //day of the month - [1,31]
@@ -640,7 +824,7 @@
timeinfo->tm_min = (fsmC[1].output) ; //minutes after the hour - [0,59]
timeinfo->tm_sec = 0 ; //seconds after the minute - [0,59]
- /* call mktime: create unix time stamp from timeinfo struct */
+ //call mktime to create unix time stamp from timeinfo struct
UNIXdate = mktime ( timeinfo );
}
@@ -651,7 +835,7 @@
while(1) {
wakeUp();
powerSaverCheck();
- loggerData();
+ loggerData();
if (button4Flag) {
@@ -661,6 +845,7 @@
if (button3Flag) {
button3Flag=0;
+ state = 0;
break;
}
}
@@ -675,7 +860,7 @@
while (1) {
wakeUp();
updateTime();
- loggerData();
+ loggerData();
stateminus1=fsmD[state].nextState[0];
stateminus2=fsmD[stateminus1].nextState[0];
stateplus1=fsmD[state].nextState[1];
@@ -698,6 +883,7 @@
if (button3Flag) {
button3Flag=0;
+ state = 0;
break;
}
@@ -718,7 +904,7 @@
while (1) {
wakeUp();
updateTime();
- loggerData();
+ loggerData();
stateminus1=fsmC[state].nextState[0];
stateminus2=fsmC[stateminus1].nextState[0];
stateplus1=fsmC[state].nextState[1];
@@ -769,6 +955,7 @@
if (button3Flag) {
button3Flag=0;
+ state = 0;
break;
}
wait (0.1);
@@ -845,6 +1032,7 @@
}
if (button3Flag) {
button3Flag=0;
+ state = 0;
break;
}
wait (0.1);
@@ -889,6 +1077,10 @@
case 2:
break;
case 3:
+ if (button4Flag) {
+ button4Flag=0;
+ alarmsMenu();
+ }
break;
case 4:
if (button4Flag) {
@@ -910,13 +1102,15 @@
// initiliase barometer
bmp180.init();
lcd.init();
- serial.attach(&serialISR);
button1.rise(&button1Pressed); // call ISR on rising edge (button1pressed)
button2.rise(&button2Pressed); // call ISR on rising edge (button2pressed)
button3.rise(&button3Pressed);
button4.rise(&button4Pressed);
dataLoggerTimer.attach(&dataLoggerTimerExpired , dataLoggerTime);
- set_time(UNIXdate); // initialise time from the calculated UNIX time entered by the user
+ //set_time(UNIXdate); // initialise time from the calculated UNIX time entered by the user
+ redLED.period_us(25);// Set frequency at 40kHz
+ yellowLED.period_us(25);// Set frequency at 40kHz
+ greenLED.period_us(25);// Set frequency at 40kHz
powerSaverCheck();
while(1) {