header file

Dependencies:   N5110 PowerControl SRF02 beep mbed

ultrasonic.cpp

Committer:
probrania7
Date:
2015-05-07
Revision:
2:184524f95eb1
Parent:
1:920749af1300
Child:
3:bbfabbbc4291

File content as of revision 2:184524f95eb1:

#include "mbed.h"
#include "N5110.h"
#include "beep.h"
#include "SRF02.h"
#include "timeMgr.h"
#include "datafile.h"


//    VCC,SCE,RST,D/C,MOSI,SCLK,LED
N5110 lcd(p7,p8,p9,p10,p11,p13,p26);
// Can also power (VCC) directly from VOUT (3.3 V) -
// Can give better performance due to current limitation from GPIO pin

//          SDA, SCL
SRF02 sensor(p28,p27);

Beep beep1(p21);
AnalogIn potIn (p20);

DigitalOut Led1 (p24);
DigitalOut Led2 (p14);
DigitalOut Led3 (p25);
DigitalOut Led4 (p23);
//=========================
InterruptIn button1 (p17);
InterruptIn button2 (p29);
InterruptIn button3 (p30);
//===============================
int button1Flag = 0;
int button2Flag = 0;
int button3Flag = 0;
int msgFlag = 1;

//function declarations
//=========================
void introMessage();
void errorHandler();
void menu();
void demo();
void cursorSelect(int, int, int, int);
void beeper(float, float);
void menuLevel(float);
void startMessage();
void displayClock();
//====================================
void distMeasure();
void saveData();
void adjustBrightness(float);
void sysClock();
void startClockMsg();
void clearRow();
void snapShot();
//------------------------
void button1Pressed();
void button2Pressed();
void button3Pressed();


int menuLevelFlag = 0;
int brightFlag = 0;
int distFlag = 0;
int clockFlag = 0;


Ticker distTimer;
int dstFlg = 0;
void distChk()
{
    dstFlg = 1;
}


Ticker clkTimer;
int clkFlg = 0;
void clkChk()
{
    clkFlg = 1;
}

void buzzerRange();

int distance;
//--------------------

int speedTime;
int soundDist;
int soundSpeed;
int Mspeed;

//--------------------


int main()
{
    // first need to initialise display
    lcd.init();

    // beeper(1000, 0.5);

    serial.attach(&serialISR); // attach serial ISR
    timer2.attach(&timer2Expired,1.0);

    set_time(1424535031); // initialise time to 1st January 1970
    //1424535031

    introMessage();

    button1.rise(&button1Pressed);
    button3.rise(&button3Pressed);
//-----------------------------------------------------

//-----------------------------------------------------
    distTimer.attach(&distChk, 1.0); //call ISR every 5 sec
    clkTimer.attach(&clkChk, 1.0); //call ISR every 5 sec
    while(1) 
    {
        if (msgFlag) 
        {
            startMessage();
        }

        if (button1Flag) 
        {
            msgFlag=0;
            menu();
            menuLevelFlag = 1;
        }

        if (menuLevelFlag) 
        {
            button1Flag =0;
            menuLevel(potIn);
        }

        if (distFlag) 
        {
            menuLevelFlag = 0;
            if (dstFlg) 
            {
                dstFlg = 0;
                distMeasure();

                if(button1) 
                {
                    distFlag = 0;
                }
            }
        }

        if (brightFlag) 
        {
            menuLevelFlag = 0;
            adjustBrightness(potIn);
            if (button1) 
            {
                brightFlag = 0;
            }

        }
        if (clockFlag) 
        {
            menuLevelFlag = 0;
            if (clkFlg) 
            {
                clkFlg = 0;
                displayClock();
                if (button1) 
                {
                    clockFlag = 0;
                }
            }
        }

        sleep();
    }
}

void introMessage()
{
    //introducto text a
    lcd.drawLine(4, 0, 79, 0, 1);
    lcd.printString("Ultrasonic",13,1);
    lcd.printString("Distance",18,2);
    lcd.printString("Sensor",23,3);
    lcd.drawLine(4, 45, 79, 45, 1);

    wait(1.3);
    lcd.clear();

    //introductory text b
    lcd.drawLine(4, 0, 79, 0, 1);
    lcd.printString("University",13,1);
    lcd.printString("Of",35,2);
    lcd.printString("Leeds",26,3);
    lcd.drawLine(4, 45, 79, 45, 1);

    wait(1.3);
    lcd.clear();

    //introductory text c
    lcd.drawLine(4, 0, 79, 0, 1);
    lcd.printString("Ibrahim Adam",5,1);
    lcd.printString("200789110",10,2);
    lcd.printString("Yr2 - 2015",8,3);
    lcd.drawLine(4, 45, 79, 45, 1);

    wait(1.3);
    lcd.clear();

    //introductory text c
    lcd.drawLine(4, 0, 79, 0, 1);
    lcd.printString("Elec 2645",15,1);
    lcd.printString("Embedded SYS",8,2);
    lcd.printString("Project",21,3);
    lcd.drawLine(4, 45, 79, 45, 1);

    msgFlag = 1;

    wait(1.3);
    lcd.clear();

    startClockMsg();
}

void errorHandler()
{
    //end text
    lcd.drawLine(4, 0, 79, 0, 1);
    lcd.printString("Error Help",12,1);


    wait(0.2);
    lcd.clear();
}

void adjustBrightness(float x)
{
    if ((x >= 0) && (x < 0.2)) {

        lcd.setBrightness(0);
        lcd.printString("Light 0%",13,1);
    }

    if ((x >= 0.2) && (x < 0.4)) {

        lcd.setBrightness(0.25);
        lcd.printString("Light 25%",13,1);
    }

    if ((x >= 0.4) && (x < 0.6)) {

        lcd.setBrightness(0.5);
        lcd.printString("Light 50%",13,1);
    }

    if ((x >= 0.6) && (x < 0.8)) {

        lcd.setBrightness(0.75);
        lcd.printString("Light 75%",13,1);

    }
    if (x >= 0.8) {

        lcd.setBrightness(1);
        lcd.printString("Light 100%",13,1);
    }
    lcd.clear();
    
}

void menu()
{
    lcd.clear();
    lcd.printString("-MAIN MENU-",9,0);
    lcd.drawLine(4, 7, 79, 7, 1);
    lcd.printString("Dist read",15,1);
    lcd.printString("Data",15,2);
    lcd.printString("brightness",15,3);
    lcd.printString("SYS Clock",15,4);
}

void cursorSelect(int xDimm, int xLimm, int yDimm, int yLimm)
{
    int i,j;

    //clear selecton column
    for (i = 1; i < 6; i++) 
    {
        for(j = 1; j < 46; j++) 
        {
            lcd.clearPixel(i,j);
        }
    }

    //particular selection
    for (i = xDimm; i < xLimm; i++) 
    {
        for(j = yDimm; j < yLimm; j++) 
        {
            lcd.setPixel(i,j);
        }
    }
    lcd.refresh();
}

void demo()
{
    // these are default settings so not strictly needed
    lcd.normalMode();      // normal colour mode
    lcd.setBrightness(0.5); // put LED backlight on 50%

    // can directly print strings at specified co-ordinates
    lcd.printString("Hello, World!",0,0);

    char buffer[14];  // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
    // so can display a string of a maximum 14 characters in length
    // or create formatted strings - ensure they aren't more than 14 characters long
    int temperature = 27;
    int length = sprintf(buffer,"T = %2d C",temperature); // print formatted data to buffer
    // it is important the format specifier ensures the length will fit in the buffer
    if (length <= 14)  // if string will fit on display
        lcd.printString(buffer,0,1);           // display on screen

    float pressure = 1012.3;  // same idea with floats
    length = sprintf(buffer,"P = %.2f mb",pressure);
    if (length <= 14)
        lcd.printString(buffer,0,2);

    // can also print individual characters at specified place
    lcd.printChar('X',5,3);

    // draw a line across the display at y = 40 pixels (origin top-left)
    for (int i = 0; i < WIDTH; i++) 
    {
        lcd.setPixel(i,40);
    }
    // need to refresh display after setting pixels
    lcd.refresh();

    // can also check status of pixels using getPixel(x,y)

    wait(5.0);
    lcd.clear();            // clear display
    lcd.inverseMode();      // invert colours
    lcd.setBrightness(1.0); // put LED backlight on full

    float array[84];

    for (int i = 0; i < 84; i++) 
    {
        array[i] = 0.5 + 0.5*sin(i*2*3.14/84);
    }

    // can also plot graphs - 84 elements only
    // values must be in range 0.0 - 1.0
    lcd.plotArray(array);
    wait(5.0);
    lcd.clear();
    lcd.normalMode();      // normal colour mode back
    lcd.setBrightness(0.5); // put LED backlight on 50%

    // example of drawing lines
    for (int x = 0; x < WIDTH ; x+=10) 
    {
        // x0,y0,x1,y1,type 0-white,1-black,2-dotted
        lcd.drawLine(0,0,x,HEIGHT,2);
    }

    wait(5.0);
    lcd.clear();

    // example of how to draw circles
    lcd.drawCircle(WIDTH/2,HEIGHT/2,20,1);  // x,y,radius,black fill
    lcd.drawCircle(WIDTH/2,HEIGHT/2,10,2);  // x,y,radius,white fill
    lcd.drawCircle(WIDTH/2,HEIGHT/2,30,0);  // x,y,radius,transparent with outline

    wait(5.0);
    lcd.clear();

    // example of how to draw rectangles
    //          origin x,y,width,height,type
    lcd.drawRect(10,10,50,30,1);  // filled black rectangle
    lcd.drawRect(15,15,20,10,2);  // filled white rectange (no outline)
    lcd.drawRect(2,2,70,40,0);    // transparent, just outline

    wait(5.0);
    lcd.clear();
}

//Interrupt service routines
//===========================
void button1Pressed()
{
    button1Flag = 1;
}
void button2Pressed()
{
    button2Flag = 1;
}
void button3Pressed()
{
    button3Flag = 1;
}

//beep sound based on beeper frequency and beeper time
//entered respectively
void beeper(float beeperFreq, float beeperTime)
{
    beep1.beep(beeperFreq,beeperTime);
}

void menuLevel(float lvl)
{
    if ((lvl >= 0) && (lvl < 0.25)) 
    {
        cursorSelect(1, 6, 9, 14);
        if (button2) 
        {
            distFlag = 1;
            brightFlag = 0;
            clockFlag = 0;
        }

    }
    if ((lvl >= 0.25) && (lvl < 0.5))
    {
        cursorSelect(1, 6, 17, 22);
    }
    
    if ((lvl >= 0.5) && (lvl < 0.75)) 
    {
        cursorSelect(1, 6, 25, 30);
        if (button2) 
        {
            brightFlag = 1;
            distFlag =0;
            clockFlag = 0;
        }

    }
    if ((lvl >= 0.75) && (lvl <= 1)) 
    {
        cursorSelect(1, 6, 33, 38);
        if (button2) 
        {
            clockFlag = 1;
            distFlag = 0;
            brightFlag = 0;
        }
    }


}

void distMeasure()
{
    lcd.clear();
    lcd.printString("Measure",15,0);


    // read sensor distance in cm and print over serial port
    char buffer[14];  // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
    // so can display a string of a maximum 14 characters in length
    // or create formatted strings - ensure they aren't more than 14 characters long
    

    distance = sensor.getDistanceCm();
    soundDist = distance * 2;

    soundSpeed = 34029;
    speedTime = soundDist/soundSpeed;
    Mspeed = distance/speedTime;

    //====================================================================================
    /*
      float Avg;
      float k;
      float array[10];
      for (int a = 0;a<10;a++)
      {
          array[a] = ;
          k = k + array[a];
      }
      Avg = k/10;

       */
    //====================================================================================

    int length = sprintf(buffer,"Dist = %2d cm",distance); // print formatted data to buffer
    // it is important the format specifier ensures the length will fit in the buffer

    

    if (length <= 14) { // if string will fit on display
        lcd.printString(buffer,0,1);           // display on screen
    }

    

    serial.printf("Distance = %d cm\n",distance);
    serial.printf("\n\n\r %s, %0.2f \n",buffer, length);

   

}

void saveData()
{
    lcd.printString("Save data",36,0);
}
void sysClock()
{
    lcd.printString("System test",30,0);
}
void startMessage()
{
    lcd.printString("Press",25,2);
    lcd.printString("Start Button",8,3);
    //displayClock();

}
void displayClock()
{
    //timer2.attach(&timer2Expired,1.0);
    //serial.attach(&serialISR); // attach serial ISR
    lcd.clear();

    lcd.printString("-SYS CLOCK-",9,0);

    if (timer2Flag) {
        getCurrentTime();
    }

    if (setTimeFlag) {
        chkUpdateTime();
    }

    lcd.printString(buffer2,4,2);           // display on screen
}

void buzzerRange()
{

    {
        beeper(400,distance);
    }
}


void startClockMsg()
{
    if(time(NULL)) {
        displayClock();
        lcd.printString("Set Clock",15,0);
        wait(0.1);
        clearRow();
        wait(0.1);
        lcd.printString("Set Clock",15,0);
        wait(0.1);
        clearRow();
        wait(0.1);
        lcd.printString("Set Clock",15,0);
        wait(0.1);
        clearRow();
        wait(0.3);
        lcd.printString("Set Clock",15,0);
        wait(0.1);
        clearRow();
        wait(0.1);
        lcd.printString("Set Clock",15,0);
        wait(1);
        lcd.clear();
    } else {
        displayClock();
        lcd.printString("Clock Set",15,0);
        wait(1.3);
    }
}

void clearRow()
{
    int i,j;
    //clear selecton column
    for(j = 0; j < 7; j++)

    {

        for (i = 0; i < 83; i++) 
        {
            lcd.clearPixel(i,j);
        }
    }
    lcd.refresh();
    wait(0.2);
}

void snapShot()
{
    Timer A;
    A.start();
    if (A.read_ms()==3000) 
    {
        beeper(1000, 0.1);
        beeper(1000, 0.1);
        beeper(1000, 0.1);
        beeper(1000, 0.5);

        if (button3) 
        {
            beeper(1000,0.5);

        }
    }

}