#define DEBUG
const int numInputs = 3;
const int inputPins[numInputs] = {4, 3, 2};
const int numSteps = 5;
const int steps[numSteps] = {0, 2, 1, 1, 0};
const int ledPins[numSteps] = {12, 11, 10, 9, 8};
const int lockPin = A0;
bool lastInputState[] = {HIGH, HIGH, HIGH, HIGH};
int currentStep = 0;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
void setup() {
// put your setup code here, to run once:
for(int i=0; i< numInputs; i++){
pinMode(inputPins[i], INPUT_PULLUP);
}
for(int i=0; i< numSteps; i++){
pinMode(ledPins[i], OUTPUT);
}
pinMode(lockPin, OUTPUT);
digitalWrite(lockPin, HIGH);
#ifdef DEBUG
Serial.begin(9600);
Serial.println(F("Serial communication started"));
#endif
}
void loop() {
if ( (millis() - lastDebounceTime) > debounceDelay) {
for(int i=0; i<numInputs; i++){
int currentInputState = digitalRead(inputPins[i]);
if(currentInputState != lastInputState[i]) {
lastDebounceTime = millis();
}
if(currentInputState == LOW && lastInputState[i] == HIGH) {
if(steps[currentStep] == i){
currentStep++;
#ifdef DEBUG
Serial.print(F("Correct input! Onto step #"));
Serial.println(currentStep);
#endif
}
else {
currentStep = 0;
Serial.println(F("Incorrect input! Back to begining!"));
}
}
lastInputState[i] = currentInputState;
}
}
if(currentStep == numSteps) {
onSolve();
}
for(int i=0; i<numSteps; i++){
digitalWrite(ledPins[i], (i< currentStep ? HIGH : LOW));
}
}
void onSolve() {
#ifdef DEBUG
Serial.println(F("Puzzle Solved!"));
#endif
digitalWrite(lockPin, LOW);
while(true){
for(int i=0; i<numSteps; i++){
digitalWrite(ledPins[i], HIGH);
delay(100);
}
delay(100);
for(int i=0; i<numSteps; i++){
digitalWrite(ledPins[i], LOW);
delay(100);
}
}
}