#include <LiquidCrystal.h>
#include <mechButton.h>
#include <timeObj.h>
// Display
int rs=7;
int en=8;
int d4=9;
int d5=10;
int d6=11;
int d7=12;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);
// LED
const int redled= 2 ;
const int greenled=3 ;
//button
mechButton theBtn(6);
// timer
timeObj holdTimer(2000);
//Other
unsigned long startTime;
unsigned long endTime;
unsigned long best;
enum states { waiting, preHolding, holding, timing, results, postResult };
states ourState;
void setup() {
//Serial.begin(9600);
best = 999999;
pinMode(greenled,OUTPUT);
pinMode(redled,OUTPUT);
theBtn.setCallback(btnClick);
lcd.begin(16,2);
setState(waiting);
}
void btnClick(void) {
if (!theBtn.getState()) { // Button pressed.
switch(ourState) { // What's going on?
case waiting : // wants to start, but..
setState(preHolding); // Start pre-holding.
break; //
case preHolding : break; //
case holding : // NO Cheating!
holdTimer.start(); // Restart the holding timer.
break; //
case timing : // OMG! Time's up!
endTime = millis(); // read it.
break; //
case results : // Done with results.
setState(postResult); // Go back to postResult. wit for lift.
break; //
case postResult : break; //
} //
} else { // Button released.
switch(ourState) {
case waiting : break; //
case preHolding : // Just waiting for the lift.
setState(holding); // The list allows it.
break; //
case holding : break; //
case timing :
setState(results); // Go to results.
break; //
case results : break; //
case postResult : // Got a lift?
setState(waiting); // Go to waiting.
break; //
} //
} //
}
void setState(states newState) {
unsigned long result;
switch (newState) {
case waiting :
digitalWrite(greenled,LOW);
digitalWrite(redled,LOW);
lcd.clear() ;
lcd.setCursor(0,0);
lcd.print(lcd.print(" Press to begin "));
ourState = waiting;
break;
case preHolding :
ourState = preHolding;
break;
case holding :
digitalWrite(redled,HIGH);
lcd.clear() ;
lcd.setCursor(0,0) ;
lcd.print("Wait for the") ;
lcd.setCursor(0,1) ;
lcd.print("green light") ;
holdTimer.start();
ourState = holding;
break;
case timing :
digitalWrite(greenled,HIGH);
startTime = millis();
digitalWrite(redled,LOW);
ourState = timing;
break;
case results :
digitalWrite(greenled,LOW);
digitalWrite(redled,LOW);
result = endTime - startTime;
if (result<best) {
best = result;
}
lcd.clear() ;
lcd.print("Result ");
lcd.print(result);
lcd.print(" ms.");
lcd.setCursor(0,1);
lcd.print("Best ");
lcd.print(best);
lcd.print(" ms.");
ourState = results;
break;
case postResult :
ourState = postResult;
break;
}
}
void loop() {
idle();
switch(ourState) {
case waiting : break;
case holding :
if (holdTimer.ding()) {
holdTimer.reset();
setState(timing);
}
break;
case timing : break;
case results : break;
}
}