First Draft, serial print change based on distance

Committer:
liam94
Date:
Fri Jan 28 13:01:19 2022 +0000
Revision:
8:7e48229d678c
Parent:
7:7464fbb0f3e1
Child:
9:ada61082bbaa
improved commenting on main.cpp and .h files

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 8:7e48229d678c 7 /***************************************************************************//**
liam94 8:7e48229d678c 8 *
liam94 8:7e48229d678c 9 * the main code below sets all the interrupts to pull down and also for the start
liam94 8:7e48229d678c 10 * and back buttons it is sent to the specific start and back functions which sets
liam94 8:7e48229d678c 11 * the flags which are then used in other functions.
liam94 8:7e48229d678c 12 *
liam94 8:7e48229d678c 13 * the mu.startUpdates() is where the ultrasonic sensor is told to start measuring
liam94 8:7e48229d678c 14 * the distances.
liam94 8:7e48229d678c 15 * the joystick and lcd are then initialised and the man menu function is then
liam94 8:7e48229d678c 16 * called.
liam94 8:7e48229d678c 17 *
liam94 8:7e48229d678c 18 *******************************************************************************/
liam94 2:3ace5b4ae9a7 19
liam94 2:3ace5b4ae9a7 20 int main()
liam94 1:a1795335ef8c 21 {
liam94 5:98845ccaaacd 22
liam94 3:0b0fbddb6f51 23 R.mode(PullDown);
liam94 3:0b0fbddb6f51 24 L.mode(PullDown);
liam94 5:98845ccaaacd 25 Start.mode(PullDown);
liam94 5:98845ccaaacd 26 Start.rise(Start_isr);
liam94 5:98845ccaaacd 27 Back.mode(PullDown);
liam94 5:98845ccaaacd 28 Back.rise(Back_isr);
liam94 8:7e48229d678c 29 // printf("set buttons");
liam94 8:7e48229d678c 30
liam94 8:7e48229d678c 31 mu.startUpdates();
liam94 8:7e48229d678c 32 // printf ("Ultrasonic Updates started");
liam94 5:98845ccaaacd 33
liam94 5:98845ccaaacd 34 joystick.init();
liam94 8:7e48229d678c 35 // printf("initialise joystick")
liam94 5:98845ccaaacd 36 init_display();
liam94 8:7e48229d678c 37
liam94 5:98845ccaaacd 38 main_menu();
liam94 5:98845ccaaacd 39
liam94 5:98845ccaaacd 40 }
liam94 5:98845ccaaacd 41
liam94 8:7e48229d678c 42 /***************************************************************************//**
liam94 8:7e48229d678c 43 *
liam94 8:7e48229d678c 44 * added function which initalise the display and sets the contrast, this is
liam94 8:7e48229d678c 45 * called from the int main and so the LCD boots up on startup.
liam94 8:7e48229d678c 46 *
liam94 8:7e48229d678c 47 *******************************************************************************/
liam94 8:7e48229d678c 48
liam94 5:98845ccaaacd 49 void init_display(){
liam94 8:7e48229d678c 50
liam94 8:7e48229d678c 51 // printf("initialise display");
liam94 4:77500a7f951d 52 lcd.init();
liam94 4:77500a7f951d 53 lcd.setContrast(0.4);
liam94 8:7e48229d678c 54 lcd.clear();
liam94 5:98845ccaaacd 55
liam94 5:98845ccaaacd 56 }
liam94 8:7e48229d678c 57
liam94 8:7e48229d678c 58 /***************************************************************************//**
liam94 8:7e48229d678c 59 *
liam94 8:7e48229d678c 60 * this function is the main menu for the program, it is called at the start and
liam94 8:7e48229d678c 61 * depending on what string is selected, clicking the start uton will send the
liam94 8:7e48229d678c 62 * user to the specified function.
liam94 8:7e48229d678c 63 *
liam94 8:7e48229d678c 64 *******************************************************************************/
liam94 5:98845ccaaacd 65
liam94 5:98845ccaaacd 66 void main_menu(){
liam94 5:98845ccaaacd 67
liam94 8:7e48229d678c 68 // printf("main menu");
liam94 8:7e48229d678c 69
liam94 5:98845ccaaacd 70 lcd.clear();
liam94 5:98845ccaaacd 71 Start_flag = 0;
liam94 5:98845ccaaacd 72 int select = 0;
liam94 8:7e48229d678c 73 output = 63; // 63 on the bus output sets all LEDs to off
liam94 5:98845ccaaacd 74
liam94 5:98845ccaaacd 75 while (1) {
liam94 5:98845ccaaacd 76
liam94 5:98845ccaaacd 77 Direction d = joystick.get_direction();
liam94 8:7e48229d678c 78 // printf("Direction = %i\n",d);
liam94 5:98845ccaaacd 79
liam94 5:98845ccaaacd 80 switch(select) {
liam94 5:98845ccaaacd 81 case 0:
liam94 5:98845ccaaacd 82 switch(d) {
liam94 8:7e48229d678c 83 case N:
liam94 5:98845ccaaacd 84 select = 1;
liam94 8:7e48229d678c 85 // printf("UP");
liam94 5:98845ccaaacd 86 break;
liam94 8:7e48229d678c 87 case S:
liam94 5:98845ccaaacd 88 select = 1;
liam94 8:7e48229d678c 89 // printf("Down");
liam94 5:98845ccaaacd 90 break;
liam94 5:98845ccaaacd 91 }
liam94 5:98845ccaaacd 92 break;
liam94 5:98845ccaaacd 93 case 1:
liam94 5:98845ccaaacd 94 switch(d) {
liam94 8:7e48229d678c 95 case N:
liam94 5:98845ccaaacd 96 select = 0;
liam94 8:7e48229d678c 97 // printf("UP");
liam94 5:98845ccaaacd 98 break;
liam94 8:7e48229d678c 99 case S:
liam94 5:98845ccaaacd 100 select = 0;
liam94 8:7e48229d678c 101 // printf("Down");
liam94 5:98845ccaaacd 102 break;
liam94 5:98845ccaaacd 103 }
liam94 5:98845ccaaacd 104 break;
liam94 5:98845ccaaacd 105
liam94 5:98845ccaaacd 106 }
liam94 5:98845ccaaacd 107 wait(0.1);
liam94 5:98845ccaaacd 108 if (select == 0) {
liam94 8:7e48229d678c 109 // printf("main menu - sense object");
liam94 5:98845ccaaacd 110 lcd.clear();
liam94 5:98845ccaaacd 111 lcd.printString("Detect",27,0);
liam94 5:98845ccaaacd 112 lcd.printString("Sense Object",7,2);
liam94 5:98845ccaaacd 113 lcd.printString("Calibration",7,3);
liam94 5:98845ccaaacd 114 lcd.drawCircle(3,19,2,FILL_TRANSPARENT);
liam94 5:98845ccaaacd 115 lcd.refresh();
liam94 5:98845ccaaacd 116 wait(0.15);
liam94 5:98845ccaaacd 117 if (Start_flag == 1) {
liam94 5:98845ccaaacd 118 Start_flag = 0;
liam94 5:98845ccaaacd 119 sense_object();
liam94 5:98845ccaaacd 120 }
liam94 5:98845ccaaacd 121 } else if (select == 1) {
liam94 8:7e48229d678c 122 // printf("main menu - calibration");
liam94 5:98845ccaaacd 123 lcd.clear();
liam94 5:98845ccaaacd 124 lcd.printString("Detect",27,0);
liam94 5:98845ccaaacd 125 lcd.printString("Sense Object", 7,2);
liam94 5:98845ccaaacd 126 lcd.printString("Calibration",7,3);
liam94 5:98845ccaaacd 127 lcd.drawCircle(3,27,2,FILL_TRANSPARENT);
liam94 5:98845ccaaacd 128 lcd.refresh();
liam94 5:98845ccaaacd 129 wait(0.15);
liam94 5:98845ccaaacd 130 if (Start_flag == 1) {
liam94 5:98845ccaaacd 131 Start_flag = 0;
liam94 6:18a4dd77057e 132 calibrate_object();
liam94 5:98845ccaaacd 133 }
liam94 5:98845ccaaacd 134 }
liam94 5:98845ccaaacd 135 }
liam94 5:98845ccaaacd 136 }
liam94 5:98845ccaaacd 137
liam94 8:7e48229d678c 138 /***************************************************************************//**
liam94 8:7e48229d678c 139 *
liam94 8:7e48229d678c 140 * this function is for sensing the object
liam94 8:7e48229d678c 141 *
liam94 8:7e48229d678c 142 *******************************************************************************/
liam94 8:7e48229d678c 143
liam94 5:98845ccaaacd 144 void sense_object(){
liam94 8:7e48229d678c 145
liam94 8:7e48229d678c 146 // printf("sense object");
liam94 5:98845ccaaacd 147
liam94 5:98845ccaaacd 148 // set inital state
liam94 5:98845ccaaacd 149 int state = 0;
liam94 5:98845ccaaacd 150
liam94 2:3ace5b4ae9a7 151 while(1)
liam94 2:3ace5b4ae9a7 152 {
liam94 4:77500a7f951d 153 output = fsm[state]; // output current state
liam94 8:7e48229d678c 154 // printf("state = %d\r\n",state);
liam94 8:7e48229d678c 155
liam94 8:7e48229d678c 156 // check which state we are in and see which the next state should be
liam94 4:77500a7f951d 157 switch(state) {
liam94 4:77500a7f951d 158 case 0:
liam94 4:77500a7f951d 159 lcd.clear();
liam94 4:77500a7f951d 160 lcd.printString(" object at 0'",0,0);
liam94 4:77500a7f951d 161 lcd.printString(" R + 60'",0,2);
liam94 4:77500a7f951d 162 lcd.printString(" L - 60'",0,4);
liam94 4:77500a7f951d 163 lcd.refresh();
liam94 3:0b0fbddb6f51 164 if (R == 1){
liam94 3:0b0fbddb6f51 165 state = 1;}
liam94 3:0b0fbddb6f51 166 else if (L == 1){
liam94 3:0b0fbddb6f51 167 state = 5;}
liam94 3:0b0fbddb6f51 168 else state = 0;
liam94 2:3ace5b4ae9a7 169 break;
liam94 4:77500a7f951d 170 case 1:
liam94 4:77500a7f951d 171 lcd.clear();
liam94 4:77500a7f951d 172 lcd.printString(" object at 60'",0,0);
liam94 4:77500a7f951d 173 lcd.printString(" R + 60'",0,2);
liam94 4:77500a7f951d 174 lcd.printString(" L - 60'",0,4);
liam94 4:77500a7f951d 175 lcd.refresh();
liam94 3:0b0fbddb6f51 176 if (R == 1){
liam94 3:0b0fbddb6f51 177 state = 2;}
liam94 3:0b0fbddb6f51 178 else if (L == 1){
liam94 3:0b0fbddb6f51 179 state = 0;}
liam94 3:0b0fbddb6f51 180 else state = 1;
liam94 2:3ace5b4ae9a7 181 break;
liam94 4:77500a7f951d 182 case 2:
liam94 4:77500a7f951d 183 lcd.clear();
liam94 4:77500a7f951d 184 lcd.printString(" object at 120'",0,0);
liam94 4:77500a7f951d 185 lcd.printString(" R + 60'",0,2);
liam94 4:77500a7f951d 186 lcd.printString(" L - 60'",0,4);
liam94 4:77500a7f951d 187 lcd.refresh();
liam94 3:0b0fbddb6f51 188 if (R == 1){
liam94 3:0b0fbddb6f51 189 state = 3;}
liam94 3:0b0fbddb6f51 190 else if (L == 1){
liam94 3:0b0fbddb6f51 191 state = 1;}
liam94 3:0b0fbddb6f51 192 else state = 2;
liam94 2:3ace5b4ae9a7 193 break;
liam94 4:77500a7f951d 194 case 3:
liam94 4:77500a7f951d 195 lcd.clear();
liam94 4:77500a7f951d 196 lcd.printString(" object at 180'",0,0);
liam94 4:77500a7f951d 197 lcd.printString(" R + 60'",0,2);
liam94 4:77500a7f951d 198 lcd.printString(" L - 60'",0,4);
liam94 4:77500a7f951d 199 lcd.refresh();
liam94 3:0b0fbddb6f51 200 if (R == 1){
liam94 3:0b0fbddb6f51 201 state = 4;}
liam94 3:0b0fbddb6f51 202 else if (L == 1){
liam94 3:0b0fbddb6f51 203 state = 2;}
liam94 3:0b0fbddb6f51 204 else state = 3;
liam94 2:3ace5b4ae9a7 205 break;
liam94 4:77500a7f951d 206 case 4:
liam94 4:77500a7f951d 207 lcd.clear();
liam94 4:77500a7f951d 208 lcd.printString(" object at 240'",0,0);
liam94 4:77500a7f951d 209 lcd.printString(" R + 60'",0,2);
liam94 4:77500a7f951d 210 lcd.printString(" L - 60'",0,4);
liam94 4:77500a7f951d 211 lcd.refresh();
liam94 3:0b0fbddb6f51 212 if (R == 1){
liam94 3:0b0fbddb6f51 213 state = 5;}
liam94 3:0b0fbddb6f51 214 else if (L == 1){
liam94 3:0b0fbddb6f51 215 state = 3;}
liam94 3:0b0fbddb6f51 216 else state = 4;
liam94 2:3ace5b4ae9a7 217 break;
liam94 4:77500a7f951d 218 case 5:
liam94 4:77500a7f951d 219 lcd.clear();
liam94 4:77500a7f951d 220 lcd.printString(" object at 300'",0,0);
liam94 4:77500a7f951d 221 lcd.printString(" R + 60'",0,2);
liam94 4:77500a7f951d 222 lcd.printString(" L - 60'",0,4);
liam94 4:77500a7f951d 223 lcd.refresh();
liam94 3:0b0fbddb6f51 224 if (R == 1){
liam94 3:0b0fbddb6f51 225 state = 0;}
liam94 3:0b0fbddb6f51 226 else if (L == 1){
liam94 3:0b0fbddb6f51 227 state = 4;}
liam94 3:0b0fbddb6f51 228 else state = 5;
liam94 2:3ace5b4ae9a7 229 break;
liam94 2:3ace5b4ae9a7 230 default:
liam94 2:3ace5b4ae9a7 231 error("Invalid state"); //invalid state - call error routine
liam94 2:3ace5b4ae9a7 232 // or could jump to starting state i.e. state = 0
liam94 2:3ace5b4ae9a7 233 break;
liam94 2:3ace5b4ae9a7 234 }
liam94 6:18a4dd77057e 235 if (Back_flag == 1) {
liam94 6:18a4dd77057e 236 Back_flag = 0;
liam94 6:18a4dd77057e 237 main_menu();}
liam94 6:18a4dd77057e 238
liam94 5:98845ccaaacd 239 ThisThread::sleep_for(200);
liam94 5:98845ccaaacd 240 }
liam94 5:98845ccaaacd 241 }
liam94 8:7e48229d678c 242
liam94 8:7e48229d678c 243 /***************************************************************************//**
liam94 8:7e48229d678c 244 *
liam94 8:7e48229d678c 245 * this function is for calibrating the distance in which the object centre point
liam94 8:7e48229d678c 246 * should be away from the sensor, it checks the current distance and then though
liam94 8:7e48229d678c 247 * the function "void dist" displays the current distance on the screen.
liam94 8:7e48229d678c 248 * this function also tells the user the distance away from the target centre
liam94 8:7e48229d678c 249 * point this should be, this is so that the board is the right distance away and
liam94 8:7e48229d678c 250 * will be able to detect the object better.
liam94 8:7e48229d678c 251 *
liam94 8:7e48229d678c 252 * in order to print the distance onto the LCD the current distance is printed to
liam94 8:7e48229d678c 253 * a buffer which is a max length of 14 (the amount of characters that can fit
liam94 8:7e48229d678c 254 * width ways on the screen) this can then be printed on the screen using print
liam94 8:7e48229d678c 255 * string.
liam94 8:7e48229d678c 256 *
liam94 8:7e48229d678c 257 *******************************************************************************/
liam94 8:7e48229d678c 258
liam94 6:18a4dd77057e 259 void calibrate_object(){
liam94 6:18a4dd77057e 260
liam94 6:18a4dd77057e 261 while(1)
liam94 6:18a4dd77057e 262 {
liam94 8:7e48229d678c 263 mu.checkDistance();
liam94 7:7464fbb0f3e1 264
liam94 6:18a4dd77057e 265 if (Back_flag == 1) {
liam94 6:18a4dd77057e 266 Back_flag = 0;
liam94 6:18a4dd77057e 267 main_menu();}
liam94 6:18a4dd77057e 268
liam94 6:18a4dd77057e 269 wait (1);
liam94 6:18a4dd77057e 270 }
liam94 6:18a4dd77057e 271 }
liam94 6:18a4dd77057e 272
liam94 7:7464fbb0f3e1 273 void dist(int distance)
liam94 7:7464fbb0f3e1 274
liam94 7:7464fbb0f3e1 275 {
liam94 8:7e48229d678c 276 // printf("Distance changed to %dmm\r\n", distance);
liam94 7:7464fbb0f3e1 277
liam94 7:7464fbb0f3e1 278 lcd.clear();
liam94 7:7464fbb0f3e1 279
liam94 8:7e48229d678c 280 char buffer[14];
liam94 8:7e48229d678c 281 int length = sprintf(buffer,"%dmm", distance);
liam94 8:7e48229d678c 282 if (length <= 14)
liam94 7:7464fbb0f3e1 283
liam94 8:7e48229d678c 284 lcd.printString("set object to",0,0);
liam94 8:7e48229d678c 285 lcd.printString(" 1000mm",0,1);
liam94 8:7e48229d678c 286 lcd.printString( buffer,0,3);
liam94 8:7e48229d678c 287 lcd.refresh();
liam94 7:7464fbb0f3e1 288 }
liam94 8:7e48229d678c 289
liam94 8:7e48229d678c 290 /***************************************************************************//**
liam94 8:7e48229d678c 291 *
liam94 8:7e48229d678c 292 * these functions are for setting the flags for the start and back butons which
liam94 8:7e48229d678c 293 * are used in the other functions.
liam94 8:7e48229d678c 294 *
liam94 8:7e48229d678c 295 *******************************************************************************/
liam94 8:7e48229d678c 296
liam94 5:98845ccaaacd 297 void Start_isr()
liam94 5:98845ccaaacd 298 {
liam94 8:7e48229d678c 299 // printf("start button pressed");
liam94 5:98845ccaaacd 300 Start_flag = 1;
liam94 2:3ace5b4ae9a7 301 }
liam94 2:3ace5b4ae9a7 302
liam94 5:98845ccaaacd 303 void Back_isr()
liam94 5:98845ccaaacd 304 {
liam94 8:7e48229d678c 305 // printf("back button pressed");
liam94 5:98845ccaaacd 306 Back_flag = 1;
liam94 1:a1795335ef8c 307 }
liam94 5:98845ccaaacd 308