My project is a Jeopardy style table that has 4 switches. When one switch is pressed, it lights up its corresponding light and disables the other switches for 5 seconds, after which it returns back to a waiting state. Here is the code:
//Pressing 1 switch blocks the others and lights up a light through a relay for 5 seconds
//4 switches and 4 corresponding relays
// These are constant because it makes the code run faster on the microcontroller. The compiler more or less does this.
const byte switchA = 2;
const byte switchB = 3;
const byte switchC = 4;
const byte switchD = 5;
const byte relayA = 6;
const byte relayB = 7;
const byte relayC = 8;
const byte relayD = 9;
// enumerated states so that things don't die immediately...
enum state_t { A = 1, B = 2, C = 3, D = 4, Wait = 5 };
void setup(){
pinMode (switchA, INPUT_PULLUP);
pinMode (switchB, INPUT_PULLUP);
pinMode (switchC, INPUT_PULLUP);
pinMode (switchD, INPUT_PULLUP);
pinMode (relayA, OUTPUT);
pinMode (relayB, OUTPUT);
pinMode (relayC, OUTPUT);
pinMode (relayD, OUTPUT);
}
void loop() {
static state_t state = Wait;
// Variables with static are initialized the first time a function runs.
// These are non-global so that CS professors won't complain.
switch(state) {
case A:
digitalWrite(relayA,HIGH);
digitalWrite(relayB,LOW);
digitalWrite(relayC,LOW);
digitalWrite(relayD,LOW);
delay(5000);
digitalWrite(relayA,LOW);
state = Wait;
break;
case B:
digitalWrite(relayA,LOW);
digitalWrite(relayB,HIGH);
digitalWrite(relayC,LOW);
digitalWrite(relayD,LOW);
delay(5000);
digitalWrite(relayB,LOW);
state = Wait;
break;
case C:
digitalWrite(relayA,LOW);
digitalWrite(relayB,LOW);
digitalWrite(relayC,HIGH);
digitalWrite(relayD,LOW);
delay(5000);
digitalWrite(relayC,LOW);
state = Wait;
break;
case D:
digitalWrite(relayA,LOW);
digitalWrite(relayB,LOW);
digitalWrite(relayC,LOW);
digitalWrite(relayD,HIGH);
delay(5000);
digitalWrite(relayD,LOW);
state = Wait;
break;
case Wait:
if (!digitalRead(switchA)) {
state = A;
} else if (!digitalRead(switchB)) {
state = B;
} else if (!digitalRead(switchC)) {
state = C;
} else if (!digitalRead(switchD)) {
state = D;
} else {
state = Wait;
}
break;
default:
state = Wait;
break;
}
}
My friend helped me program it as a FSM but when I tested it the relay for case A immediately activated when power was applied. It may be a hardware issue but can anybody see any issues with the programming itself? Thank you.