First Draft, serial print change based on distance

main.cpp

Committer:
liam94
Date:
2022-01-22
Revision:
4:77500a7f951d
Parent:
3:0b0fbddb6f51
Child:
5:98845ccaaacd

File content as of revision 4:77500a7f951d:

#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);

// VCC,SCE,RST,D/C,MOSI,SCLK,LED
N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); // K64F - pwr from 3V3

// 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);
    lcd.init();
    lcd.setContrast(0.4);
    mu.startUpdates();//start mesuring the distance
    while(1)
    {
    output = fsm[state];  // output current state
    lcd.clear(); // clear buffer at start of every loop
// can directly print strings at specified co-ordinates (must be less than 84 pixels to fit on display)
    
// check which state we are in and see which the next state should be
    switch(state) {
        case 0:
        lcd.clear();
        lcd.printString(" object at 0'",0,0);
        lcd.printString("   R + 60'",0,2);
        lcd.printString("   L - 60'",0,4);
        lcd.refresh();
            if (R == 1){
                state = 1;}
            else if (L == 1){
                state = 5;}
            else state = 0;
                break;
        case 1:
        lcd.clear();
        lcd.printString(" object at 60'",0,0);
        lcd.printString("   R + 60'",0,2);
        lcd.printString("   L - 60'",0,4);
        lcd.refresh();
            if (R == 1){
                state = 2;}
            else if (L == 1){
                state = 0;}
            else state = 1;
                break;
        case 2:
        lcd.clear();
        lcd.printString(" object at 120'",0,0);
        lcd.printString("   R + 60'",0,2);
        lcd.printString("   L - 60'",0,4);
        lcd.refresh();
            if (R == 1){
                state = 3;}
            else if (L == 1){
                state = 1;}
            else state = 2;
                break;
        case 3:
        lcd.clear();
        lcd.printString(" object at 180'",0,0);
        lcd.printString("   R + 60'",0,2);
        lcd.printString("   L - 60'",0,4);
        lcd.refresh();
            if (R == 1){
                state = 4;}
            else if (L == 1){
                state = 2;}
            else state = 3;
                break;
        case 4:
        lcd.clear();
        lcd.printString(" object at 240'",0,0);
        lcd.printString("   R + 60'",0,2);
        lcd.printString("   L - 60'",0,4);
        lcd.refresh();
            if (R == 1){
                state = 5;}
            else if (L == 1){
                state = 3;}
            else state = 4;
                break;
         case 5:
        lcd.clear();
        lcd.printString(" object at 300'",0,0);
        lcd.printString("   R + 60'",0,2);
        lcd.printString("   L - 60'",0,4);
        lcd.refresh();
            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(100);
        
        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);
    }
    }