Reverse Parking Sensor

Dependencies:   N5110 PowerControl SRF02 beep mbed

main.cpp

Committer:
200809780
Date:
2015-05-11
Revision:
1:473744047b0f
Parent:
0:f1120add03a8

File content as of revision 1:473744047b0f:

/**
@file main.cpp
@brief Reverse Parking Sensor Project
*/

#include "main.h"

void Get_Average() 
{  
  distance =0;//set the distance to 0
  int counter =0; //set the counter to 0 
  
  //for loop to store 5 sensor's values
   for ( counter =0; counter<5; counter++) {
            
             Distance_Array [counter] =srf02.getDistanceCm(); //store the value of the sensor in the array 
     } 
    
    distance= (Distance_Array[0] + Distance_Array[1]+Distance_Array[2] + Distance_Array[3]+Distance_Array[4])/5; // get the average of the five values of the sensor  
}
    
//set power down the USB interface
int semihost_powerdown()
{
    uint32_t arg;
    return __semihost(USR_POWERDOWN, &arg);
    
    }
    
//Interrupt Service Routine
void button1_Pressed()
{
    button1_flag = !button1_flag; //set flag
}
void button2_Pressed()
{
    button2_flag = !button2_flag; //set flag
}
void button3_Pressed()
{
    button3_flag = !button3_flag; //set flag
}
void button4_Pressed()
{
    button4_flag = !button4_flag; //set flag
}

void Print_Time_Date()
{
    char buffer_time_lcd[14];// buffer to store the time into the 14 characters each char has 6 pixels,so 84/6 = 14
    char buffer_date_lcd[14];
    time_t seconds = time(NULL); // get current time

    // format time and date into 2 strings (time and date)
    strftime(buffer_time_lcd, 14 , "%r",localtime(&seconds));
    strftime(buffer_date_lcd, 14 , "%d %b %G ",localtime(&seconds));

    // print current date and time value on the LCD
    lcd.printString(buffer_time_lcd,0,4);
    lcd.printString(buffer_date_lcd,0,5);
}

// Interrupt Service Routine
void timerExpired_red()
{
    timerflag_red = 1; // set flag
}

void timerExpired_yellow()
{
    timerflag_yellow= 1; // set flag
}

void timerExpired_green()
{
    timerflag_green = 1; // set flag
}

void buttonOperation_1()
{
    // if button1 is pressed
    if (button1_flag) {
        a2=ain2.read(); // read value of potentiometer
        if (distance <= 16) {
            //set the values of leds
            led_yellow =0;
            led_green =0;
            led_red =  1;
            buzzer.beep(500+a2*1000,2.0);// buzzer makes sound with a delay of 2 seconds
        }
        if (distance > 16 && distance < 100) {
            if (timerflag_red) { // if flag is set
                timerflag_red = 0; // reset flag
                led_yellow =0;
                led_green =0;
                led_red = ! led_red;
                buzzer.beep(500+a2*1000,0.2);// buzzer makes sound with a delay of 2 seconds
            }
        }
        if(distance >= 100 && distance < 300) {
            if (timerflag_yellow) { // if flag is set
                timerflag_yellow = 0; // reset flag
                led_red =0;
                led_green =0;
                led_yellow = ! led_yellow;
                buzzer.beep(500+a2*1000,0.5); // buzzer makes sound with a delay of 0.5 seconds
            }
        }

        if (distance >= 300 && distance <=600 ) {
            if (timerflag_green) { // if flag is set
                timerflag_green = 0; // reset flag
                led_red =0;
                led_yellow =0;
                led_green = ! led_green;
                buzzer.beep(500+a2*1000,0.8); // buzzer makes sound with a delay of 0.5 seconds
            }
        }

        if (distance >600 ) {
            led_red =0;
            led_yellow =0;
            led_green =0;
        }
    }

    else  {
        if (distance < 100) {
            led_yellow =0;
            led_green =0;
            led_red = 1;
        } else
            led_red =0;


        if (distance >= 100 && distance < 300) {
            led_red =0;
            led_green =0;
            led_yellow = 1;
        } else
            led_yellow =0;

        if (distance >= 300 && distance <=600 ) {
            led_red =0;
            led_yellow =0;
            led_green = 1;
        } else
            led_green =0;

        if (distance >600 ) {
            led_red =0;
            led_yellow =0;
            led_green =0;
        }
    }
}

void buttonOperation_2()
{
    
    if (button2_flag==0 && button3_flag==0 && button4_flag==0) {

        int length = sprintf(buffer,"%.fcm",distance); // print formatted data to buffer
        // it is important the format specifier ensures the length will fit in the buffer
        if (length == 5 ) { // if string will fit on display

            lcd.clear(); // clear LCD
            lcd.refresh(); // refresh LCD
            lcd.printString(buffer,25,2);// display on screen
        }

        if (length < 5 ) { // if string will fit on display
            lcd.clear();
            lcd.refresh();
            lcd.printString(buffer,29,2);// display on screen
        }
    }

    if (button2_flag==1 && button3_flag==0 && button4_flag==0) {

        int length = sprintf(buffer,"%.2fm",distance/100);
        if (length <= 5) { // if string will fit on display
            lcd.clear();
            lcd.refresh();
            lcd.printString(buffer,26,2);// display on screen
        }

    }

    if (distance < 16) {
        lcd.clear();
        lcd.refresh();
        lcd.printString("STOP",28,2);
        lcd.printString("YOU WILL CRASH",0,0);

    }

    if (distance < 100 && distance >=16) {

        lcd.printString("***DANGER***",5,0);//display on the N5110 LCD
    }

    else if (distance >=  100 && distance <300) {

        lcd.printString("Be Careful",12,0);

    } else if (distance >=  300 && distance <=600) {

        lcd.printString("***Move***",11,0);
    }

    else if (distance >  600) {

        lcd.clear();
        lcd.refresh();
        lcd.printString("*Out of range*",0,0);
        lcd.printString("MOVE",28,2);
    }

    //draw rectacular and lines on the screen
    lcd.drawRect(20,10,40,18,0);
    lcd.drawRect(21,11,38,16,0);
    lcd.drawRect(22,12,36,14,0);
    lcd.drawLine(0,19,20,19,1);
    lcd.drawLine(60,19,83,19,1);
    //call the function
    Print_Time_Date();

}
void buttonOperation_3()
{

    int length = sprintf(buffer,"%.2fm",distance/100); // print formatted data to buffer
    // it is important the format specifier ensures the length will fit in the buffer
    if (length <= 5 && distance>=16 && distance<=600) { // if string will fit on display
        lcd.printString(buffer,28,3);
    }

    int counter_Y = 40;//initial variable for the y-axes of the screen
    int counter_X_L = 0; // initial variable for the x-axes on the left side of the screen
    int counter_X_R = 83;// initial variable for the x-axes on the right side of the screen

    if (distance < 16) {
        lcd.printString("STOP",30,3);
        lcd.printString("YOU WILL CRASH",0,0);

        while (counter_Y>=15) {
            // for loop to set the pixels
            for (int i = counter_Y; i<41; i++) {
                lcd.setPixel(counter_X_L,i);
                lcd.setPixel(counter_X_R,i);
            }
            counter_Y = counter_Y -1;
            counter_X_L = counter_X_L +1;
            counter_X_R = counter_X_R -1;
        }
    }

    if (distance >= 16 && distance <= 40) {
        lcd.printString("***DANGER***",5,0);//display on the N5110 LCD

        while (counter_Y>=17) {

            for (int i = counter_Y; i<41; i++) {
                lcd.setPixel(counter_X_L,i);
                lcd.setPixel(counter_X_R,i);
            }

            counter_Y = counter_Y -1;
            counter_X_L = counter_X_L +1;
            counter_X_R = counter_X_R -1;
        }
    }
    if (distance > 40 && distance <= 100) {
        lcd.printString("***DANGER***",5,0);

        while (counter_Y>=19) {

            for (int i = counter_Y; i<41; i++) {
                lcd.setPixel(counter_X_L,i);
                lcd.setPixel(counter_X_R,i);
            }

            counter_Y = counter_Y -1;
            counter_X_L = counter_X_L +1;
            counter_X_R = counter_X_R -1;
        }
    }
    if (distance > 100 && distance<=150) {
        lcd.printString("Be Careful",12,0);

        while (counter_Y>=21) {

            for (int i = counter_Y; i<41; i++) {
                lcd.setPixel(counter_X_L,i);
                lcd.setPixel(counter_X_R,i);
            }

            counter_Y = counter_Y -1;
            counter_X_L = counter_X_L +1;
            counter_X_R = counter_X_R -1;
        }
    }

    if (distance > 150 && distance<=200) {
        lcd.printString("Be Careful",12,0);

        while (counter_Y>=23) {

            for (int i = counter_Y; i<41; i++) {
                lcd.setPixel(counter_X_L,i);
                lcd.setPixel(counter_X_R,i);
            }

            counter_Y = counter_Y -1;
            counter_X_L = counter_X_L +1;
            counter_X_R = counter_X_R -1;
        }
    }
    if (distance > 200 && distance<=250) {
        lcd.printString("***Move***",11,0);

        while (counter_Y>=25) {

            for (int i = counter_Y; i<41; i++) {
                lcd.setPixel(counter_X_L,i);
                lcd.setPixel(counter_X_R,i);
            }

            counter_Y = counter_Y -1;
            counter_X_L = counter_X_L +1;
            counter_X_R = counter_X_R -1;
        }
    }
    if (distance > 250 && distance<=300) {
        lcd.printString("***Move***",11,0);

        while (counter_Y>=27) {

            for (int i = counter_Y; i<41; i++) {
                lcd.setPixel(counter_X_L,i);
                lcd.setPixel(counter_X_R,i);
            }

            counter_Y = counter_Y -1;
            counter_X_L = counter_X_L +1;
            counter_X_R = counter_X_R -1;
        }
    }
    if (distance > 300 && distance<=350) {
        lcd.printString("***Move***",11,0);

        while (counter_Y>=29) {

            for (int i = counter_Y; i<41; i++) {
                lcd.setPixel(counter_X_L,i);
                lcd.setPixel(counter_X_R,i);
            }

            counter_Y = counter_Y -1;
            counter_X_L = counter_X_L +1;
            counter_X_R = counter_X_R -1;
        }
    }
    if (distance > 350 && distance<=400) {
        lcd.printString("***Move***",11,0);

        while (counter_Y>=31) {

            for (int i = counter_Y; i<41; i++) {
                lcd.setPixel(counter_X_L,i);
                lcd.setPixel(counter_X_R,i);
            }

            counter_Y = counter_Y -1;
            counter_X_L = counter_X_L +1;
            counter_X_R = counter_X_R -1;
        }

    }
    if (distance > 400 && distance<=450) {
        lcd.printString("***Move***",11,0);

        while (counter_Y>=33) {

            for (int i = counter_Y; i<41; i++) {
                lcd.setPixel(counter_X_L,i);
                lcd.setPixel(counter_X_R,i);
            }

            counter_Y = counter_Y -1;
            counter_X_L = counter_X_L +1;
            counter_X_R = counter_X_R -1;
        }
    }
    if (distance > 450 && distance<=500) {
        lcd.printString("***Move***",11,0);

        while (counter_Y>=35) {

            for (int i = counter_Y; i<41; i++) {
                lcd.setPixel(counter_X_L,i);
                lcd.setPixel(counter_X_R,i);
            }

            counter_Y = counter_Y -1;
            counter_X_L = counter_X_L +1;
            counter_X_R = counter_X_R -1;
        }
    }
    if (distance > 500 && distance<=550) {
        lcd.printString("***Move***",11,0);

        while (counter_Y>=37) {

            for (int i = counter_Y; i<41; i++) {
                lcd.setPixel(counter_X_L,i);
                lcd.setPixel(counter_X_R,i);
            }

            counter_Y = counter_Y -1;
            counter_X_L = counter_X_L +1;
            counter_X_R = counter_X_R -1;
        }
    }
    if (distance > 550 && distance<=600) {
        lcd.printString("***Move***",11,0);
        lcd.setPixel(0,40);
        lcd.setPixel(1,40);
        lcd.setPixel(1,39);
        lcd.setPixel(83,40);
        lcd.setPixel(82,40);
        lcd.setPixel(82,39);
    }
    if (distance>600) {
        lcd.printString("*Out of range*",0,0);
        lcd.printString("Move",30,3);
    }
}
void buttonOperation_4()
{
    //draw circles, lines and rectacular for the car on the NOKIA 5110 display
    lcd.drawCircle(15,37,7,1);
    lcd.drawLine(16,23,6,33,1);
    lcd.drawLine(0,35,35,35,1);
    lcd.drawLine(15,12,35,21,1);
    lcd.drawLine(35,34,35,21,1);
    lcd.drawLine(0,12,15,12,1);
    lcd.drawRect(3,16,11,6,0);
    lcd.drawLine(18,16,29,22,1);
    lcd.drawLine(18,15,18,22,1);
    lcd.drawLine(18,22,28,22,1);
    lcd.drawLine(16,14,16,23,1);
    lcd.drawLine(1,14,16,14,1);
    lcd.drawLine(1,14,1,33,1);
    lcd.drawLine(1,33,6,33,1);
    lcd.drawLine(1,23,16,23,1);
    lcd.drawCircle(40,33,2,1);
    lcd.drawRect(62,8,14,38,1);

  
    int length = sprintf(buffer,"%.2fm",distance/100);
    if (length <= 5 && distance>= 16 && distance<= 600)  // if string and distance>=16 and distance<=600 will fit on display
        lcd.printString(buffer,25,1);// display on screen

    if (distance< 16 ) {
        lcd.printString("Stop",30,1);// display on screen
        lcd.printString("YOU WILL CRASH",0,0);// display on screen
        lcd.drawLine(45,32,45,34,1);
        lcd.drawLine(48,30,48,36,1);
        lcd.drawLine(51,28,51,38,1);
        lcd.drawLine(54,26,54,40,1);
        lcd.drawLine(57,24,57,42,1);
        lcd.drawLine(60,22,60,44,1);
    }

    if (distance>=16 && distance < 30) {
        lcd.printString("Stop",30,0);// display on screen
        //draw lines on the screen
        lcd.drawLine(45,32,45,34,1);
        lcd.drawLine(48,30,48,36,1);
        lcd.drawLine(51,28,51,38,1);
        lcd.drawLine(54,26,54,40,1);
        lcd.drawLine(57,24,57,42,1);
        lcd.drawLine(60,22,60,44,1);
    }
    if (distance >= 30 && distance < 100) {
        lcd.printString("***DANGER***",5,0);//display on the N5110 LCD
        lcd.drawLine(45,32,45,34,1);
        lcd.drawLine(48,30,48,36,1);
        lcd.drawLine(51,28,51,38,1);
        lcd.drawLine(54,26,54,40,1);
        lcd.drawLine(57,24,57,42,1);
    }
    if (distance >= 100 && distance <200 ) {
        lcd.printString("Be Careful",12,0);
        lcd.drawLine(45,32,45,34,1);
        lcd.drawLine(48,30,48,36,1);
        lcd.drawLine(51,28,51,38,1);
        lcd.drawLine(54,26,54,40,1);
    }
    if (distance >= 200 && distance <300 ) {
        lcd.printString("***Move***",11,0);
        lcd.drawLine(45,32,45,34,1);
        lcd.drawLine(48,30,48,36,1);
        lcd.drawLine(51,28,51,38,1);
    }
    if (distance >= 300 && distance <400 ) {
        lcd.printString("***Move***",11,0);
        lcd.drawLine(45,32,45,34,1);
        lcd.drawLine(48,30,48,36,1);
    }
    if (distance >= 400 && distance <=600 ) {
        lcd.printString("***Move***",11,0);
        lcd.drawLine(45,32,45,34,1);
    }
    if (distance > 600) {
        lcd.printString("*Out of range*",0,0);
    }
}

void ButtonsOperation()
{
    if (button3_flag == 0 && button4_flag==0)  { // check the status of the button 3 and 4

        buttonOperation_2(); // call function
    }

    if (button3_flag == 1 && button4_flag==0)  { // check the status of the button 3 and 4

        lcd.clear();//clear display
        lcd.refresh();//refresh display
        buttonOperation_3(); // call function
        button_4.rise(NULL); // button_4 becomes disable
        button_2.rise(NULL); // button_2 becomes disable
    }

    else
        button_4.rise(&button4_Pressed); // event generated on rising edge
    button_2.rise(&button2_Pressed); // event generated on rising edge
    lcd.refresh();

    if
    (button4_flag == 1  && button3_flag==0 ) {

        lcd.clear();
        lcd.refresh();
        buttonOperation_4();
        button_3.rise(NULL); // button_3 becomes disable
        button_2.rise(NULL); // button_2 becomes disable


    } else
        button_3.rise(&button3_Pressed); // event generated on rising edge
    button_2.rise(&button2_Pressed); // event generated on rising edge
    lcd.refresh();

}

int main()
{
    lcd.init();//initialise display
    //set intial values of the leds
    led_red = 0;
    led_yellow=0;
    led_green=0;
    
    int result = semihost_powerdown();// power down the USB interface

    timer_red.attach(&timerExpired_red, 0.2); // call ISR every 0.2 seconds
    timer_yellow.attach(&timerExpired_yellow, 0.5); // call ISR every 0.5 seconds
    timer_green.attach(&timerExpired_green, 0.8); // call ISR every 0.8 seconds

    button_1.rise(&button1_Pressed); // event generated on rising edge
    button_2.rise(&button2_Pressed); // event generated on rising edge
    button_3.rise(&button3_Pressed); // event generated on rising edge
    button_4.rise(&button4_Pressed); // event generated on rising edge

    //set_time(1431299403); // initialise time to current time

    //print welcome messages
    lcd.printString("Parking_Sensor",0,0);//display on the N5110 LCD
    lcd.printString("By",35,2);//display on the N5110 LCD
    lcd.printString("Andreas",20,3);//display on the N5110 LCD
    lcd.printString("Konstantinou",5,4);//display on the N5110 LCD

    // draw lines and circles for the car on the right side of the display
    lcd.drawLine(83,20,83,14,1);
    lcd.drawLine(63,20,83,20,1);
    lcd.drawLine(63,20,63,14,1);
    lcd.drawLine(63,14,67,14,1);
    lcd.drawLine(67,14,73,10,1);
    lcd.drawLine(73,10,79,10,1);
    lcd.drawLine(79,10,83,14,1);
    lcd.drawCircle(67,20,2,1);
    lcd.drawCircle(79,20,2,1);
    // draw lines and circles for the car on the left side of the display
    lcd.drawLine(20,20,20,14,1);
    lcd.drawLine(0,20,20,20,1);
    lcd.drawLine(0,20,0,14,1);
    lcd.drawLine(0,14,4,14,1);
    lcd.drawLine(4,14,10,10,1);
    lcd.drawLine(10,10,16,10,1);
    lcd.drawLine(16,10,20,14,1);
    lcd.drawCircle(4,20,2,1);
    lcd.drawCircle(16,20,2,1);

    //draw lines for the road
    lcd.drawLine(0,41,83,41,1);
    lcd.drawLine(0,44,83,44,2);
    lcd.drawLine(0,47,83,47,1);

    wait(2.5);// 2.5 seconds delay
    lcd.clear();//clear the screen
    lcd.refresh();//refresh the display

    for (int j= 0; j>-83; j--) {
        lcd.printString("*University*",5,0);//display on the N5110 LCD
        lcd.printString("**Of Leeds**",5,1);//display on the N5110 LCD
        //draw lines for the road on the screen
        lcd.drawLine(0,30,83,30,1);
        lcd.drawLine(0,32,83,32,2);
        lcd.drawLine(0,35,83,35,1);

        // draw lines and circles for the cars on the display
        lcd.drawLine(83+j,30,83+j,24,1);
        lcd.drawLine(63+j,30,83+j,30,1);
        lcd.drawLine(63+j,30,63+j,24,1);
        lcd.drawLine(63+j,24,67+j,24,1);
        lcd.drawLine(67+j,24,73+j,20,1);
        lcd.drawLine(73+j,20,79+j,20,1);
        lcd.drawLine(79+j,20,83+j,24,1);
        lcd.drawCircle(67+j,30,2,1);
        lcd.drawCircle(79+j,30,2,1);

        lcd.drawLine(53+j,30,53+j,24,1);
        lcd.drawLine(33+j,30,53+j,30,1);
        lcd.drawLine(33+j,30,33+j,24,1);
        lcd.drawLine(33+j,24,37+j,24,1);
        lcd.drawLine(37+j,24,43+j,20,1);
        lcd.drawLine(43+j,20,49+j,20,1);
        lcd.drawLine(49+j,20,53+j,24,1);
        lcd.drawCircle(37+j,30,2,1);
        lcd.drawCircle(49+j,30,2,1);

        wait(0.10);//small delay
        lcd.clear();
        lcd.refresh();
    }

    while(1) {// infinite loop
       
       
        a1=ain1.read(); // read the value of potentiometer
        lcd.setBrightness(a1);// function to change LED backlight brightness using the potentiometer
        
        //call the functions
        Get_Average(); 
        ButtonsOperation();
        buttonOperation_1();

        Sleep();
    }
}