Scalextric Lap Timer using ultrasonic sensor

Dependencies:   HCSR04 mbed TextLCD

Committer:
MrBedfordVan
Date:
Wed Sep 28 16:05:35 2016 +0000
Revision:
1:034f79c00c98
Parent:
0:b88af2ed370b
Child:
2:b47f8dbf374c
Initial Version of simple Scalextric Lap Timer for Ada Lovelace day

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MrBedfordVan 1:034f79c00c98 1 // Scalextric Timer for Ada Lovelace Day
MrBedfordVan 1:034f79c00c98 2 //
MrBedfordVan 1:034f79c00c98 3 // Uses Nucleo board F072 with LCD Keypad shield
MrBedfordVan 1:034f79c00c98 4 // Connect D3 to Trig & D2 to Echo
MrBedfordVan 1:034f79c00c98 5 // Connect VCC to 5V (pin CN7 18)
MrBedfordVan 1:034f79c00c98 6 // Connect GND to 0V (pin CN7 19)
MrBedfordVan 1:034f79c00c98 7
MrBedfordVan 0:b88af2ed370b 8 #include "mbed.h"
MrBedfordVan 1:034f79c00c98 9 #include "hcsr04.h" // Ultrasonic sensor
MrBedfordVan 1:034f79c00c98 10 #include "TextLCD.h" // LCD1602
MrBedfordVan 0:b88af2ed370b 11
MrBedfordVan 1:034f79c00c98 12 // serial PC for debug
MrBedfordVan 0:b88af2ed370b 13 Serial pc(SERIAL_TX, SERIAL_RX);
MrBedfordVan 1:034f79c00c98 14 // Ultrasonic sensor
MrBedfordVan 1:034f79c00c98 15 HCSR04 usensor(D3,D2); // Trig, Echo
MrBedfordVan 1:034f79c00c98 16
MrBedfordVan 1:034f79c00c98 17 // LCD Shield
MrBedfordVan 1:034f79c00c98 18 TextLCD lcd(D8, D9, D4, D5, D6, D7); // used to drive display
MrBedfordVan 1:034f79c00c98 19 AnalogIn keys(A0); // used to sample buttons
MrBedfordVan 1:034f79c00c98 20
MrBedfordVan 1:034f79c00c98 21 Timer lap_timer;
MrBedfordVan 1:034f79c00c98 22 Timer wait_timer;
MrBedfordVan 1:034f79c00c98 23
MrBedfordVan 1:034f79c00c98 24 // display text on LCD
MrBedfordVan 1:034f79c00c98 25 void textLCD(char *text, int line) {
MrBedfordVan 1:034f79c00c98 26 char tmpBuf[16];
MrBedfordVan 1:034f79c00c98 27 for (int i = 0; i < 16; i++) tmpBuf[i] = 0x20;
MrBedfordVan 1:034f79c00c98 28 for (int i = 0; i < strlen(text); i++) {
MrBedfordVan 1:034f79c00c98 29 if (i < 16) tmpBuf[i] = text[i];
MrBedfordVan 1:034f79c00c98 30 lcd.locate(i, line);
MrBedfordVan 1:034f79c00c98 31 lcd.putc(tmpBuf[i]);
MrBedfordVan 1:034f79c00c98 32 }
MrBedfordVan 1:034f79c00c98 33 }
MrBedfordVan 1:034f79c00c98 34
MrBedfordVan 0:b88af2ed370b 35
MrBedfordVan 0:b88af2ed370b 36 int main()
MrBedfordVan 0:b88af2ed370b 37 {
MrBedfordVan 1:034f79c00c98 38 // Variables used
MrBedfordVan 0:b88af2ed370b 39 int dist = 0;
MrBedfordVan 0:b88af2ed370b 40 float current_time = 0;
MrBedfordVan 1:034f79c00c98 41 int lap_count = 0;
MrBedfordVan 0:b88af2ed370b 42 float wait_time = 2.0;
MrBedfordVan 0:b88af2ed370b 43 pc.baud(9600);
MrBedfordVan 1:034f79c00c98 44 char lap_string[16];
MrBedfordVan 1:034f79c00c98 45 char laptime_string[16];
MrBedfordVan 0:b88af2ed370b 46
MrBedfordVan 1:034f79c00c98 47 // Values to tune
MrBedfordVan 1:034f79c00c98 48 float min_laptime = 1.0; // Minimum laptime - time to wait after seeing car before measuring again in seconds
MrBedfordVan 1:034f79c00c98 49 int sample_time = 100; // Sample time - time between sampling value from sensor in milliseconds
MrBedfordVan 1:034f79c00c98 50 int trigger_distance = 4; // Trigger distance - distance below which the car registers as detected
MrBedfordVan 0:b88af2ed370b 51
MrBedfordVan 1:034f79c00c98 52 // Intro Screen
MrBedfordVan 0:b88af2ed370b 53 pc.printf("ARM Sheffield Scalextric Challenge \n");
MrBedfordVan 1:034f79c00c98 54 textLCD("ARM Scalextric ", 0);
MrBedfordVan 1:034f79c00c98 55
MrBedfordVan 1:034f79c00c98 56 // Main loop
MrBedfordVan 1:034f79c00c98 57 while(1) {
MrBedfordVan 0:b88af2ed370b 58 usensor.start();
MrBedfordVan 0:b88af2ed370b 59 wait_ms(sample_time);
MrBedfordVan 0:b88af2ed370b 60 dist=usensor.get_dist_cm();
MrBedfordVan 1:034f79c00c98 61 pc.printf("Distance %d\n\r", dist); // Debug to Serial port/USB
MrBedfordVan 0:b88af2ed370b 62 if (lap_count > 0) {
MrBedfordVan 1:034f79c00c98 63 wait_time = wait_timer.read();
MrBedfordVan 0:b88af2ed370b 64 }
MrBedfordVan 1:034f79c00c98 65 if ((dist < trigger_distance) and (wait_time > min_laptime)) { // spotted car at least a minimum laptime later
MrBedfordVan 1:034f79c00c98 66 wait_timer.reset();
MrBedfordVan 1:034f79c00c98 67 wait_timer.start();
MrBedfordVan 1:034f79c00c98 68 if (lap_count == 0) { // First Lap - start timer
MrBedfordVan 1:034f79c00c98 69 lap_timer.reset();
MrBedfordVan 1:034f79c00c98 70 lap_timer.start();
MrBedfordVan 1:034f79c00c98 71 pc.printf("Timing... \r"); // Debug
MrBedfordVan 1:034f79c00c98 72 textLCD("Timing..........", 1); //
MrBedfordVan 0:b88af2ed370b 73 lap_count++;
MrBedfordVan 1:034f79c00c98 74 } else { // Completed a lap
MrBedfordVan 1:034f79c00c98 75 current_time = lap_timer.read();
MrBedfordVan 1:034f79c00c98 76 lap_timer.reset();
MrBedfordVan 1:034f79c00c98 77 pc.printf("Lap : %d, Lap time : %f s \r", lap_count, current_time);
MrBedfordVan 1:034f79c00c98 78 sprintf(lap_string, "Lap : %d ", (char*)lap_count);
MrBedfordVan 1:034f79c00c98 79 sprintf(laptime_string, "Lap time : %f s, ", current_time);
MrBedfordVan 1:034f79c00c98 80 textLCD(" ", 0);
MrBedfordVan 1:034f79c00c98 81 textLCD(lap_string, 0);
MrBedfordVan 1:034f79c00c98 82 textLCD(" ", 1);
MrBedfordVan 1:034f79c00c98 83 textLCD(laptime_string, 1);
MrBedfordVan 0:b88af2ed370b 84 lap_count++;
MrBedfordVan 0:b88af2ed370b 85 }
MrBedfordVan 1:034f79c00c98 86 }
MrBedfordVan 0:b88af2ed370b 87 }
MrBedfordVan 0:b88af2ed370b 88 }
MrBedfordVan 0:b88af2ed370b 89