simplified logic
This commit is contained in:
parent
982d0fcf99
commit
f8e800224d
90
src/main.cpp
90
src/main.cpp
|
@ -18,39 +18,23 @@ LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
|
|||
#define PIN_LED LED_BUILTIN
|
||||
#define DISPLAY_LINES 4
|
||||
|
||||
typedef struct {
|
||||
// input pin for this car
|
||||
short pin;
|
||||
// elapsed time for pin (0 means not finished)
|
||||
unsigned int elapsedTime;
|
||||
// placing
|
||||
unsigned int place;
|
||||
} Car;
|
||||
|
||||
// assume all cars are on sequential digital pins
|
||||
#define PIN_CAR_STARTING 3
|
||||
|
||||
// number of cars (4 max)
|
||||
#define CAR_COUNT 4
|
||||
|
||||
// array of cars
|
||||
Car cars[CAR_COUNT];
|
||||
|
||||
// buffer for the LCD line
|
||||
char buffer[40];
|
||||
|
||||
void setup()
|
||||
{
|
||||
|
||||
Serial.begin(9600);
|
||||
|
||||
pinMode(PIN_RESET, INPUT_PULLUP);
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
pinMode(PIN_LED, OUTPUT);
|
||||
|
||||
// initialize each car PIN
|
||||
for(short i=0; i<CAR_COUNT; i++) {
|
||||
cars[i].pin = PIN_CAR_STARTING + i;
|
||||
pinMode(cars[i].pin, INPUT_PULLUP);
|
||||
pinMode(PIN_CAR_STARTING + i, INPUT_PULLUP);
|
||||
}
|
||||
|
||||
// initialize LCD
|
||||
|
@ -62,52 +46,26 @@ void setup()
|
|||
lcd.print("Kub Kar Timer");
|
||||
}
|
||||
|
||||
void resetCars() {
|
||||
for(short i=0; i<CAR_COUNT; i++) {
|
||||
cars[i].elapsedTime = 0;
|
||||
cars[i].place = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void displayTimers() {
|
||||
short row = 0;
|
||||
lcd.clear();
|
||||
|
||||
for(unsigned short place=1; place<=min(CAR_COUNT, DISPLAY_LINES); place++) {
|
||||
for (int i=0; i<CAR_COUNT; i++) {
|
||||
if (cars[i].place == place) {
|
||||
// only print the score if this car finished
|
||||
lcd.setCursor(0,place-1);
|
||||
sprintf(buffer, "%d%s: CAR%d @ %0.2fs", place, place==1?"st":(place==2?"nd":(place==3?"rd":"th")) , i+1, cars[i].elapsedTime/1000.0);
|
||||
lcd.print(buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define MAX_TIME 5000
|
||||
|
||||
unsigned long startTime; // start time in ms
|
||||
#define MAX_TIME 15000
|
||||
|
||||
#define STATE_READY 1
|
||||
#define STATE_RUNNING 2
|
||||
#define STATE_DONE 3
|
||||
|
||||
unsigned long startTime; // start time in ms
|
||||
unsigned short state = 0;
|
||||
unsigned short place = 0;
|
||||
bool finished[CAR_COUNT];
|
||||
|
||||
void loop()
|
||||
{
|
||||
|
||||
if (digitalRead(PIN_RESET) == LOW) {
|
||||
if (state != STATE_READY) {
|
||||
digitalWrite(PIN_LED, HIGH);
|
||||
state = STATE_READY;
|
||||
lcd.clear();
|
||||
lcd.setCursor(0,0);
|
||||
lcd.print("Ready...");
|
||||
place = 0;
|
||||
resetCars();
|
||||
digitalWrite(PIN_LED, HIGH);
|
||||
}
|
||||
} else {
|
||||
if (state == STATE_READY) {
|
||||
|
@ -116,39 +74,25 @@ void loop()
|
|||
lcd.setCursor(0,0);
|
||||
lcd.print("Running!");
|
||||
startTime = millis();
|
||||
for(int i=0; i<CAR_COUNT; i++) {
|
||||
finished[i] = false;
|
||||
}
|
||||
place = 0;
|
||||
}
|
||||
if (state == STATE_RUNNING) {
|
||||
|
||||
// calculate elapsed time in ms
|
||||
unsigned long elapsedTime = millis() - startTime;
|
||||
|
||||
bool allDone = true;
|
||||
for(short i = 0; i<CAR_COUNT; i++) {
|
||||
if (cars[i].elapsedTime == 0) {
|
||||
if (digitalRead(cars[i].pin) == LOW) {
|
||||
place++;
|
||||
// car finished, record time
|
||||
cars[i].elapsedTime = elapsedTime;
|
||||
cars[i].place = place;
|
||||
if (place < DISPLAY_LINES) {
|
||||
lcd.setCursor(0,place-1);
|
||||
sprintf(buffer, "%d%s: CAR%d @ %0.2fs", place, place==1?"st":(place==2?"nd":(place==3?"rd":"th")) , i+1, cars[i].elapsedTime/1000.0);
|
||||
lcd.print(buffer);
|
||||
}
|
||||
} else {
|
||||
allDone = false;
|
||||
if (!finished[i] && digitalRead(PIN_CAR_STARTING + i) == LOW) {
|
||||
place++;
|
||||
finished[i] = true;
|
||||
if (place <= DISPLAY_LINES) {
|
||||
lcd.setCursor(0,place-1);
|
||||
sprintf(buffer, "%d%s: CAR%d @ %0.2fs", place, place==1?"st":(place==2?"nd":(place==3?"rd":"th")) , i+1, elapsedTime/1000.0);
|
||||
lcd.print(buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 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