Test

Dependencies:   SRF02 SRF05 mbed

Fork of Prosjekt_2 by HIOF Programmering

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");
    }
}