Parking sensor project ELEC2645

Dependencies:   N5110 SRF02 TMP102 mbed

Committer:
el14adr
Date:
Thu May 05 14:58:40 2016 +0000
Revision:
0:7f408d2bc038
Child:
1:e2ededd35c7b
Parking Sensor Project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el14adr 0:7f408d2bc038 1 /**
el14adr 0:7f408d2bc038 2 @file main.cpp
el14adr 0:7f408d2bc038 3 @brief Car parking sensor system which uses audio and visual alerts to assist the user
el14adr 0:7f408d2bc038 4 @author Antonia Della Rocco
el14adr 0:7f408d2bc038 5 */
el14adr 0:7f408d2bc038 6
el14adr 0:7f408d2bc038 7 // Allows access to all main.h information/data
el14adr 0:7f408d2bc038 8 #include "main.h"
el14adr 0:7f408d2bc038 9
el14adr 0:7f408d2bc038 10 /// Main function where sub functions are called
el14adr 0:7f408d2bc038 11 int main()
el14adr 0:7f408d2bc038 12 {
el14adr 0:7f408d2bc038 13
el14adr 0:7f408d2bc038 14 g_inches == 0; // Set initial button value to 0
el14adr 0:7f408d2bc038 15 button.mode(PullDown); // Set initial mode of button
el14adr 0:7f408d2bc038 16 button.fall(&buttonUnits); // Check falling edge
el14adr 0:7f408d2bc038 17
el14adr 0:7f408d2bc038 18 lcd.init(); // Initialise LCD screen
el14adr 0:7f408d2bc038 19 intro(); /// Call introduction function
el14adr 0:7f408d2bc038 20 wait (0.2);
el14adr 0:7f408d2bc038 21
el14adr 0:7f408d2bc038 22 while(1) {
el14adr 0:7f408d2bc038 23
el14adr 0:7f408d2bc038 24 getDistance(); /// Call distance function
el14adr 0:7f408d2bc038 25 wait (0.2);
el14adr 0:7f408d2bc038 26 indicatorLEDS(); /// Call LED function - realising I cannot set them flashing under different conditions as connected to same pin
el14adr 0:7f408d2bc038 27 wait (0.2);
el14adr 0:7f408d2bc038 28 buttonUnits(); /// Call button function
el14adr 0:7f408d2bc038 29 wait (0.2);
el14adr 0:7f408d2bc038 30 alertSound(); /// Call buzzer function
el14adr 0:7f408d2bc038 31 }
el14adr 0:7f408d2bc038 32 }
el14adr 0:7f408d2bc038 33
el14adr 0:7f408d2bc038 34 /// Define all functions
el14adr 0:7f408d2bc038 35 /// Introduction function
el14adr 0:7f408d2bc038 36 void intro()
el14adr 0:7f408d2bc038 37 {
el14adr 0:7f408d2bc038 38
el14adr 0:7f408d2bc038 39 lcd.printString("Antonia's",17,1);
el14adr 0:7f408d2bc038 40 lcd.printString("Car Parking",8,2);
el14adr 0:7f408d2bc038 41 lcd.printString("System",23,3);
el14adr 0:7f408d2bc038 42 wait (1.0); // delay 1s for intro to be observed
el14adr 0:7f408d2bc038 43 lcd.clear(); // clear lcd
el14adr 0:7f408d2bc038 44 }
el14adr 0:7f408d2bc038 45
el14adr 0:7f408d2bc038 46 /// Function - sensor measures distance, gets average, deducts error, saves to buffer, and prints to LCD screen, also records and displays temperature reading
el14adr 0:7f408d2bc038 47 void getDistance()
el14adr 0:7f408d2bc038 48 {
el14adr 0:7f408d2bc038 49
el14adr 0:7f408d2bc038 50 /// additional buffers to confirm each calculation is working correctly - commented out once confirmed
el14adr 0:7f408d2bc038 51 // char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
el14adr 0:7f408d2bc038 52 // char bufferAll[14]; // buffer for average confirmation
el14adr 0:7f408d2bc038 53 // char bufferInches[14]; // buffer for inches distance confirmation
el14adr 0:7f408d2bc038 54 char bufferTemp[14]; // buffer for temperature display
el14adr 0:7f408d2bc038 55
el14adr 0:7f408d2bc038 56 /// Create for loop to obtain average of 10 readings
el14adr 0:7f408d2bc038 57 int sumOfReadings = 0; /// Create variable for sum of readings
el14adr 0:7f408d2bc038 58 int n=0; // Iteration for n start at 0
el14adr 0:7f408d2bc038 59 for ( n=0 ; n<10 ; n++ ) { /// For loop start at 0, increase by 1 until 9 for 10 readings in total
el14adr 0:7f408d2bc038 60 int readings = srf02.getDistanceCm(); // Sensor measures distance
el14adr 0:7f408d2bc038 61 sumOfReadings += readings; // Add each measured distance to the next
el14adr 0:7f408d2bc038 62 wait(0.065); // Wait between readings
el14adr 0:7f408d2bc038 63 }
el14adr 0:7f408d2bc038 64
el14adr 0:7f408d2bc038 65 int averageDistance = (sumOfReadings / 10); /// Divide total distance by no of readings to get average
el14adr 0:7f408d2bc038 66 int error = 17; /// Set margin of error for sensor is 17cm
el14adr 0:7f408d2bc038 67
el14adr 0:7f408d2bc038 68 /// Stop calculated distance from going negative
el14adr 0:7f408d2bc038 69 if (averageDistance < error) {
el14adr 0:7f408d2bc038 70 g_calcDistance = averageDistance;
el14adr 0:7f408d2bc038 71 } else {
el14adr 0:7f408d2bc038 72 g_calcDistance = averageDistance - error; // Calculate distance by taking away error from average distance
el14adr 0:7f408d2bc038 73 }
el14adr 0:7f408d2bc038 74 /// Get temperature reading
el14adr 0:7f408d2bc038 75 float temp = tmp102.get_temperature();
el14adr 0:7f408d2bc038 76
el14adr 0:7f408d2bc038 77 /// Convert calcuated distance to inches
el14adr 0:7f408d2bc038 78 g_calcDistanceInches = g_calcDistance * 0.3937007874;
el14adr 0:7f408d2bc038 79
el14adr 0:7f408d2bc038 80 /// Read temperature, save to buffer and print to lcd
el14adr 0:7f408d2bc038 81 float tempMemory = sprintf(bufferTemp, "T = %.2f C",temp); // saves temperature to buffer
el14adr 0:7f408d2bc038 82 lcd.printString(bufferTemp,0,4); // displays temperature buffer on lcd
el14adr 0:7f408d2bc038 83
el14adr 0:7f408d2bc038 84 }
el14adr 0:7f408d2bc038 85
el14adr 0:7f408d2bc038 86 /// Set LEDS function to alert user visually if range is safe or dangerous
el14adr 0:7f408d2bc038 87 void indicatorLEDS()
el14adr 0:7f408d2bc038 88 {
el14adr 0:7f408d2bc038 89
el14adr 0:7f408d2bc038 90 // If distance is less than/equal to 30cm red LED is ON
el14adr 0:7f408d2bc038 91 if (g_calcDistance <= 30) {
el14adr 0:7f408d2bc038 92 rLED = 0;
el14adr 0:7f408d2bc038 93 }
el14adr 0:7f408d2bc038 94 // If distance is more than 30cm red LED is OFF therefore green LED is ON
el14adr 0:7f408d2bc038 95 else if (g_calcDistance > 30) {
el14adr 0:7f408d2bc038 96 rLED = 1;
el14adr 0:7f408d2bc038 97 }
el14adr 0:7f408d2bc038 98 }
el14adr 0:7f408d2bc038 99
el14adr 0:7f408d2bc038 100 /// Set buzzer function to alert user audibly if range is safe or dangerous
el14adr 0:7f408d2bc038 101 void soundAlert()
el14adr 0:7f408d2bc038 102 {
el14adr 0:7f408d2bc038 103
el14adr 0:7f408d2bc038 104 }
el14adr 0:7f408d2bc038 105
el14adr 0:7f408d2bc038 106 /// Set button function to aid user preference between metric/imperial distance when parking
el14adr 0:7f408d2bc038 107 void buttonUnits()
el14adr 0:7f408d2bc038 108 {
el14adr 0:7f408d2bc038 109 g_inches++; // Increment unit variable by 1
el14adr 0:7f408d2bc038 110 char buffer[14]; // Buffer for cm
el14adr 0:7f408d2bc038 111 char bufferInches[14]; // Buffer for inches distance confirmation
el14adr 0:7f408d2bc038 112
el14adr 0:7f408d2bc038 113 // Press button once adds one to display
el14adr 0:7f408d2bc038 114 if (g_inches == 1) {
el14adr 0:7f408d2bc038 115 lcd.refresh(); // Refresh lcd so it can update after button is pressed
el14adr 0:7f408d2bc038 116 float distanceInches = sprintf(bufferInches, "%.2f in",g_calcDistanceInches);
el14adr 0:7f408d2bc038 117 lcd.printString(bufferInches,0,1);
el14adr 0:7f408d2bc038 118 }
el14adr 0:7f408d2bc038 119 // Press button again adds one to display
el14adr 0:7f408d2bc038 120 else if (g_inches == 2) {
el14adr 0:7f408d2bc038 121 lcd.refresh();
el14adr 0:7f408d2bc038 122 int distance_memory = sprintf(buffer, "%d cm",g_calcDistance); // saves distance to buffer
el14adr 0:7f408d2bc038 123 lcd.printString(buffer,0,1);
el14adr 0:7f408d2bc038 124 g_inches = 0; // Resets unit display back to beginning
el14adr 0:7f408d2bc038 125 }
el14adr 0:7f408d2bc038 126 }
el14adr 0:7f408d2bc038 127
el14adr 0:7f408d2bc038 128 /// Set buzzer to alert user
el14adr 0:7f408d2bc038 129 void alertSound()
el14adr 0:7f408d2bc038 130 {
el14adr 0:7f408d2bc038 131 buzzer.period(0.004545452);
el14adr 0:7f408d2bc038 132
el14adr 0:7f408d2bc038 133 if (g_calcDistance <= 30) { /// Less than 30 cm high pitch
el14adr 0:7f408d2bc038 134 buzzer.write(0.8);
el14adr 0:7f408d2bc038 135 }
el14adr 0:7f408d2bc038 136 else if (g_calcDistance > 30 && g_calcDistance <= 70) { // in between pitch
el14adr 0:7f408d2bc038 137 buzzer.write(0.5);
el14adr 0:7f408d2bc038 138 }
el14adr 0:7f408d2bc038 139 else if (g_calcDistance > 70) // low pitch safer distance
el14adr 0:7f408d2bc038 140 buzzer.write(0.1);
el14adr 0:7f408d2bc038 141 }