![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
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); } }