First Draft, serial print change based on distance

main.cpp

Committer:
liam94
Date:
2022-01-21
Revision:
3:0b0fbddb6f51
Parent:
2:3ace5b4ae9a7
Child:
4:77500a7f951d

File content as of revision 3:0b0fbddb6f51:

#include "mbed.h"
#include "ultrasonic.h"
#include "N5110.h"
// added R and L buttons presses in so that the user has to press when they are ready to rotate object and in which direction
DigitalIn L(PTB18);
DigitalIn R(PTB3);

// LEDs on PCB to be connected (1 to 6) - active-low 0 = on and 1 = off
BusOut output(PTA1,PTA2,PTC2,PTC3,PTC4,PTD3);

// array of states in the FSM, each element is the output of the counter
// set the output in binary to make it easier, 0 is LED on, 1 is LED off
int fsm[6] = {0b111110, 0b111101, 0b111011, 0b110111, 0b101111, 0b011111};

void dist(int distance);


ultrasonic mu(PTD0, PTC12, .5, 1, &dist);    //Set the trigger pin to PTD0 and the echo pin to PTC12
                                        //have updates every .5 seconds and a timeout after 1
                                        //second, and call dist when the distance changes

int main()
{
    // set inital state 
    int state = 0;
    R.mode(PullDown);
    L.mode(PullDown);
    mu.startUpdates();//start mesuring the distance
    while(1)
    {
output = fsm[state];  // output current state
        // check which state we are in and see which the next state should be
        switch(state) {
            case 0:
            if (R == 1){
                state = 1;}
            else if (L == 1){
                state = 5;}
            else state = 0;
                break;
            case 1:
            if (R == 1){
                state = 2;}
            else if (L == 1){
                state = 0;}
            else state = 1;
                break;
            case 2:
            if (R == 1){
                state = 3;}
            else if (L == 1){
                state = 1;}
            else state = 2;
                break;
            case 3:
            if (R == 1){
                state = 4;}
            else if (L == 1){
                state = 2;}
            else state = 3;
                break;
            case 4:
            if (R == 1){
                state = 5;}
            else if (L == 1){
                state = 3;}
            else state = 4;
                break;
            case 5:
            if (R == 1){
                state = 0;}
            else if (L == 1){
                state = 4;}
            else state = 5;
                break;
            default:
                error("Invalid state");  //invalid state - call error routine
                // or could jump to starting state i.e. state = 0
                break;  
        }
        ThisThread::sleep_for(500);
        
        mu.checkDistance();     //call checkDistance() as much as possible, as this is where
                                //the class checks if dist needs to be called.
    }
}
    
void dist(int distance){

    if (distance > 250){
    printf("Safe Distance %dmm\r\n", distance);
    }
    else if (distance <= 250 and distance > 150){
    printf("object detected %dmm\r\n", distance);
    }
    else if (distance <= 150 and distance > 80){
    printf("object detected Closer %dmm\r\n", distance);
    }
    else if (distance <= 80 and distance > 60){
    printf("Even Closer %dmm\r\n", distance);
    }
    else if (distance <= 60 and distance > 40){
    printf("Very Very Close %dmm\r\n", distance);
    }
    else if (distance <= 40 and distance > 0){
    printf("You've Hit a Wall %dmm\r\n", distance);  
    }
    }