Level 2 Project Range Device

Dependencies:   N5110 SDFileSystem SRF02 TMP102 mbed

Revision:
7:14cfb0df30e6
Child:
8:fe6ebe807b9d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h	Mon Apr 25 10:08:05 2016 +0000
@@ -0,0 +1,489 @@
+/**
+@file main.h
+@brief Header file containing functions prototypes, defines and global variables.
+@brief Ranger Project
+@brief Revision 1.0.
+@author Philip Thompson
+@date   March 2016
+@brief The following code has been writen for the University of Leeds ELEC264501 embedded system project and is intended to
+create a programe that can read a distance from an SRF02 sensor and then based aponn the reading disply the distance on the screen
+ and increment the LEDs and buzzer according the provision of a temperature sensor is also provied as a secondary function when no
+ object is detected with in range.
+*/
+
+#ifndef MAIN_H
+#define MAIN_H
+#include "mbed.h"
+#include "mbed.h"
+#include "SRF02.h"
+#include "N5110.h"
+#include "TMP102.h"
+#include "SDFileSystem.h"
+
+#define LOW 0 /// No output
+#define HIGH 1 /// High output
+#define METRIC 1
+#define IMPERIAL 0
+
+
+/**
+@namespace LEDs
+@brief Output for Alert LEDs
+*/
+/** Red LED connect to pin PTA1*/
+DigitalOut rr_led (PTA1);
+/** amber LED connect to pin PTC2*/
+DigitalOut a_led (PTC2);
+/** Green LED connect to pin PTB23*/
+DigitalOut gg_led(PTB23);
+
+/**
+@namespace BOARDLEDs
+@brief On board LEDs
+*/
+DigitalOut r_led(LED_RED);
+DigitalOut g_led(LED_GREEN);
+DigitalOut b_led(LED_BLUE);
+
+/**
+@namespace  Buzzer
+@brief PWM output for Buzzer
+*/
+PwmOut buzzer(PTA2);
+
+/**
+@namespace  Buttons
+@brief Button triggered Interrupts
+*/
+InterruptIn sw1(PTB19);
+InterruptIn sw2(PTB18);
+
+/**
+@namespace  Timers
+@brief Tickers and time outs
+*/
+Ticker ticker;
+Ticker ticker_srf02;
+Ticker ticker_tone;
+Ticker ticker_standby;
+Timeout buzzoff;
+
+// Create TMP102 object
+TMP102 tmp102(I2C_SDA,I2C_SCL);
+
+/**
+@namespace  Ranger
+@brief Creat the Ranger object
+*/
+SRF02 srf02(I2C_SDA,I2C_SCL);
+
+/**
+@namespace  LCD
+@brief Creats the LCD object
+*/
+N5110           lcd(PTE26,PTA0,PTC4,PTD0,PTD2,PTD1,PTC3);
+
+/// Connections to SD card holder on K64F (SPI interface)
+SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
+
+/**
+@namespace  TimerFlags
+@brief Flags for use with timed interupts
+*/
+volatile int g_timer_flag_led = 0, g_timer_flag_srf02 = 0,  g_timer_flag_tone = 0; /** Flag rised by interupts*/
+volatile int g_timer_flag_standby = 0;
+/**
+@namespace  ButtonFlages
+@brief Flags for use with button interupts
+*/
+volatile int g_sw1_flag = 0, g_sw2_flag = 0;
+
+/**
+@namespace  RangePresets
+@brief Preset range of the differant alert levels
+*/
+int r1 = 3,/*!< Upper limit of alert 1 */r2 = 20,/*!< Upper limit of alert 2 */r3 = 40,/*!< Upper limit of alert 3 */r4 = 60,/*!< Upper limit of alert 4 */r5 = 80,/*!< Upper limit of alert 5 */r6 = 100,/*!< Upper limit of alert 6 */r7 = 120; /*!< Upper limit of alert 7 */
+
+FILE *fp;
+
+int myarray[9];/*!< array to hold last ten range readings  */
+int d =0;
+int t;
+int i;
+float avgdistance;
+int totaldistance;
+int subpage; /*!< veriable to hold the page being viewed with in the submenu  */
+int page;/*!< veriable to hold the page being viewed with in the menu */
+int offset = 0;/*!< veriable to hold the offset and adjust the 0 Range point */
+int alert;/*!< veriable to hold the current alert level */
+int distance;/*!< veriable to hold the distance read from the srf02 sensor */
+float bright = 1;/*!< veriable to hold the current LED backlight of the 5110 LCD */
+char units = METRIC;/*!< veriable to hold the current unit type set to METRIC as default */
+int length, length1, length2, length3, length4;
+char buffer[14], buffer1[14], buffer2[14], buffer3[14], buffer4[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
+float T;
+int standby =1;
+float c =1; /// convertion factor from Cm to inch
+
+
+struct Alertlevel {
+    char srr_led;  /// stead RED LED state
+    char sa_led;    /// stead AMBER LED state
+    char sgg_led;  /// stead GREEN LED state
+    char frr_led;///FLASHING RED LED state
+    char fa_led; ///FLASHING AMBER LED state
+    char fgg_led; ///FLASHING GREEN LED state
+    int toneon;
+    int toneoff;
+ }; /*!< Stucture to hold all outputs. Steady LEDs, Flashing LEDs, Tone on, Tonne off*/
+typedef const struct Alertlevel STyp;
+
+STyp Alertlevel[8] = {
+    {LOW,LOW,LOW,LOW,LOW,LOW,0,1}, // no output
+    {LOW,LOW,LOW,LOW,LOW,HIGH,1,8}, //flash green
+    {LOW,LOW,HIGH,LOW,LOW,LOW,2,7}, //steady green
+    {LOW,LOW,HIGH,LOW,HIGH,LOW,4,5}, //flash amber
+    {LOW,HIGH,HIGH,LOW,LOW,LOW,6,3}, //steady amber
+    {LOW,HIGH,HIGH,HIGH,LOW,LOW,8,1}, //flash red
+    {HIGH,HIGH,HIGH,LOW,LOW,LOW,9,0},// steady red
+    {LOW,LOW,LOW,HIGH,HIGH,HIGH,9,0} // all flash
+};/*!< Array contaning structures for diffent outputs */
+
+
+void lcdoutput();
+void timer_isr_led();
+void timer_isr_srf02();
+void timer_isr_tone();
+void timer_isr_standby();
+/** Called to increment to brightness by 0.2 each time when at 1 resets back to 0.0
+@param bright 0.0-1
+@returns lcd.setbrightness
+@code
+if (bright == 1.0) {
+    bright = 0;
+} else {
+    bright += 0.2;
+}
+lcd.setBrightness(bright);
+@endcode
+*/
+void backlight();
+void init_K64F();
+void sw2_isr();
+void sw1_isr();
+void setup();
+
+/** A fuction used to determin the alert level given a range with the use of IF statments
+@param distance The distance read from sensor
+@param alert The level that distance falls with in 0 -7
+@returns alert
+@code
+if (distance >= r6 && distance < r7) {  // r6 150 and r7 200
+    alert = 1; /// alert 1 distance between preset 150Cm to 200Cm
+} else if (distance >= r5 && distance  < r6) {
+    alert = 2; /// alert 2 when between preset 90Cm to 150Cm
+} else if (distance >= r4 && distance < r5) {
+    alert = 3; /// alert 3 when distance between 60Cm to 90Cm
+} else if (distance >= r3 && distance < r4) {
+    alert = 4; /// alert 4 when distance between 40Cm and 60Cm
+} else if ( distance > r2 && distance < r3) {
+    alert = 5; ///alert 5 when distance between 20Cm and 40m
+} else if (distance > r1 && distance <= r2) { //r1 3 and r2 20
+    alert = 6; ///alert 6 when distance between 1 and 20
+} else if (distance <=r1) {
+    alert = 7; ///alert 7 when distance below 1Cm
+} else {
+    alert = 0; /// alert 0 all else
+}
+}
+@endcode
+*/
+void setalert();
+/** If statments to determine the output of each LED by inspecting the struct in the relevent element of the alertlevel array
+
+@code
+   if (alert ==7) {
+       if (g_timer_flag_led) {
+           g_timer_flag_led = 0;  // if it has, clear the flag
+           rr_led = !rr_led;
+           gg_led = !gg_led;
+           a_led = !a_led;
+       }
+   } else if(Alertlevel[alert].fa_led == HIGH) {
+       if (g_timer_flag_led) {
+           g_timer_flag_led = 0;  // if it has, clear the flag
+           a_led = !a_led;
+       }
+   } else if (Alertlevel[alert].frr_led == HIGH) {
+       if (g_timer_flag_led) {
+           g_timer_flag_led = 0;  // if it has, clear the flag
+           rr_led = !rr_led;
+       }
+   } else if(Alertlevel[alert].fgg_led == HIGH) {
+       if (g_timer_flag_led) {
+           g_timer_flag_led = 0;  // if it has, clear the flag
+           gg_led = !gg_led;
+       }
+   } else {
+       rr_led = Alertlevel[alert].srr_led;
+       a_led = Alertlevel[alert].sa_led;
+       gg_led = Alertlevel[alert].sgg_led;
+   }
+
+}
+@endcode*/
+void setleds();
+void setbuzzer();
+
+
+void menu();
+/**
+{
+     Function called to invoke a menu within a while loop with button interupts used to move pages and adjust within a switch statment
+    @param g_sw1_flag 0 or 1 used to advance page
+    @param g_sw2_flag 0 or 1 used to adjust current item
+    @code
+    while(1) {
+
+
+        if (g_sw1_flag) {
+            g_sw1_flag = 0;
+            page++; /// Moves page
+            lcd.clear();
+        }
+        switch (page) {
+            case 0:
+                if (g_sw2_flag) {
+                    g_sw2_flag = 0;  // if it has, clear the flag
+                    backlight();
+                    lcd.clear();
+                } else {
+                    int lightbar = bright*84;
+                    sprintf(buffer2,"*****MENU*****");
+                    sprintf(buffer1,"BACKLIGHT");
+                    sprintf(buffer3,"%.0f%%",bright*100);
+                    lcd.printString(buffer2,0,0);
+                    lcd.printString(buffer1,0,1);
+                    lcd.printString(buffer3,0,2);
+                    lcd.drawRect(0,38,lightbar,7,1);
+                    lcd.refresh();
+
+                }
+                break;
+
+            case 1:
+                if (g_sw2_flag) {
+                    g_sw2_flag = 0;  // if it has, clear the flag
+                    if (offset == 20) {
+                        offset = 0;
+                    } else {
+                        offset += 1;
+                    }
+                } else {
+                    length2 = sprintf(buffer2,"*****MENU*****");
+                    length1 = sprintf(buffer1,"OFFSET");
+                    length3 = sprintf(buffer3,"%i",offset);
+                    lcd.printString(buffer2,0,0);
+                    lcd.printString(buffer1,0,1);
+                    lcd.printString(buffer3,0,2);
+                    lcd.refresh();
+                }
+
+                break;
+
+            case 2:
+                if (g_sw2_flag) {
+                    g_sw2_flag = 0;  // if it has, clear the flag
+                    if (units == METRIC) {
+                        units = IMPERIAL;
+                    } else {
+                        units = METRIC;
+                    }
+                }
+                if (units == METRIC) {
+                    sprintf(buffer3,"METRIC");
+                    lcd.printString(buffer3,0,2);
+                } else {
+                    sprintf(buffer3,"IMPERIAL");
+                    lcd.printString(buffer3,0,2);
+                }
+
+                sprintf(buffer2,"*****MENU*****");
+                sprintf(buffer1,"UNITS");
+                lcd.printString(buffer2,0,0);
+                lcd.printString(buffer1,0,1);
+                lcd.refresh();
+
+                break;
+
+            case 3:
+
+                if (g_sw2_flag) {
+                    g_sw2_flag = 0;  // if it has, clear the flag
+                    submenu();
+                }
+                length2 = sprintf(buffer3,"*****MENU*****");
+                length3 = sprintf(buffer1,"RANGE");
+                length3 = sprintf(buffer2,"PARAMETERS");
+                lcd.printString(buffer3,0,0);
+                lcd.printString(buffer1,0,1);
+                lcd.printString(buffer2,0,2);
+
+
+                break;
+
+            default:
+                lcd.clear();
+                return;
+        }
+    }
+    @endcode
+    */
+    void menu();
+    /**
+    @code
+       while(1) {
+        /// innterupt used to shift page
+        if (g_sw1_flag) {
+            g_sw1_flag = 0;
+            subpage++;
+        }
+        switch (subpage) {
+                ///interupt used to adjust range
+            case 0:
+                if (g_sw2_flag) {
+                    g_sw2_flag = 0;           // if it has, clear the flag
+                    if (r2 == r3) {
+                        r2 = 1;
+                    } else {
+                        r2 = r2+1;
+                    }
+                }
+                length2 = sprintf(buffer1,"*****MENU*****");
+                length3 = sprintf(buffer2,"RANGE");
+                length3 = sprintf(buffer3,"PARAMETERS");
+                length4 = sprintf(buffer4,"1Cm  to  %iCm",r2);
+                lcd.printString(buffer1,0,0);
+                lcd.printString(buffer2,0,1);
+                lcd.printString(buffer3,0,2);
+                lcd.printString(buffer4,0,3);
+                break;
+
+            case 1:
+
+                if (g_sw2_flag) {
+                    g_sw2_flag = 0;           // if it has, clear the flag
+                    if (r3 == r4) {
+                        r3 = r2;
+                    } else {
+                        r3 += 1;
+                    }
+                }
+
+                sprintf(buffer1,"*****MENU*****");
+                sprintf(buffer2,"RANGE");
+                sprintf(buffer3,"PARAMETERS");
+                sprintf(buffer4,"%iCm  to  %iCm",r2,r3);
+                lcd.printString(buffer1,0,0);
+                lcd.printString(buffer2,0,1);
+                lcd.printString(buffer3,0,2);
+                lcd.printString(buffer4,0,3);
+                break;
+
+            case 2:
+
+                if (g_sw2_flag) {
+                    g_sw2_flag = 0;           // if it has, clear the flag
+                    if (r4 == r5) {
+                        r4 = r3;
+                    } else {
+                        r4 += 1;
+                    }
+                }
+
+                sprintf(buffer1,"*****MENU*****");
+                sprintf(buffer2,"RANGE");
+                sprintf(buffer3,"PARAMETERS");
+                sprintf(buffer4,"%iCm  to  %iCm",r3,r4);
+                lcd.printString(buffer1,0,0);
+                lcd.printString(buffer2,0,1);
+                lcd.printString(buffer3,0,2);
+                lcd.printString(buffer4,0,3);
+                break;
+
+            case 3:
+
+                if (g_sw2_flag) {
+                    g_sw2_flag = 0;           // if it has, clear the flag
+                    if (r5 == r6) {
+                        r5 = r4;
+                    } else {
+                        r5 += 1;
+                    }
+                }
+
+                sprintf(buffer1,"*****MENU*****");
+                sprintf(buffer2,"RANGE");
+                sprintf(buffer3,"PARAMETERS");
+                sprintf(buffer4,"%iCm to %iCm",r4,r5);
+                lcd.printString(buffer1,0,0);
+                lcd.printString(buffer2,0,1);
+                lcd.printString(buffer3,0,2);
+                lcd.printString(buffer4,0,3);
+                break;
+            case 4:
+
+                if (g_sw2_flag) {
+                    g_sw2_flag = 0;           // if it has, clear the flag
+                    if (r6 == r7) {
+                        r6 = r5;
+                    } else {
+                        r6 += 1;
+                    }
+                }
+
+                length2 = sprintf(buffer1,"*****MENU*****");
+                length3 = sprintf(buffer2,"RANGE");
+                length3 = sprintf(buffer3,"PARAMETERS");
+                length3 = sprintf(buffer4,"%iCm to %iCm",r5,r6);
+                lcd.printString(buffer1,0,0);
+                lcd.printString(buffer2,0,1);
+                lcd.printString(buffer3,0,2);
+                lcd.printString(buffer4,0,3);
+                break;
+            case 5:
+
+                if (g_sw2_flag) {
+                    g_sw2_flag = 0;           // if it has, clear the flag
+                    if (r7 == 300) {
+                        r7 = r6;
+                    } else {
+                        r7 += 1;
+                    }
+                }
+
+                length2 = sprintf(buffer1,"*****MENU*****");
+                length3 = sprintf(buffer2,"RANGE");
+                length3 = sprintf(buffer3,"PARAMETERS");
+                length3 = sprintf(buffer4,"%iCm to %iCm",r6,r7);
+                lcd.printString(buffer1,0,0);
+                lcd.printString(buffer2,0,1);
+                lcd.printString(buffer3,0,2);
+                lcd.printString(buffer4,0,3);
+                break;
+
+            default:
+                lcd.clear();
+                //  save();
+                return;
+        }
+    }
+    }
+    @endcode
+    */
+    void submenu();
+    void save();
+    void load();
+    void standby1();
+
+#endif
\ No newline at end of file