For all the state machines to run independently, they each need to get a chance to do their stuff each time loop() runs. But you seem to have commented out two of them here.
if (val_s1 == LOW) {
With buttons, you probably want to check that the button itself has changed from HIGH to LOW (or vice versa) since it was last checked, not that it is simply LOW at the time it was checked. See the "state change" example sketch. HIGH and LOW are states of the button. Changes between HIGH and LOW are events, and it's those events you need to drive your state machines.
You can often simplify things somewhat by using a simple delay(20) for debouncing buttons. A 20ms delay won't be noticed by the user so won't cause blocking as such. Only use the delay(20) when you detect that a button has changed state since it was last checked. Don't use delay(20) just because the button is LOW at the moment you check it, because the button might be LOW for an unknown length of time resulting in many delay(20), which is not wanted.
Beginners often get confused between 'states' and 'events' when making their first state machines. A 'state' is something the state machine spends some time in, waiting for a time to pass or an event to happen. An 'event' is a change or external action that happens instantaneously and may cause the machine to change state. In the above, 'WAIT' (state 1) is indeed a state. The machine remains in that state until the button is pressed. But 'ARMING' (state 2) is not really a state because the machine moves immediately and unconditionally on to another state, it doesn't wait for any event before doing that. So state 2 can be removed:
case 1: //WAIT
//wait for the switch to go low
if (val_s1 == LOW && prev_val_s1 == HIGH) {
delay(20); // ignore any button bounce
//Record the time and proceed to ARMED
t_0_s1 = millis();
state_s1 = 3;
}
break;
case 3: //ARMED
//Check to see if the proper delay has passed. If a bounce occurs then RESET
t_s1 = millis();
if (t_s1 - t_0_s1 > bounce_delay_s1) {state_s1 = 4;}
if (val_s1 == HIGH) {state_s1 = 0;}
break;
I would suggest simplifying your state machines by using a simple delay(20) for debouncing and removing any 'states' that can be removed because they immediately and unconditionally change to some other state.
