Secuenciado seguro de electroválvulas en un PLC ESP32 con una máquina de estados
Una sola función es dueña de las salidas
setMotion() es el único lugar de todo el firmware donde se escriben las salidas de las válvulas general, de carga y de descarga. Los botones, los comandos BLE y los timeouts de seguridad solicitan un estado en lugar de tocar los pines directamente, y cada estado escribe las cinco salidas en un solo bloque. Esto hace que la tabla de verdad de las válvulas sea revisable de un vistazo y convierte el "¿por qué se abrieron las dos válvulas a la vez?" de pesadilla de depuración en pregunta imposible.Botones físicos y control remoto conviven
[M]1*, [M]2* y [M]0* enviadas desde una app de smartphone. Como ambas vías de entrada convergen en la misma máquina de estados, el control remoto y el local nunca pueden discrepar sobre lo que están haciendo las válvulas — y el pulsador físico de paro funciona siempre, incluso con la app conectada.Timeouts como red de seguridad
Un fragmento de la implementación
Tal cual del ejemplo desplegado en el ESP32 PLC 38R — cópialo libremente:
void setup() {
Serial.begin(115200);
pinMode(BTN_LOAD, INPUT);
pinMode(BTN_UNLOAD, INPUT);
pinMode(BTN_STOP, INPUT);
pinMode(OUTPUT_EVG, OUTPUT);
pinMode(OUTPUT_EVD, OUTPUT);
pinMode(OUTPUT_EVC, OUTPUT);
pinMode(LED_LOAD, OUTPUT);
pinMode(LED_UNLOAD, OUTPUT);
setMotion(MOTION_NONE); // always start in safe idle
Serial.println("Solenoid valve control ready (ESP32 PLC 38R)");
}El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.
Preguntas frecuentes
¿Puede el ESP32 PLC 38R accionar electroválvulas directamente?
Sí, sus salidas de relé conmutan directamente las bobinas típicas de electroválvulas hidráulicas de 12/24 V DC. Comprueba la corriente de la bobina frente al valor nominal del relé y añade supresión flyback para cargas inductivas si no viene ya montada.
¿Por qué usar una máquina de estados en lugar de conmutar las salidas directamente?
Porque cada combinación de salidas se vuelve explícita y revisable. Conmutando directamente, dos caminos del código pueden discrepar y dejar abiertas válvulas en conflicto; con una máquina de estados, las combinaciones ilegales son inalcanzables por construcción.
¿Cómo añado un movimiento nuevo, como un modo de velocidad lenta?
Añade un nuevo valor al enum y un case en setMotion() que defina su combinación exacta de válvulas. No hay que cambiar nada más — los botones o los comandos BLE simplemente solicitan el nuevo estado.