Car safety monitoring system, monitoring distance, light and temperature.
Dependencies: Speaker mbed mbed-rtos 4DGL-uLCD-SE hcsr04
main.cpp@15:d39446966d94, 2020-12-20 (annotated)
- Committer:
- tadhgjones
- Date:
- Sun Dec 20 20:20:26 2020 +0000
- Revision:
- 15:d39446966d94
- Parent:
- 14:0bbfa2c1de62
Final revision of EE3023 Design Project
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tadhgjones | 8:f3ab61374cd0 | 1 | #include "mbed.h" |
tadhgjones | 8:f3ab61374cd0 | 2 | #include "hcsr04.h" |
fiachra | 12:730a95b81992 | 3 | #include "Speaker.h" |
fiachra | 10:f29ed3675509 | 4 | #include "uLCD_4DGL.h" |
tadhgjones | 15:d39446966d94 | 5 | |
tadhgjones | 15:d39446966d94 | 6 | //Temperature Inputs |
fiachra | 13:a3cdbad9daf4 | 7 | AnalogIn ain(p15); |
fiachra | 13:a3cdbad9daf4 | 8 | AnalogIn ain2(p16); |
tadhgjones | 15:d39446966d94 | 9 | |
tadhgjones | 15:d39446966d94 | 10 | //Distance Inputs |
fiachra | 10:f29ed3675509 | 11 | HCSR04 distSens(p25,p6); |
fiachra | 13:a3cdbad9daf4 | 12 | Speaker mySpeaker(p18); |
tadhgjones | 15:d39446966d94 | 13 | |
tadhgjones | 15:d39446966d94 | 14 | //Initialisation of LCD and Serial Monitor |
tadhgjones | 8:f3ab61374cd0 | 15 | Serial pc(USBTX, USBRX); |
fiachra | 10:f29ed3675509 | 16 | uLCD_4DGL uLCD(p9,p10,p11); |
tadhgjones | 15:d39446966d94 | 17 | |
tadhgjones | 15:d39446966d94 | 18 | //Autolights Inputs |
fiachra | 14:0bbfa2c1de62 | 19 | AnalogIn photodiode(p20); |
fiachra | 14:0bbfa2c1de62 | 20 | PwmOut myled(p21); |
tadhgjones | 15:d39446966d94 | 21 | |
tadhgjones | 15:d39446966d94 | 22 | //Distance |
tadhgjones | 8:f3ab61374cd0 | 23 | unsigned int dist; |
fiachra | 9:d1b00a2a8e25 | 24 | float averageDistance(); |
fiachra | 9:d1b00a2a8e25 | 25 | void beeping(); |
fiachra | 14:0bbfa2c1de62 | 26 | float i; |
fiachra | 14:0bbfa2c1de62 | 27 | float x = 0; |
tadhgjones | 15:d39446966d94 | 28 | |
tadhgjones | 15:d39446966d94 | 29 | //Temperature |
fiachra | 13:a3cdbad9daf4 | 30 | void Temperature(); |
fiachra | 13:a3cdbad9daf4 | 31 | void TempConstraints(); |
fiachra | 13:a3cdbad9daf4 | 32 | float getTemp(); |
fiachra | 13:a3cdbad9daf4 | 33 | float avgTemp(); |
fiachra | 13:a3cdbad9daf4 | 34 | float getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 35 | float avgTemp2(); |
fiachra | 13:a3cdbad9daf4 | 36 | float voltage_in; |
fiachra | 13:a3cdbad9daf4 | 37 | float degrees_c; |
fiachra | 13:a3cdbad9daf4 | 38 | float avgT; |
fiachra | 13:a3cdbad9daf4 | 39 | float Temp; |
fiachra | 13:a3cdbad9daf4 | 40 | float a; |
fiachra | 13:a3cdbad9daf4 | 41 | float b; |
tadhgjones | 15:d39446966d94 | 42 | |
tadhgjones | 15:d39446966d94 | 43 | //Autolights |
fiachra | 14:0bbfa2c1de62 | 44 | void LED(); |
tadhgjones | 15:d39446966d94 | 45 | |
tadhgjones | 8:f3ab61374cd0 | 46 | int main() |
tadhgjones | 8:f3ab61374cd0 | 47 | { |
tadhgjones | 15:d39446966d94 | 48 | //distance |
fiachra | 12:730a95b81992 | 49 | uLCD.text_width(1); |
fiachra | 12:730a95b81992 | 50 | uLCD.text_height(1); |
fiachra | 12:730a95b81992 | 51 | uLCD.locate(10, 12); |
fiachra | 12:730a95b81992 | 52 | uLCD.color(BLUE); |
fiachra | 11:68194bd43e0b | 53 | uLCD.printf(" Reverse Sensor"); |
fiachra | 10:f29ed3675509 | 54 | uLCD.rectangle(65, 117, 126, 127, 0x0000FF); |
fiachra | 13:a3cdbad9daf4 | 55 | |
tadhgjones | 8:f3ab61374cd0 | 56 | while(1) { |
fiachra | 13:a3cdbad9daf4 | 57 | i++; |
fiachra | 13:a3cdbad9daf4 | 58 | //distance |
fiachra | 10:f29ed3675509 | 59 | distSens.start(); |
fiachra | 9:d1b00a2a8e25 | 60 | averageDistance(); |
fiachra | 9:d1b00a2a8e25 | 61 | beeping(); |
fiachra | 11:68194bd43e0b | 62 | uLCD.filled_rectangle(66, 118, 125, 127, 0x000000); |
fiachra | 11:68194bd43e0b | 63 | pc.printf("cm:%d\n",dist ); |
fiachra | 12:730a95b81992 | 64 | uLCD.locate(10, 15); |
fiachra | 12:730a95b81992 | 65 | uLCD.color(WHITE); |
fiachra | 10:f29ed3675509 | 66 | uLCD.printf("cm:%1d\n",dist ); |
fiachra | 14:0bbfa2c1de62 | 67 | //temperature |
fiachra | 14:0bbfa2c1de62 | 68 | Temperature(); |
fiachra | 14:0bbfa2c1de62 | 69 | //autolights |
fiachra | 14:0bbfa2c1de62 | 70 | LED(); |
fiachra | 9:d1b00a2a8e25 | 71 | } |
fiachra | 9:d1b00a2a8e25 | 72 | } |
tadhgjones | 15:d39446966d94 | 73 | //measure average distance from sensor |
fiachra | 12:730a95b81992 | 74 | float averageDistance() |
fiachra | 9:d1b00a2a8e25 | 75 | { |
fiachra | 10:f29ed3675509 | 76 | int a = distSens.get_dist_cm(); |
fiachra | 10:f29ed3675509 | 77 | int b = distSens.get_dist_cm(); |
fiachra | 10:f29ed3675509 | 78 | int c = distSens.get_dist_cm(); |
fiachra | 10:f29ed3675509 | 79 | int d = distSens.get_dist_cm(); |
fiachra | 10:f29ed3675509 | 80 | int e = distSens.get_dist_cm(); |
fiachra | 10:f29ed3675509 | 81 | int f = distSens.get_dist_cm(); |
fiachra | 10:f29ed3675509 | 82 | int g = distSens.get_dist_cm(); |
fiachra | 10:f29ed3675509 | 83 | int h = distSens.get_dist_cm(); |
fiachra | 10:f29ed3675509 | 84 | int i = distSens.get_dist_cm(); |
fiachra | 10:f29ed3675509 | 85 | int j = distSens.get_dist_cm(); |
tadhgjones | 8:f3ab61374cd0 | 86 | |
fiachra | 9:d1b00a2a8e25 | 87 | dist = (a+b+c+d+e+f+g+h+i+j)/10; |
fiachra | 9:d1b00a2a8e25 | 88 | return dist; |
fiachra | 9:d1b00a2a8e25 | 89 | } |
tadhgjones | 15:d39446966d94 | 90 | //distance parameters and output |
fiachra | 9:d1b00a2a8e25 | 91 | void beeping() |
fiachra | 9:d1b00a2a8e25 | 92 | { |
fiachra | 9:d1b00a2a8e25 | 93 | int distance = averageDistance(); |
fiachra | 12:730a95b81992 | 94 | //sensor defaults to 2k+ when dist<~3cm |
fiachra | 14:0bbfa2c1de62 | 95 | if (distance > 2000) i=1.5; |
fiachra | 14:0bbfa2c1de62 | 96 | if (distance < 150) i=0.3; |
fiachra | 14:0bbfa2c1de62 | 97 | if (distance < 100) i=0.35; |
fiachra | 14:0bbfa2c1de62 | 98 | if (distance < 90) i=0.4; |
fiachra | 9:d1b00a2a8e25 | 99 | if (distance < 80) i=0.45; |
fiachra | 14:0bbfa2c1de62 | 100 | if (distance < 70) i=0.5; |
fiachra | 14:0bbfa2c1de62 | 101 | if (distance < 60) i=0.55; |
fiachra | 14:0bbfa2c1de62 | 102 | if (distance < 50) i=0.6; |
fiachra | 14:0bbfa2c1de62 | 103 | if (distance < 40) i=0.65; |
fiachra | 14:0bbfa2c1de62 | 104 | if (distance < 30) i=0.7; |
fiachra | 14:0bbfa2c1de62 | 105 | if (distance < 20) i=0.8; |
fiachra | 14:0bbfa2c1de62 | 106 | if (distance < 10) i=1; |
fiachra | 14:0bbfa2c1de62 | 107 | if (distance < 5) i=1.2; |
fiachra | 14:0bbfa2c1de62 | 108 | mySpeaker.PlayNote(700*i, 0.2, 2*i); |
fiachra | 13:a3cdbad9daf4 | 109 | } |
tadhgjones | 15:d39446966d94 | 110 | //measure and output temperature |
fiachra | 13:a3cdbad9daf4 | 111 | void Temperature(){ |
tadhgjones | 15:d39446966d94 | 112 | uLCD.locate(1,1); |
tadhgjones | 15:d39446966d94 | 113 | uLCD.printf("Temperature:\n\n"); |
fiachra | 13:a3cdbad9daf4 | 114 | a = avgTemp(); |
fiachra | 13:a3cdbad9daf4 | 115 | b = avgTemp2(); |
tadhgjones | 15:d39446966d94 | 116 | Temp = ((a + b)/2)-15; |
tadhgjones | 15:d39446966d94 | 117 | uLCD.text_width(2); |
tadhgjones | 15:d39446966d94 | 118 | uLCD.text_height(2); |
tadhgjones | 15:d39446966d94 | 119 | uLCD.printf("%3.1f\t", Temp); |
fiachra | 13:a3cdbad9daf4 | 120 | uLCD.text_width(1); |
fiachra | 13:a3cdbad9daf4 | 121 | uLCD.text_height(1); |
tadhgjones | 15:d39446966d94 | 122 | uLCD.printf("o"); |
tadhgjones | 15:d39446966d94 | 123 | uLCD.text_width(2); |
tadhgjones | 15:d39446966d94 | 124 | uLCD.text_height(2); |
tadhgjones | 15:d39446966d94 | 125 | uLCD.printf("C"); |
tadhgjones | 15:d39446966d94 | 126 | uLCD.text_width(1); |
tadhgjones | 15:d39446966d94 | 127 | uLCD.text_height(1); |
tadhgjones | 15:d39446966d94 | 128 | TempConstraints(); |
fiachra | 13:a3cdbad9daf4 | 129 | } |
tadhgjones | 15:d39446966d94 | 130 | //signal sensor fault or low temperature |
fiachra | 13:a3cdbad9daf4 | 131 | void TempConstraints() { |
fiachra | 13:a3cdbad9daf4 | 132 | if(degrees_c <= 4){ |
fiachra | 14:0bbfa2c1de62 | 133 | uLCD.text_width(1); |
fiachra | 14:0bbfa2c1de62 | 134 | uLCD.text_height(1); |
tadhgjones | 15:d39446966d94 | 135 | uLCD.locate(1,5); |
tadhgjones | 15:d39446966d94 | 136 | pc.printf("ICE WARNING"); |
fiachra | 13:a3cdbad9daf4 | 137 | } |
fiachra | 13:a3cdbad9daf4 | 138 | if(abs(a-b) > 4){ |
fiachra | 14:0bbfa2c1de62 | 139 | uLCD.text_width(1); |
fiachra | 14:0bbfa2c1de62 | 140 | uLCD.text_height(1); |
tadhgjones | 15:d39446966d94 | 141 | uLCD.locate(1,5); |
tadhgjones | 15:d39446966d94 | 142 | uLCD.printf("TEMPERATURE FAULT"); |
fiachra | 13:a3cdbad9daf4 | 143 | } |
fiachra | 13:a3cdbad9daf4 | 144 | } |
tadhgjones | 15:d39446966d94 | 145 | //convert sensor outut to temperature |
fiachra | 13:a3cdbad9daf4 | 146 | float getTemp(){ |
fiachra | 13:a3cdbad9daf4 | 147 | voltage_in = ain * 3.3; |
fiachra | 13:a3cdbad9daf4 | 148 | degrees_c = ((voltage_in - 0.5) * 100.0); |
fiachra | 13:a3cdbad9daf4 | 149 | return degrees_c; |
fiachra | 13:a3cdbad9daf4 | 150 | } |
fiachra | 13:a3cdbad9daf4 | 151 | float getTemp2(){ |
fiachra | 13:a3cdbad9daf4 | 152 | voltage_in = ain2 * 3.3; |
fiachra | 13:a3cdbad9daf4 | 153 | degrees_c = ((voltage_in - 0.5) * 100.0); |
fiachra | 13:a3cdbad9daf4 | 154 | return degrees_c; |
fiachra | 13:a3cdbad9daf4 | 155 | } |
tadhgjones | 15:d39446966d94 | 156 | //Thsi function obtaines the average voltage from the first sensor |
fiachra | 13:a3cdbad9daf4 | 157 | float avgTemp(){ |
fiachra | 13:a3cdbad9daf4 | 158 | float a = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 159 | float b = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 160 | float c = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 161 | float d = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 162 | float e = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 163 | float f = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 164 | float g = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 165 | float h = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 166 | float i = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 167 | float j = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 168 | float k = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 169 | float l = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 170 | float m = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 171 | float n = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 172 | float o = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 173 | float p = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 174 | float q = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 175 | float r = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 176 | float s = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 177 | float t = getTemp(); |
fiachra | 13:a3cdbad9daf4 | 178 | |
fiachra | 13:a3cdbad9daf4 | 179 | avgT = (a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t)/20; |
fiachra | 13:a3cdbad9daf4 | 180 | return avgT; |
fiachra | 13:a3cdbad9daf4 | 181 | } |
fiachra | 13:a3cdbad9daf4 | 182 | float avgTemp2(){ |
fiachra | 13:a3cdbad9daf4 | 183 | float a = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 184 | float b = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 185 | float c = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 186 | float d = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 187 | float e = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 188 | float f = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 189 | float g = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 190 | float h = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 191 | float i = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 192 | float j = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 193 | float k = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 194 | float l = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 195 | float m = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 196 | float n = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 197 | float o = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 198 | float p = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 199 | float q = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 200 | float r = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 201 | float s = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 202 | float t = getTemp2(); |
fiachra | 13:a3cdbad9daf4 | 203 | |
fiachra | 13:a3cdbad9daf4 | 204 | avgT = (a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t)/20; |
fiachra | 13:a3cdbad9daf4 | 205 | return avgT; |
fiachra | 14:0bbfa2c1de62 | 206 | } |
tadhgjones | 15:d39446966d94 | 207 | //check LED and turn on and off lights as required |
fiachra | 14:0bbfa2c1de62 | 208 | void LED(){ |
fiachra | 14:0bbfa2c1de62 | 209 | if (photodiode*100 <= 27){ |
fiachra | 14:0bbfa2c1de62 | 210 | myled = 1; |
tadhgjones | 15:d39446966d94 | 211 | uLCD.locate(1,7); |
tadhgjones | 15:d39446966d94 | 212 | uLCD.printf("Autolights:\n\n"); |
tadhgjones | 15:d39446966d94 | 213 | uLCD.text_width(2); |
tadhgjones | 15:d39446966d94 | 214 | uLCD.text_height(2); |
tadhgjones | 15:d39446966d94 | 215 | uLCD.printf("ON "); |
tadhgjones | 15:d39446966d94 | 216 | uLCD.text_width(1); |
tadhgjones | 15:d39446966d94 | 217 | uLCD.text_height(1); |
fiachra | 14:0bbfa2c1de62 | 218 | } else { |
fiachra | 14:0bbfa2c1de62 | 219 | myled = 0; |
tadhgjones | 15:d39446966d94 | 220 | uLCD.locate(1,7); |
tadhgjones | 15:d39446966d94 | 221 | uLCD.printf("Autolights:\n\n"); |
tadhgjones | 15:d39446966d94 | 222 | uLCD.text_width(2); |
tadhgjones | 15:d39446966d94 | 223 | uLCD.text_height(2); |
tadhgjones | 15:d39446966d94 | 224 | uLCD.printf("OFF"); |
tadhgjones | 15:d39446966d94 | 225 | uLCD.text_width(1); |
tadhgjones | 15:d39446966d94 | 226 | uLCD.text_height(1); |
tadhgjones | 15:d39446966d94 | 227 | } |
tadhgjones | 8:f3ab61374cd0 | 228 | } |