Test
Dependencies: SRF02 SRF05 mbed
Fork of Prosjekt_2 by
main.cpp
- Committer:
- leonardene
- Date:
- 2016-04-01
- Revision:
- 8:63f1033aaea2
- Parent:
- 7:112b745b2b9e
- Child:
- 9:4b38e90b8f10
File content as of revision 8:63f1033aaea2:
#include "mbed.h" #include "SRF05.h" #include "SRF02.h" Serial pc(USBTX, USBRX); Serial bt(p13, p14); DigitalOut led (LED1); DigitalIn imp (p12); SRF05 srf05(p7, p8); SRF02 srf02(p9, p10); DigitalOut bar[] = {NC, p21, p22, p23, p24, p25, p26, p27, p28, p29, p30}; void meny(); char input(); void avstand(); void detektor(float); void hastighet(float); void triangulering(); int main() { while(1) { meny(); } } /* Void meny() er en valg meny. Her kan en bestemme hvilke handlinger som skal utføres. Det er tre muligheter å velge imellom: avstandsmåling, deteksjon og farts måling. */ void meny() { float y; while(1) { pc.printf("\nMenu\n1)\tMeassure Distance\n2)\tMotion Detection\n3)\tMeassure Velocity\n4)\tTriangulation\n"); bt.printf("\nMenu\n1)\tMeassure Distance\n2)\tMotion Detection\n3)\tMeassure Velocity\n4)\tTriangulation\n"); while (pc.readable() == 0 && bt.readable() == 0) {} switch (input()) { case('1'): { pc.printf("\nPress 'y' to meassure distance\nPress 'n' to return to the menu\nThe bargraph will light up according to the distance\n1 LED equals 40cm\n"); bt.printf("\nPress 'y' to meassure distance\nPress 'n' to return to the menu\nThe bargraph will light up according to the distance\n1 LED equals 40cm\n"); avstand(); break; } case('2'): { pc.printf("\nLights will flash when a motion is detected\nPress 'n' to return to the menu\n"); bt.printf("\nLights will flash when a motion is detected\nPress 'n' to return to the menu\n"); y = srf05.read(); detektor(y); break; } case('3'): { pc.printf("\nThis feature meassures the velocity of any movement directed directly towards or away from the Mbed\nPress 'n' to return to the menu\n"); bt.printf("\nThis feature meassures the velocity of any movement directed directly towards or away from the Mbed\nPress 'n' to return to the menu\n"); y = srf05.read(); hastighet(y); break; } case('4'): { pc.printf("\nThis feature triangulation an object and forwards the positon within a 2D-table\nEach 'O' represents 10square centimeters.\nMeassurements start from 50cm away for SRF02 and 140 CM away from SRF05\n"); bt.printf("\nThis feature triangulation an object and forwards the positon within a 2D-table\nEach 'O' represents 10square centimeters.\nMeassurements start from 50cm away for SRF02 and 140 CM away from SRF05\n"); triangulering(); break; } default: pc.printf("\nERROR: Invalid value\n"); bt.printf("\nERROR: Invalid value\n"); } } } /* Char Input() er en funksjon som avgjør om input kommer fra bluetooth eller pc. Deretter returnerer den input verdien. */ char input() { if(pc.readable()) return getchar(); else if (bt.readable()) return bt.getc(); else return 1; } /* Void avstand() er en funksjon som måler avstand til en gjenstand innenfor rekkevidden til ultralyd sensoren. Avstanden sendes til pc & bluetooth i cm. */ void avstand() { char a; float y; int n = 0; while (1) { while (pc.readable() == 0 && bt.readable() == 0) {} a = input(); if (a == 'y') { y = srf05.read(); if (y > 350) { y = 350; pc.printf("\nDetection area is exceeded (350cm)\n"); bt.printf("\nDetection area is exceeded (350cm)\n"); } else { pc.printf("\nMeassurement (%d):\t%.2fcm\n",n, y); bt.printf("\nMeassurement (%d):\t%.2fcm\n",n, y); } for(int x = 1; x <= 10; x++) { (x*35 < y) ? bar[x] = 1 : bar[x] = 0; } n++; wait_ms (50); } else if(a == 'n') break; else { pc.printf("\nInvalid input\n"); bt.printf("\nInvalid input\n"); } } for(int x = 1; x <= 10; x++) bar[x] = 0; } /* Funksjonen Void detektor() er en funksjon som detekterer bevegelse. LED blinker ved deteksjon. */ void detektor(float y) { int b = 0; while (1) { if (y+2 < srf05.read() || y-2 > srf05.read()) { led = !led; if (b == 0) { pc.printf("\nMotion Detected\n"); bt.printf("\nMotion Detected\n"); b = 1; } } else led = 0; if(input() == 'n') break; wait_ms (50); } } /* Funksjonen Void Hastighet() måler hastigheten til et objekt foran ultralyd sensoren. Hastigheten skrives til pc & bluetooth i km/t. */ void hastighet (float y) { Timer t; float start, stopp; while(1) { t.start(); start = srf05.read(); while (t.read() < 0.25 && srf05.read() < 10) {} t.stop(); stopp = srf05.read(); if (0.05 < (start-stopp)/(25) && start < 350 && stopp < 350) { pc.printf("\nVelocity is = %0.2f km/t", (start-stopp)*3.6/25); bt.printf("\nVelocity is = %0.2f km/t", (start-stopp)*3.6/25); } t.reset(); if(input() == 'n') break; } } /*Funksjonen triangulering 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.*/ void triangulering () { char _2DplanX[12] = {'|','O','O','O','O','O','O','O','O','O','O','|'}; char _2Dplan[12] = {'|','O','O','O','O','O','O','O','O','O','O','|'}; int a, b, c; float d = srf05.read(); b = srf02.getDistanceCm(); pc.printf("\nx = %d\ny = %f\n", b, d); bt.printf("\nx = %d\ny = %f\n", b, d); for (c = 1; c < 11; c++) { if ((c*10+40) <= b && b < ((c+1)*10+40)) _2DplanX[c] = 'x'; else _2DplanX[c] = 'O'; } for (c = 190; c >= 150; c=c-10) { if (c-10 <= d && d < c) { for(a = 0; a < 12; a++) pc.printf("%c",_2DplanX[a]); bt.printf("%c",_2DplanX[a]); } else { for(a = 0; a < 12; a++) pc.printf("%c",_2Dplan[a]); bt.printf("%c",_2Dplan[a]); } printf("\n"); } }