Amir Asemanpayeh / Mbed 2 deprecated WeatherStation

Dependencies:   BMP180 N5110 PowerControl mbed

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;