First Draft, serial print change based on distance

Committer:
liam94
Date:
Wed Jan 26 23:08:24 2022 +0000
Revision:
7:7464fbb0f3e1
Parent:
6:18a4dd77057e
Child:
8:7e48229d678c
added calibration screen that displays current sensor distance on LCD

Who changed what in which revision?

UserRevisionLine numberNew contents of line
liam94 0:506531d0531c 1 #include "mbed.h"
liam94 0:506531d0531c 2 #include "ultrasonic.h"
liam94 0:506531d0531c 3 #include "N5110.h"
liam94 5:98845ccaaacd 4 #include "Joystick.h"
liam94 5:98845ccaaacd 5 #include "main.h"
liam94 4:77500a7f951d 6
liam94 2:3ace5b4ae9a7 7
liam94 2:3ace5b4ae9a7 8 int main()
liam94 1:a1795335ef8c 9 {
liam94 5:98845ccaaacd 10
liam94 3:0b0fbddb6f51 11 R.mode(PullDown);
liam94 3:0b0fbddb6f51 12 L.mode(PullDown);
liam94 5:98845ccaaacd 13 Start.mode(PullDown);
liam94 5:98845ccaaacd 14 Start.rise(Start_isr);
liam94 5:98845ccaaacd 15 Back.mode(PullDown);
liam94 5:98845ccaaacd 16 Back.rise(Back_isr);
liam94 6:18a4dd77057e 17 mu.startUpdates();//start mesuring the distance
liam94 5:98845ccaaacd 18
liam94 5:98845ccaaacd 19 joystick.init();
liam94 5:98845ccaaacd 20 init_display();
liam94 5:98845ccaaacd 21 main_menu();
liam94 5:98845ccaaacd 22
liam94 5:98845ccaaacd 23 }
liam94 5:98845ccaaacd 24
liam94 5:98845ccaaacd 25 void init_display(){
liam94 5:98845ccaaacd 26
liam94 4:77500a7f951d 27 lcd.init();
liam94 4:77500a7f951d 28 lcd.setContrast(0.4);
liam94 5:98845ccaaacd 29 lcd.clear(); /// clear screen (init)
liam94 5:98845ccaaacd 30
liam94 5:98845ccaaacd 31 }
liam94 5:98845ccaaacd 32
liam94 5:98845ccaaacd 33
liam94 5:98845ccaaacd 34 void main_menu(){
liam94 5:98845ccaaacd 35
liam94 5:98845ccaaacd 36 lcd.clear();
liam94 5:98845ccaaacd 37 Start_flag = 0;
liam94 5:98845ccaaacd 38 int select = 0;
liam94 5:98845ccaaacd 39 output = 63; //set all LEDs to off
liam94 5:98845ccaaacd 40
liam94 5:98845ccaaacd 41 while (1) {
liam94 5:98845ccaaacd 42
liam94 5:98845ccaaacd 43 Direction d = joystick.get_direction();
liam94 5:98845ccaaacd 44 printf("Direction = %i\n",d);
liam94 5:98845ccaaacd 45
liam94 5:98845ccaaacd 46 switch(select) {
liam94 5:98845ccaaacd 47 case 0:
liam94 5:98845ccaaacd 48 switch(d) {
liam94 5:98845ccaaacd 49 case 1:
liam94 5:98845ccaaacd 50 select = 1;
liam94 5:98845ccaaacd 51 printf("UP");
liam94 5:98845ccaaacd 52 break;
liam94 5:98845ccaaacd 53 case 5:
liam94 5:98845ccaaacd 54 select = 1;
liam94 5:98845ccaaacd 55 printf("Down");
liam94 5:98845ccaaacd 56 break;
liam94 5:98845ccaaacd 57 }
liam94 5:98845ccaaacd 58 break;
liam94 5:98845ccaaacd 59 case 1:
liam94 5:98845ccaaacd 60 switch(d) {
liam94 5:98845ccaaacd 61 case 1:
liam94 5:98845ccaaacd 62 select = 0;
liam94 5:98845ccaaacd 63 printf("UP");
liam94 5:98845ccaaacd 64 break;
liam94 5:98845ccaaacd 65 case 5:
liam94 5:98845ccaaacd 66 select = 0;
liam94 5:98845ccaaacd 67 printf("Down");
liam94 5:98845ccaaacd 68 break;
liam94 5:98845ccaaacd 69 }
liam94 5:98845ccaaacd 70 break;
liam94 5:98845ccaaacd 71
liam94 5:98845ccaaacd 72 }
liam94 5:98845ccaaacd 73 wait(0.1);
liam94 5:98845ccaaacd 74 if (select == 0) {
liam94 5:98845ccaaacd 75 lcd.clear();
liam94 5:98845ccaaacd 76 lcd.printString("Detect",27,0);
liam94 5:98845ccaaacd 77 lcd.printString("Sense Object",7,2);
liam94 5:98845ccaaacd 78 lcd.printString("Calibration",7,3);
liam94 5:98845ccaaacd 79 lcd.drawCircle(3,19,2,FILL_TRANSPARENT);
liam94 5:98845ccaaacd 80 lcd.refresh();
liam94 5:98845ccaaacd 81 wait(0.15);
liam94 5:98845ccaaacd 82 if (Start_flag == 1) {
liam94 5:98845ccaaacd 83 Start_flag = 0;
liam94 5:98845ccaaacd 84 sense_object();
liam94 5:98845ccaaacd 85 }
liam94 5:98845ccaaacd 86 } else if (select == 1) {
liam94 5:98845ccaaacd 87 lcd.clear();
liam94 5:98845ccaaacd 88 lcd.printString("Detect",27,0);
liam94 5:98845ccaaacd 89 lcd.printString("Sense Object", 7,2);
liam94 5:98845ccaaacd 90 lcd.printString("Calibration",7,3);
liam94 5:98845ccaaacd 91 lcd.drawCircle(3,27,2,FILL_TRANSPARENT);
liam94 5:98845ccaaacd 92 lcd.refresh();
liam94 5:98845ccaaacd 93 wait(0.15);
liam94 5:98845ccaaacd 94 if (Start_flag == 1) {
liam94 5:98845ccaaacd 95 Start_flag = 0;
liam94 6:18a4dd77057e 96 calibrate_object();
liam94 5:98845ccaaacd 97 }
liam94 5:98845ccaaacd 98 }
liam94 5:98845ccaaacd 99 }
liam94 5:98845ccaaacd 100 }
liam94 5:98845ccaaacd 101
liam94 5:98845ccaaacd 102 void sense_object(){
liam94 5:98845ccaaacd 103
liam94 5:98845ccaaacd 104
liam94 5:98845ccaaacd 105 // set inital state
liam94 5:98845ccaaacd 106 int state = 0;
liam94 5:98845ccaaacd 107
liam94 2:3ace5b4ae9a7 108 while(1)
liam94 2:3ace5b4ae9a7 109 {
liam94 4:77500a7f951d 110 output = fsm[state]; // output current state
liam94 5:98845ccaaacd 111 // check which state we are in and see which the next state should be
liam94 4:77500a7f951d 112 switch(state) {
liam94 4:77500a7f951d 113 case 0:
liam94 4:77500a7f951d 114 lcd.clear();
liam94 4:77500a7f951d 115 lcd.printString(" object at 0'",0,0);
liam94 4:77500a7f951d 116 lcd.printString(" R + 60'",0,2);
liam94 4:77500a7f951d 117 lcd.printString(" L - 60'",0,4);
liam94 4:77500a7f951d 118 lcd.refresh();
liam94 3:0b0fbddb6f51 119 if (R == 1){
liam94 3:0b0fbddb6f51 120 state = 1;}
liam94 3:0b0fbddb6f51 121 else if (L == 1){
liam94 3:0b0fbddb6f51 122 state = 5;}
liam94 3:0b0fbddb6f51 123 else state = 0;
liam94 2:3ace5b4ae9a7 124 break;
liam94 4:77500a7f951d 125 case 1:
liam94 4:77500a7f951d 126 lcd.clear();
liam94 4:77500a7f951d 127 lcd.printString(" object at 60'",0,0);
liam94 4:77500a7f951d 128 lcd.printString(" R + 60'",0,2);
liam94 4:77500a7f951d 129 lcd.printString(" L - 60'",0,4);
liam94 4:77500a7f951d 130 lcd.refresh();
liam94 3:0b0fbddb6f51 131 if (R == 1){
liam94 3:0b0fbddb6f51 132 state = 2;}
liam94 3:0b0fbddb6f51 133 else if (L == 1){
liam94 3:0b0fbddb6f51 134 state = 0;}
liam94 3:0b0fbddb6f51 135 else state = 1;
liam94 2:3ace5b4ae9a7 136 break;
liam94 4:77500a7f951d 137 case 2:
liam94 4:77500a7f951d 138 lcd.clear();
liam94 4:77500a7f951d 139 lcd.printString(" object at 120'",0,0);
liam94 4:77500a7f951d 140 lcd.printString(" R + 60'",0,2);
liam94 4:77500a7f951d 141 lcd.printString(" L - 60'",0,4);
liam94 4:77500a7f951d 142 lcd.refresh();
liam94 3:0b0fbddb6f51 143 if (R == 1){
liam94 3:0b0fbddb6f51 144 state = 3;}
liam94 3:0b0fbddb6f51 145 else if (L == 1){
liam94 3:0b0fbddb6f51 146 state = 1;}
liam94 3:0b0fbddb6f51 147 else state = 2;
liam94 2:3ace5b4ae9a7 148 break;
liam94 4:77500a7f951d 149 case 3:
liam94 4:77500a7f951d 150 lcd.clear();
liam94 4:77500a7f951d 151 lcd.printString(" object at 180'",0,0);
liam94 4:77500a7f951d 152 lcd.printString(" R + 60'",0,2);
liam94 4:77500a7f951d 153 lcd.printString(" L - 60'",0,4);
liam94 4:77500a7f951d 154 lcd.refresh();
liam94 3:0b0fbddb6f51 155 if (R == 1){
liam94 3:0b0fbddb6f51 156 state = 4;}
liam94 3:0b0fbddb6f51 157 else if (L == 1){
liam94 3:0b0fbddb6f51 158 state = 2;}
liam94 3:0b0fbddb6f51 159 else state = 3;
liam94 2:3ace5b4ae9a7 160 break;
liam94 4:77500a7f951d 161 case 4:
liam94 4:77500a7f951d 162 lcd.clear();
liam94 4:77500a7f951d 163 lcd.printString(" object at 240'",0,0);
liam94 4:77500a7f951d 164 lcd.printString(" R + 60'",0,2);
liam94 4:77500a7f951d 165 lcd.printString(" L - 60'",0,4);
liam94 4:77500a7f951d 166 lcd.refresh();
liam94 3:0b0fbddb6f51 167 if (R == 1){
liam94 3:0b0fbddb6f51 168 state = 5;}
liam94 3:0b0fbddb6f51 169 else if (L == 1){
liam94 3:0b0fbddb6f51 170 state = 3;}
liam94 3:0b0fbddb6f51 171 else state = 4;
liam94 2:3ace5b4ae9a7 172 break;
liam94 4:77500a7f951d 173 case 5:
liam94 4:77500a7f951d 174 lcd.clear();
liam94 4:77500a7f951d 175 lcd.printString(" object at 300'",0,0);
liam94 4:77500a7f951d 176 lcd.printString(" R + 60'",0,2);
liam94 4:77500a7f951d 177 lcd.printString(" L - 60'",0,4);
liam94 4:77500a7f951d 178 lcd.refresh();
liam94 3:0b0fbddb6f51 179 if (R == 1){
liam94 3:0b0fbddb6f51 180 state = 0;}
liam94 3:0b0fbddb6f51 181 else if (L == 1){
liam94 3:0b0fbddb6f51 182 state = 4;}
liam94 3:0b0fbddb6f51 183 else state = 5;
liam94 2:3ace5b4ae9a7 184 break;
liam94 2:3ace5b4ae9a7 185 default:
liam94 2:3ace5b4ae9a7 186 error("Invalid state"); //invalid state - call error routine
liam94 2:3ace5b4ae9a7 187 // or could jump to starting state i.e. state = 0
liam94 2:3ace5b4ae9a7 188 break;
liam94 2:3ace5b4ae9a7 189 }
liam94 6:18a4dd77057e 190 if (Back_flag == 1) {
liam94 6:18a4dd77057e 191 Back_flag = 0;
liam94 6:18a4dd77057e 192 main_menu();}
liam94 6:18a4dd77057e 193
liam94 5:98845ccaaacd 194 ThisThread::sleep_for(200);
liam94 5:98845ccaaacd 195 }
liam94 5:98845ccaaacd 196 }
liam94 2:3ace5b4ae9a7 197
liam94 6:18a4dd77057e 198 void calibrate_object(){
liam94 6:18a4dd77057e 199
liam94 6:18a4dd77057e 200 while(1)
liam94 6:18a4dd77057e 201 {
liam94 7:7464fbb0f3e1 202
liam94 7:7464fbb0f3e1 203 mu.checkDistance(); //call checkDistance() as much as possible, as this is where
liam94 6:18a4dd77057e 204 //the class checks if dist needs to be called.
liam94 7:7464fbb0f3e1 205
liam94 6:18a4dd77057e 206 if (Back_flag == 1) {
liam94 6:18a4dd77057e 207 Back_flag = 0;
liam94 6:18a4dd77057e 208 main_menu();}
liam94 6:18a4dd77057e 209
liam94 6:18a4dd77057e 210 wait (1);
liam94 6:18a4dd77057e 211 }
liam94 6:18a4dd77057e 212 }
liam94 6:18a4dd77057e 213
liam94 7:7464fbb0f3e1 214 void dist(int distance)
liam94 7:7464fbb0f3e1 215
liam94 7:7464fbb0f3e1 216 {
liam94 7:7464fbb0f3e1 217 printf("Distance changed to %dmm\r\n", distance);
liam94 7:7464fbb0f3e1 218
liam94 7:7464fbb0f3e1 219 lcd.clear();
liam94 7:7464fbb0f3e1 220
liam94 7:7464fbb0f3e1 221 char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
liam94 7:7464fbb0f3e1 222 // so can display a string of a maximum 14 characters in length
liam94 7:7464fbb0f3e1 223 // or create formatted strings - ensure they aren't more than 14 characters long
liam94 7:7464fbb0f3e1 224 int length = sprintf(buffer,"%dmm", distance); // print formatted data to buffer
liam94 7:7464fbb0f3e1 225 // it is important the format specifier ensures the length will fit in the buffer
liam94 7:7464fbb0f3e1 226 if (length <= 14) // if string will fit on display (assuming printing at x=0)
liam94 7:7464fbb0f3e1 227
liam94 7:7464fbb0f3e1 228 lcd.printString("set object to xxx",0,0);
liam94 7:7464fbb0f3e1 229 lcd.printString(buffer,0,3); // display on screen
liam94 7:7464fbb0f3e1 230 lcd.refresh();
liam94 7:7464fbb0f3e1 231 }
liam94 7:7464fbb0f3e1 232
liam94 5:98845ccaaacd 233 void Start_isr()
liam94 5:98845ccaaacd 234 {
liam94 5:98845ccaaacd 235 Start_flag = 1;
liam94 2:3ace5b4ae9a7 236 }
liam94 2:3ace5b4ae9a7 237
liam94 5:98845ccaaacd 238 void Back_isr()
liam94 5:98845ccaaacd 239 {
liam94 5:98845ccaaacd 240 Back_flag = 1;
liam94 1:a1795335ef8c 241 }
liam94 5:98845ccaaacd 242