Amir Asemanpayeh / Mbed 2 deprecated WeatherStation

Dependencies:   BMP180 N5110 PowerControl mbed

Files at this revision

API Documentation at this revision

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) {