mostly working

This commit is contained in:
Jeff Clement 2016-02-11 19:12:45 -07:00
parent d239e9ce34
commit 2640265397
1 changed files with 41 additions and 24 deletions

View File

@ -17,13 +17,20 @@ elapsedMillis timeElapsed;
#define PIN_CAR1 3
typedef struct {
// input pin for this car
short pin;
// elapsed time for pin (0 means not finished)
unsigned int elapsedTime;
} CarTimer;
} Car;
// assume all cars are on sequential digital pins
#define PIN_CAR_STARTING 3
// number of cars (4 max)
#define CAR_COUNT 1
CarTimer cars[CAR_COUNT];
// array of cars
Car cars[CAR_COUNT];
// buffer for the LCD line
char buffer[40];
@ -42,11 +49,12 @@ void setup()
pinMode(cars[i].pin, INPUT_PULLUP);
}
// initialize LCD
lcd.begin(20, 4);
lcd.backlight();
}
void resetCarTimers() {
void resetCars() {
for(short i=0; i<CAR_COUNT; i++) {
cars[i].elapsedTime = 0;
}
@ -56,16 +64,19 @@ void displayTimers() {
lcd.clear();
for(short i=0; i<CAR_COUNT; i++) {
lcd.setCursor(0,i);
sprintf(buffer, "Car %d: %dms", i+1, cars[i].elapsedTime);
if (cars[i].elapsedTime == 0) {
sprintf(buffer, "Car %d: didn't finish", i+1);
} else {
sprintf(buffer, "Car %d: %dms", i+1, cars[i].elapsedTime);
}
lcd.print(buffer);
}
}
#define MAX_TIME 10000
unsigned int startTime; // start time in ms
unsigned int elapsedTime;
bool started = false;
bool allDone;
#define STATE_READY 1
#define STATE_RUNNING 2
@ -81,33 +92,39 @@ void loop()
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Ready?");
started = false;
resetCarTimers();
resetCars();
digitalWrite(LED_BUILTIN, LOW);
}
} else {
// if we just started, record current millis counter
if (!started) {
if (state == STATE_READY) {
state = STATE_RUNNING;
lcd.setCursor(0,0);
lcd.print("Running!");
startTime = timeElapsed;
started = true;
}
if (state == STATE_RUNNING) {
// calculate elapsed time in ms
elapsedTime = timeElapsed - startTime;
// calculate elapsed time in ms
elapsedTime = timeElapsed - startTime;
allDone = true;
for(short i = 0; i<CAR_COUNT; i++) {
if (cars[0].elapsedTime == 0) {
if (digitalRead(cars[i].pin) == LOW) {
cars[i].elapsedTime = elapsedTime;
} else {
allDone = false;
bool allDone = true;
for(short i = 0; i<CAR_COUNT; i++) {
if (cars[0].elapsedTime == 0) {
if (digitalRead(cars[i].pin) == LOW) {
// car finished, record time
cars[i].elapsedTime = elapsedTime;
} else {
allDone = false;
}
}
}
}
if (allDone) {
displayTimers();
// stop race if all cars are done or MAX TIME exceeded
if (allDone || elapsedTime > MAX_TIME) {
state = STATE_DONE;
displayTimers();
}
}
}