mostly working
This commit is contained in:
parent
d239e9ce34
commit
2640265397
65
src/main.cpp
65
src/main.cpp
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue