Bueno no se porque te haces problema pero intentaré responderte.
Dices:
Básicamente no tengo idea de como puedo "restringir el paso" de un estado a otro ya que para el trabajo que estoy haciendo es necesario entrar en un estado o encontrarse en un estado, realizar una acción y luego de realizada poder pasar al siguiente.
Exactamente asi se pasa de estado. Un evento es el que te hace pasar de estado y si no se cumple, entonces permaneces en ese estado.
Imagina una variable estado del tipo byte. porque solo puede tener 4 estados, digamos de 1 a 4.
// variables globales definidas
byte estado = 1;
unsigned long start;
// supongamos que en el loop tienes esta máquina de estados
switch (estado) {
case 1: // estado 1
// hago algo y paso al estado 2
estado = 2;
break;
case 2: // estado 2
float presion = analogRead(A0)*20.0; // Medido en Kg 20 es una constante que da el valor en Kg
if (presion > 50.0) {
estado = 3;
start = millis();
}
break;
case 3: // estado 3
if (millis() - start > 20000UL) {
estado = 4;
}
break;
case 4: // estado 4
estado = 1
break;
}
Una breve explicación.
Estado 1 es casi como una inicialización de la máquina. Supongamos que haces algo y rápidament pasas a un estado = 2 en el que permaneces
El sistema mide con un sensor la presion a través del pin A0.
El valor mientras sea menor a 50.0 Kg permanece en el estado 2 pero si es superado o sea cuando valga 50.1 entonces se dan 2 cosas.
Se inicializa start con el valor de millis() y estado toma el valor 3 o sea paso al siguiente estado.
En 3 permanezco durante 20 segundos o sea 20.000 mseg y cuando eso ocurra paso al estado 4 que básicamente reinicia la máquina de estados.
Es muy simple y tal vez te ayude a visualizar como trabajar con una máquina de estados.
Puedes incluso saltar estados y hacer cambios cualesquiera, pero se debe ser prolijo.