Test

Dependencies:   SRF02 SRF05 mbed

Fork of Prosjekt_2 by HIOF Programmering

Committer:
leonardene
Date:
Mon Apr 11 16:16:16 2016 +0000
Revision:
13:a4d68367b352
Parent:
12:4cefe940afbc
Child:
14:215006ed25d8
Flyttet wait_ms (50). Den burde v?re i IF l?kka den er i n?, fordi det ikke er en "brems" der ellers

Who changed what in which revision?

UserRevisionLine numberNew contents of line
leonardene 0:bf27900bdc22 1 #include "mbed.h"
leonardene 1:f3c6c8f735a5 2 #include "SRF05.h"
leonardene 7:112b745b2b9e 3 #include "SRF02.h"
leonardene 1:f3c6c8f735a5 4
leonardene 1:f3c6c8f735a5 5 Serial pc(USBTX, USBRX);
leonardene 1:f3c6c8f735a5 6 Serial bt(p13, p14);
leonardene 0:bf27900bdc22 7
leonardene 1:f3c6c8f735a5 8 DigitalOut led (LED1);
leonardene 7:112b745b2b9e 9 SRF05 srf05(p7, p8);
leonardene 8:63f1033aaea2 10 SRF02 srf02(p9, p10);
leonardene 1:f3c6c8f735a5 11
leonardene 4:690abfca1f4d 12 char input();
leonardene 4:690abfca1f4d 13 void avstand();
leonardene 1:f3c6c8f735a5 14 void detektor(float);
leonardene 12:4cefe940afbc 15 void hastighet();
leonardene 9:4b38e90b8f10 16 void plasseringiplan();
leonardene 9:4b38e90b8f10 17 //void triangulering();
leonardene 0:bf27900bdc22 18
leonardene 1:f3c6c8f735a5 19 int main()
leonardene 1:f3c6c8f735a5 20 {
leonardene 1:f3c6c8f735a5 21 float y;
leonardene 0:bf27900bdc22 22 while(1) {
leonardene 11:cc2d82380198 23 char kom1 [] = {"\n\nMenu\n1)\tMeassure Distance\n2)\tMotion Detection\n3)\tMeassure Velocity\n4)\tPlacement\n"};
leonardene 9:4b38e90b8f10 24 pc.printf("%s", kom1);
leonardene 9:4b38e90b8f10 25 bt.printf("%s", kom1);
leonardene 4:690abfca1f4d 26 while (pc.readable() == 0 && bt.readable() == 0) {}
leonardene 4:690abfca1f4d 27 switch (input()) {
leonardene 1:f3c6c8f735a5 28 case('1'): {
leonardene 10:e83df36b417a 29 char kom2 [] = {"\nPress 'y' to meassure distance\nPress 'n' to return to the menu\nThe bargraph will light up according to how close the object is\n1 LED equals 40cm\n"};
leonardene 9:4b38e90b8f10 30 pc.printf("%s", kom2);
leonardene 9:4b38e90b8f10 31 bt.printf("%s", kom2);
leonardene 4:690abfca1f4d 32 avstand();
leonardene 1:f3c6c8f735a5 33 break;
leonardene 1:f3c6c8f735a5 34 }
leonardene 1:f3c6c8f735a5 35 case('2'): {
leonardene 9:4b38e90b8f10 36 char kom3 [] = {"\nLights will flash when a motion is detected\nPress 'n' to return to the menu\n"};
leonardene 9:4b38e90b8f10 37 pc.printf("%s", kom3);
leonardene 9:4b38e90b8f10 38 bt.printf("%s", kom3);
leonardene 7:112b745b2b9e 39 y = srf05.read();
leonardene 2:d8543bd496a0 40 detektor(y);
leonardene 1:f3c6c8f735a5 41 break;
leonardene 1:f3c6c8f735a5 42 }
leonardene 1:f3c6c8f735a5 43 case('3'): {
leonardene 11:cc2d82380198 44 char kom4 [] = {"\nThis feature meassures the velocity of any movement towards Ultra-Sonic Ranger SRF05\nPress 'n' to return to the menu\n"};
leonardene 9:4b38e90b8f10 45 pc.printf("%s", kom4);
leonardene 9:4b38e90b8f10 46 bt.printf("%s", kom4);
leonardene 12:4cefe940afbc 47 hastighet();
leonardene 1:f3c6c8f735a5 48 break;
leonardene 2:d8543bd496a0 49 }
leonardene 7:112b745b2b9e 50 case('4'): {
leonardene 11:cc2d82380198 51 char kom5 [] = {"\nThis feature returns the positon of an object in a 2D-table\nEach 'O' represents 10square centimeters.\nMeassurements start from 50cm away for SRF02 and 140 CM away from SRF05\n"};
leonardene 9:4b38e90b8f10 52 pc.printf("%s", kom5);
leonardene 9:4b38e90b8f10 53 bt.printf("%s", kom5);
leonardene 9:4b38e90b8f10 54 plasseringiplan();
leonardene 9:4b38e90b8f10 55 break;
leonardene 9:4b38e90b8f10 56 } /*
leonardene 11:cc2d82380198 57 case('5'): {
leonardene 11:cc2d82380198 58 triangulering();
leonardene 11:cc2d82380198 59 break;
leonardene 0:bf27900bdc22 60 }
leonardene 11:cc2d82380198 61 */
leonardene 11:cc2d82380198 62 default:
leonardene 11:cc2d82380198 63 char kom6 [] = {"\nERROR: Invalid value\n"};
leonardene 11:cc2d82380198 64 pc.printf("%s", kom6);
leonardene 11:cc2d82380198 65 bt.printf("%s", kom6);
leonardene 11:cc2d82380198 66 }
leonardene 11:cc2d82380198 67 }
leonardene 9:4b38e90b8f10 68 }
leonardene 5:7209741a08bc 69
leonardene 5:7209741a08bc 70 /* Char Input() er en funksjon som avgjør om input kommer fra bluetooth eller pc. Deretter returnerer den input verdien. */
leonardene 5:7209741a08bc 71
leonardene 4:690abfca1f4d 72 char input()
leonardene 4:690abfca1f4d 73 {
leonardene 4:690abfca1f4d 74 if(pc.readable())
leonardene 4:690abfca1f4d 75 return getchar();
leonardene 4:690abfca1f4d 76 else if (bt.readable())
leonardene 4:690abfca1f4d 77 return bt.getc();
leonardene 4:690abfca1f4d 78 else
leonardene 4:690abfca1f4d 79 return 1;
leonardene 0:bf27900bdc22 80 }
leonardene 1:f3c6c8f735a5 81
leonardene 5:7209741a08bc 82 /* Void avstand() er en funksjon som måler avstand til en gjenstand innenfor rekkevidden til ultralyd sensoren. Avstanden sendes til pc & bluetooth i cm. */
leonardene 5:7209741a08bc 83
leonardene 4:690abfca1f4d 84 void avstand()
leonardene 4:690abfca1f4d 85 {
leonardene 9:4b38e90b8f10 86 DigitalOut bar[] = {NC, p21, p22, p23, p24, p25, p26, p27, p28, p29, p30};
leonardene 4:690abfca1f4d 87 char a;
leonardene 9:4b38e90b8f10 88 float y, z;
leonardene 4:690abfca1f4d 89 int n = 0;
leonardene 1:f3c6c8f735a5 90
leonardene 9:4b38e90b8f10 91 while (a != 'n') {
leonardene 4:690abfca1f4d 92 while (pc.readable() == 0 && bt.readable() == 0) {}
leonardene 4:690abfca1f4d 93 a = input();
leonardene 4:690abfca1f4d 94 if (a == 'y') {
leonardene 7:112b745b2b9e 95 y = srf05.read();
leonardene 5:7209741a08bc 96 if (y > 350) {
leonardene 9:4b38e90b8f10 97 char kom1 [] = {"\nDetection area is exceeded (350cm)\n"};
leonardene 9:4b38e90b8f10 98 pc.printf("%s", kom1);
leonardene 9:4b38e90b8f10 99 bt.printf("%s", kom1);
leonardene 9:4b38e90b8f10 100 y = z;
leonardene 5:7209741a08bc 101 } else {
leonardene 9:4b38e90b8f10 102 z = y;
leonardene 5:7209741a08bc 103 pc.printf("\nMeassurement (%d):\t%.2fcm\n",n, y);
leonardene 5:7209741a08bc 104 bt.printf("\nMeassurement (%d):\t%.2fcm\n",n, y);
leonardene 4:690abfca1f4d 105 }
leonardene 5:7209741a08bc 106 for(int x = 1; x <= 10; x++) {
leonardene 9:4b38e90b8f10 107 (x*35 < y) ? bar[x] = 0 : bar[x] = 1;
leonardene 5:7209741a08bc 108 }
leonardene 4:690abfca1f4d 109 n++;
leonardene 4:690abfca1f4d 110 wait_ms (50);
leonardene 9:4b38e90b8f10 111 } else if (a != 'n') {
leonardene 9:4b38e90b8f10 112 char kom3 [] = {"\nInvalid input\n"};
leonardene 9:4b38e90b8f10 113 pc.printf("%s", kom3);
leonardene 9:4b38e90b8f10 114 bt.printf("%s", kom3);
leonardene 6:5fee13e621e0 115 }
leonardene 1:f3c6c8f735a5 116 }
leonardene 4:690abfca1f4d 117 for(int x = 1; x <= 10; x++)
leonardene 4:690abfca1f4d 118 bar[x] = 0;
leonardene 1:f3c6c8f735a5 119 }
leonardene 1:f3c6c8f735a5 120
leonardene 5:7209741a08bc 121 /* Funksjonen Void detektor() er en funksjon som detekterer bevegelse. LED blinker ved deteksjon. */
leonardene 5:7209741a08bc 122
leonardene 1:f3c6c8f735a5 123 void detektor(float y)
leonardene 1:f3c6c8f735a5 124 {
leonardene 4:690abfca1f4d 125 int b = 0;
leonardene 9:4b38e90b8f10 126 while (input() != 'n') {
leonardene 7:112b745b2b9e 127 if (y+2 < srf05.read() || y-2 > srf05.read()) {
leonardene 4:690abfca1f4d 128 led = !led;
leonardene 4:690abfca1f4d 129 if (b == 0) {
leonardene 9:4b38e90b8f10 130 char kom1 [] = {"\nMotion Detected\n"};
leonardene 9:4b38e90b8f10 131 pc.printf("%s", kom1);
leonardene 9:4b38e90b8f10 132 bt.printf("%s", kom1);
leonardene 9:4b38e90b8f10 133
leonardene 4:690abfca1f4d 134 b = 1;
leonardene 4:690abfca1f4d 135 }
leonardene 4:690abfca1f4d 136 } else
leonardene 4:690abfca1f4d 137 led = 0;
leonardene 2:d8543bd496a0 138 wait_ms (50);
leonardene 2:d8543bd496a0 139 }
leonardene 1:f3c6c8f735a5 140 }
leonardene 1:f3c6c8f735a5 141
leonardene 5:7209741a08bc 142 /* Funksjonen Void Hastighet() måler hastigheten til et objekt foran ultralyd sensoren. Hastigheten skrives til pc & bluetooth i km/t. */
leonardene 5:7209741a08bc 143
leonardene 12:4cefe940afbc 144 void hastighet ()
leonardene 1:f3c6c8f735a5 145 {
leonardene 3:1eb0ad70f562 146 Timer t;
leonardene 11:cc2d82380198 147 float start, stopp, fart;
leonardene 9:4b38e90b8f10 148 while(input() != 'n') {
leonardene 4:690abfca1f4d 149 t.start();
leonardene 7:112b745b2b9e 150 start = srf05.read();
leonardene 11:cc2d82380198 151 while (t.read() < 0.25 && srf05.read() > 10) {}
leonardene 4:690abfca1f4d 152 t.stop();
leonardene 7:112b745b2b9e 153 stopp = srf05.read();
leonardene 11:cc2d82380198 154 fart = (start - stopp)*(3.6/(t.read()*100));
leonardene 11:cc2d82380198 155 if (stopp < 10) {
leonardene 11:cc2d82380198 156 char kom1 [] = {"\nERROR: Closer than 10cm from the Ultra Sonic Ranger."};
leonardene 11:cc2d82380198 157 pc.printf("%s", kom1);
leonardene 11:cc2d82380198 158 bt.printf("%s", kom1);
leonardene 13:a4d68367b352 159 wait_ms (50);
leonardene 11:cc2d82380198 160 }
leonardene 11:cc2d82380198 161 if (0.5 < fart && start < 350 && stopp < 350) {
leonardene 11:cc2d82380198 162 pc.printf("\nVelocity is = %0.2f km/t", fart);
leonardene 11:cc2d82380198 163 bt.printf("\nVelocity is = %0.2f km/t", fart);
leonardene 6:5fee13e621e0 164 }
leonardene 4:690abfca1f4d 165 t.reset();
leonardene 1:f3c6c8f735a5 166 }
leonardene 7:112b745b2b9e 167 }
leonardene 7:112b745b2b9e 168
leonardene 9:4b38e90b8f10 169 /*Funksjonen plasseringiplan måler avstanden til et objekt i målesonen, fra to forskjellige vinkler. Avstanden til objektet plasseres i et 2D-plan. Størrelsen på planet er 100cm langs x akse og 50cm langs y akse.*/
leonardene 8:63f1033aaea2 170
leonardene 9:4b38e90b8f10 171 void plasseringiplan ()
leonardene 7:112b745b2b9e 172 {
leonardene 8:63f1033aaea2 173 char _2DplanX[12] = {'|','O','O','O','O','O','O','O','O','O','O','|'};
leonardene 8:63f1033aaea2 174 char _2Dplan[12] = {'|','O','O','O','O','O','O','O','O','O','O','|'};
leonardene 8:63f1033aaea2 175 int a, b, c;
leonardene 8:63f1033aaea2 176 float d = srf05.read();
leonardene 8:63f1033aaea2 177 b = srf02.getDistanceCm();
leonardene 8:63f1033aaea2 178 pc.printf("\nx = %d\ny = %f\n", b, d);
leonardene 8:63f1033aaea2 179 bt.printf("\nx = %d\ny = %f\n", b, d);
leonardene 8:63f1033aaea2 180 for (c = 1; c < 11; c++) {
leonardene 8:63f1033aaea2 181 if ((c*10+40) <= b && b < ((c+1)*10+40))
leonardene 8:63f1033aaea2 182 _2DplanX[c] = 'x';
leonardene 8:63f1033aaea2 183 else
leonardene 8:63f1033aaea2 184 _2DplanX[c] = 'O';
leonardene 8:63f1033aaea2 185 }
leonardene 8:63f1033aaea2 186 for (c = 190; c >= 150; c=c-10) {
leonardene 8:63f1033aaea2 187 if (c-10 <= d && d < c) {
leonardene 9:4b38e90b8f10 188 for(a = 0; a < 12; a++) {
leonardene 8:63f1033aaea2 189 pc.printf("%c",_2DplanX[a]);
leonardene 8:63f1033aaea2 190 bt.printf("%c",_2DplanX[a]);
leonardene 9:4b38e90b8f10 191 }
leonardene 8:63f1033aaea2 192 } else {
leonardene 9:4b38e90b8f10 193 for(a = 0; a < 12; a++) {
leonardene 8:63f1033aaea2 194 pc.printf("%c",_2Dplan[a]);
leonardene 8:63f1033aaea2 195 bt.printf("%c",_2Dplan[a]);
leonardene 9:4b38e90b8f10 196 }
leonardene 8:63f1033aaea2 197 }
leonardene 8:63f1033aaea2 198 printf("\n");
leonardene 8:63f1033aaea2 199 }
leonardene 9:4b38e90b8f10 200 }
leonardene 9:4b38e90b8f10 201 /*
leonardene 9:4b38e90b8f10 202 void triangulering ()
leonardene 9:4b38e90b8f10 203 {
leonardene 9:4b38e90b8f10 204 double vinkel_A, vinkel_B, a, b, c, z, x;
leonardene 9:4b38e90b8f10 205 char kom1 [] = {"\nEnter distance between sensor 1 and 2 in cm"};
leonardene 9:4b38e90b8f10 206 pc.printf("%s", kom1);
leonardene 9:4b38e90b8f10 207 bt.printf("%s", kom1);
leonardene 9:4b38e90b8f10 208 while (pc.readable() == 0 && bt.readable() == 0) {}
leonardene 9:4b38e90b8f10 209 pc.scanf("%lf", &c);
leonardene 9:4b38e90b8f10 210 b = srf02.getDistanceCm();
leonardene 9:4b38e90b8f10 211 a = srf05.read();
leonardene 9:4b38e90b8f10 212 vinkel_A = acos((b*b+c*c-a*a)/(2*b*c));
leonardene 9:4b38e90b8f10 213 vinkel_B = acos((c*c+a*a-b*b)/(2*b*c));
leonardene 9:4b38e90b8f10 214 x = cos(vinkel_A)*b;
leonardene 9:4b38e90b8f10 215 z = sin(vinkel_A)*b;
leonardene 9:4b38e90b8f10 216 pc.printf("\nVinkel_A = %lf\nVinkel_B = %lf\nA = %lf\nB = %lf\nC = %lf\nZ = %lf\nX = %lf\n",vinkel_A, vinkel_B, a, b, c, z, x);
leonardene 9:4b38e90b8f10 217 }
leonardene 9:4b38e90b8f10 218 */
leonardene 9:4b38e90b8f10 219
leonardene 9:4b38e90b8f10 220
leonardene 9:4b38e90b8f10 221
leonardene 9:4b38e90b8f10 222
leonardene 9:4b38e90b8f10 223
leonardene 9:4b38e90b8f10 224
leonardene 9:4b38e90b8f10 225