![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Parking sensor project ELEC2645
Dependencies: N5110 SRF02 TMP102 mbed
main.cpp@0:7f408d2bc038, 2016-05-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |