Solucionado PLC I/O-ZONE-583 por Arduino en maquina de estados

INFORME COMPORTAMIENTO CÓDIGO VICTOR

Encendido equipo:

Al iniciar el proceso al energizar digital D7 activa RE57 de inmediato.

Si pinpersianaAbierta 8 se mantiene en 0 volts a los 30 segundos activa relé 5 error.

Si pinpersianaAbierta 8 recibe 12 volts antes de pasar 30/seg activa pinRele34.

Si pinSensorpresion se mantiene en 0 volts pasados 30/seg activa relé 5 error.

Si pinSensorpresion recibe 24 volts antes de transcurridos 30/seg activa relé 28.

Hasta aquí todo bien el proceso funciona y aire caliente circula al área de confort

El primer problema surge al fallar el sensor de presión, que ya no envía 24vdc, y continua encendido relé 28, y eso es grabe tendría que apagar el relé 28, o detener todo el proceso, sin flujo de aire en la cámara de combustión terminaría en un problema grave.

Lo mismo sucede con persiana, si servomotor no envía 12 volts Arduino no apaga ventilador y eso también será catastrófico.

Otro detalle menor es que al encender no da tiempos, puse pinPersianaAbierta y pinSensorPresión en alto al llegar la señal de Remoto se encienden los tres relés al mismo tiempo cosa que en la vida real no sucede

Eso es lo que logrado ver hasta hora, soy muy novata en software, pero en hardware no estoy tan tullida, cuando vi el código pensé que pinError 5 era entrada, y hasta le dije que si lo podía cambiar (que pena pase) al pin digital 9, y lo hice por suerte el hardware me aviso de que el error era mío y no de pinError.

Me gustó mucho su creación Don Víctor, es minimalista el código, pocos renglones fácil de entender, pero toda vía soy incapaz de poner un punto y coma y no termine en error, ahora veo que las máquinas de estados finitos como algo amigable, lo mismo me paso con millis me daban terror, tarde casi un año e medio poder usarlos, y ahora pensaba terminaríamos en 300 o 400 renglones y estaría listo para la fiesta de San Juan y veo que no

#define pinRemoto          7
#define pinPersianaAbierta 8
#define pinSensorPresion   9

#define pinRele57  2
#define pinRele34  3
#define pinRele28  4

#define pinError   5

int remoto;
int persianaAbierta;
int sensorPresion;

unsigned long timer;

enum {
  PASO1,
  PASO2,
  PASO3,
  PASO4,
  PASO5,
  PASO6,
  ERROR
};

int paso = PASO1;

void setup() {
  Serial.begin(9600);
  pinMode(pinRemoto, INPUT_PULLUP);
  pinMode(pinPersianaAbierta, INPUT_PULLUP);
  pinMode(pinSensorPresion, INPUT_PULLUP);

  pinMode(pinRele57, OUTPUT); digitalWrite(pinRele57, LOW);
  pinMode(pinRele34, OUTPUT); digitalWrite(pinRele34, LOW);
  pinMode(pinRele28, OUTPUT); digitalWrite(pinRele28, LOW);
  pinMode(pinError, OUTPUT); digitalWrite(pinError, LOW);
}

void loop() {
  remoto = digitalRead(pinRemoto)==LOW;
  persianaAbierta = digitalRead(pinPersianaAbierta)==LOW;
  sensorPresion = digitalRead(pinSensorPresion)==LOW;

  switch ( paso ) {
    case PASO1:
      if ( remoto==HIGH ) {
        digitalWrite(pinRele57, HIGH);
        timer = millis();
        paso = PASO2;
      }
      break;
    case PASO2:
      if ( persianaAbierta==HIGH ) {
        digitalWrite(pinRele34, HIGH);
        timer = millis();
        paso = PASO3;
      }
      if ( millis()-timer >= 30000UL ) {
        digitalWrite(pinRele57, LOW);
        paso = ERROR;
      }
      break;
    case PASO3:
      if ( sensorPresion==HIGH ) {
        digitalWrite(pinRele28, HIGH);
        paso = PASO4;
      }
      if ( millis()-timer >= 30000UL ) {
        digitalWrite(pinRele57, LOW);
        digitalWrite(pinRele34, LOW);
        paso = ERROR;
      }
    case PASO4:
      if ( remoto==LOW ) {
        digitalWrite(pinRele28, LOW);
        timer = millis();
        paso = PASO5;
      }
      break;
    case PASO5:
      if ( millis()-timer >= 20000UL ) {
        digitalWrite(pinRele34, LOW);
        paso = PASO6;
      }
      break;
    case PASO6:
      if ( sensorPresion==LOW ) {
        digitalWrite(pinRele57, LOW);
        paso=PASO1;
      }
      break;
    case ERROR:
      digitalWrite(pinError, HIGH);
      break;
  }

}

Lo subo por que hice cambio en los pines creo que eso no afecta o si.

Eso ya es en el paso 4. Hay que añadir otra cambio de estado. si el sensor de presión se apaga por que no entra aire, deberiamos apagar el modulo 7800 y el ventilador, y dejar de alimentar el rele57 para que se cierre la persiana.
Hay dos opciones, apagar el relé 28 e ir al paso siguiente. En el paso 5 esperamos a que el ventilador este parado unos 20 segundos, pero como ya no había aire por culpa del sensor de presión quizás no sea necesario esperar. Obviamente al pasar al paso 6 seguirá al siguiente paso ya que la condición de sensor de aire ya estaba en LOW.

La otra opción es apagar todo y dar error.

Eso debería consultarse entonces desde cualquier paso desde el paso 2 y dar error.

Lógico, también debe ser una condición imposible, piénsalo y date cuenta. Manualmente lo puedes hacer, pero esas dos señales no estarán activas si no has activado los relés correspondientes.

En cuanto a lo de los pines me tenía que ir a trabajar y me dejé por terminar de comentar el código: el pin de error es una lucecita para saber que hay error simplemente.

Las máquinas de estados es una herramienta fácil y poderosa si se entiende. Tengo pensado hacer un tutorial para máquinas de estados ya que el que hay en documentación es demasiado teórico, pero me falta tiempo.

He hecho alguna corrección pero no me ha dado tiempo a probarlo en condiciones (yo uso proteus para simular los circuitos).

#define pinRemoto          7
#define pinPersianaAbierta 8
#define pinSensorPresion   9

#define pinRele57  2 // Persiana.
#define pinRele34  3 // Ventilador.
#define pinRele28  4 // Quemador.

#define pinError   5

int remoto;
int persianaAbierta;
int sensorPresion;

unsigned long timer;

enum {
  PASO1,
  PASO2,
  PASO3,
  PASO4,
  PASO5,
  PASO6,
  ERROR
};

int paso = PASO1;

void setup() {
  Serial.begin(9600);
  pinMode(pinRemoto, INPUT_PULLUP);
  pinMode(pinPersianaAbierta, INPUT_PULLUP);
  pinMode(pinSensorPresion, INPUT_PULLUP);

  pinMode(pinRele57, OUTPUT); digitalWrite(pinRele57, LOW);
  pinMode(pinRele34, OUTPUT); digitalWrite(pinRele34, LOW);
  pinMode(pinRele28, OUTPUT); digitalWrite(pinRele28, LOW);
  pinMode(pinError, OUTPUT); digitalWrite(pinError, LOW);
}

void loop() {
  remoto = digitalRead(pinRemoto)==LOW;
  persianaAbierta = digitalRead(pinPersianaAbierta)==LOW;
  sensorPresion = digitalRead(pinSensorPresion)==LOW;

  switch ( paso ) {
    case PASO1:
      if ( remoto==HIGH ) {
        digitalWrite(pinRele57, HIGH);
        timer = millis();
        paso = PASO2;
      }
      break;
    case PASO2:
      if ( persianaAbierta==HIGH ) {
        digitalWrite(pinRele34, HIGH);
        timer = millis();
        paso = PASO3;
      }
      if ( millis()-timer >= 30000UL ) {
        digitalWrite(pinRele57, LOW);
        paso = ERROR;
      }
      break;
    case PASO3:
      if ( sensorPresion==HIGH ) {
        digitalWrite(pinRele28, HIGH);
        paso = PASO4;
      }
      if ( millis()-timer >= 30000UL ) {
        digitalWrite(pinRele57, LOW);
        digitalWrite(pinRele34, LOW);
        paso = ERROR;
      }
      if ( persianaAbierta == LOW ) {
        digitalWrite(pinRele34, LOW);
        digitalWrite(pinRele57, LOW);
        paso = ERROR;
      }
    case PASO4:
      if ( remoto==LOW ) {
        digitalWrite(pinRele28, LOW);
        timer = millis();
        paso = PASO5;
      }
      if ( sensorPresion==LOW || persianaAbierta==LOW ) {
        digitalWrite(pinRele28, LOW);
        digitalWrite(pinRele34, LOW);
        digitalWrite(pinRele57, LOW);
        paso = ERROR;
      }
      break;
    case PASO5:
      if ( millis()-timer >= 20000UL ) {
        digitalWrite(pinRele34, LOW);
        paso = PASO6;
      }
      if ( persianaAbierta == LOW ) {
        digitalWrite(pinRele34, LOW);
        digitalWrite(pinRele57, LOW);
        paso = ERROR;
      }
      break;
    case PASO6:
      if ( sensorPresion==LOW ) {
        digitalWrite(pinRele57, LOW);
        paso=PASO1;
      }
      break;
    case ERROR:
      digitalWrite(pinError, HIGH);
      break;
  }

}

Hola @victorjam, la nueva versión ya no funciono, energizo D7 y activa RE57 (hasta aquí todo bien), al activar sensor de persiana se va a error ipso facto, creo que no explique bien el problema, el problema no esta en paso 4 eso es cando ya estamos en apagado el equipo y eso funciona biene el problema esta cuando el equipo opera de forma normal persiana abierta, ventilador encendido, combustión activa, hasta aquí todo normal, pero en un supuesto de que fallase persiana abierta y o sensor presión, dejan de mandar señal al Arduino, los tres relé continúan encendidos, y eso no debe ser, lo correcto seria, que si falla sensor de presión deja de enviar señal al Arduino, se apague RE28, y si persiana abierta deja de enviar señal, se apaguen RE28 y RE34 y que intente reiniciar el proceso desde ese punto y si efectivamente falla algunos de los sensores mandara error.

#define pinRemoto          7
#define pinPersianaAbierta 8
#define pinSensorPresion   9

#define pinRele57  2
#define pinRele34  3
#define pinRele28  4

#define pinError   5

int remoto;
int persianaAbierta;
int sensorPresion;

unsigned long timer;

enum {
  PASO1,
  PASO2,
  PASO3,
  PASO4,
  PASO5,
  PASO6,
  ERROR
};

int paso = PASO1;

void setup() {
  Serial.begin(9600);
  pinMode(pinRemoto, INPUT_PULLUP);
  pinMode(pinPersianaAbierta, INPUT_PULLUP);
  pinMode(pinSensorPresion, INPUT_PULLUP);

  pinMode(pinRele57, OUTPUT); digitalWrite(pinRele57, LOW);
  pinMode(pinRele34, OUTPUT); digitalWrite(pinRele34, LOW);
  pinMode(pinRele28, OUTPUT); digitalWrite(pinRele28, LOW);
  pinMode(pinError, OUTPUT); digitalWrite(pinError, LOW);
}

void loop() {
  remoto = digitalRead(pinRemoto)==LOW;
  persianaAbierta = digitalRead(pinPersianaAbierta)==LOW;
  sensorPresion = digitalRead(pinSensorPresion)==LOW;

  switch ( paso ) {
    case PASO1:
      if ( remoto==HIGH ) {
        digitalWrite(pinRele57, HIGH);
        timer = millis();
        paso = PASO2;
      }
      break;
    case PASO2:
      if ( persianaAbierta==HIGH ) {
        digitalWrite(pinRele34, HIGH);
        timer = millis();
        paso = PASO3;
      } else {                          // agregue desde aqui
        if ( persianaAbierta==LOW) {      
            digitalWrite(pinRele34, LOW);
        timer = millis();               // hasta aquí intentando que se apagase si no funciona persiana abierta pero no funciona mi agregado
        }
      }
      if ( millis()-timer >= 30000UL ) {
        digitalWrite(pinRele57, LOW);
        paso = ERROR;
      }
      break;
    case PASO3:
      if ( sensorPresion==HIGH ) {
        digitalWrite(pinRele28, HIGH);
        paso = PASO4;
      }                                 //hasta aquí todo bien pero si falla sensor presión debe de apagarse RE28 de inmediato   
      if ( millis()-timer >= 30000UL ) {
        digitalWrite(pinRele57, LOW);
        digitalWrite(pinRele34, LOW);
        paso = ERROR;
      }
    case PASO4:                        // de aquí hacia bajo esta muy biene el proceso de apagado 
      if ( remoto==LOW ) {
        digitalWrite(pinRele28, LOW);
        timer = millis();
        paso = PASO5;
      }
      break;
    case PASO5:
      if ( millis()-timer >= 20000UL ) {
        digitalWrite(pinRele34, LOW);
        paso = PASO6;
      }
      break;
    case PASO6:
      if ( sensorPresion==LOW ) {
        digitalWrite(pinRele57, LOW);
        paso=PASO1;
      }
      break;
    case ERROR:
      digitalWrite(pinError, HIGH);
      break;
  }

}

Hice unos comentarios, en los renglones que creo que debe estar lo que apague el relé correspondiente, si sensor falla

En el paso 4 no estamos apagando. En el paso 4 está el funcionamiento normal de programa, solo que si d7 se apaga entonces empieza el ciclo de apagado.

He visto que me faltaba un break en el código y quizas fuera por eso. De momento lo que hace el código es parar todo de golpe si estando en un estado ocurre algo como que se cierre la persiana o similar. Solo para probar.

#define pinRemoto          7
#define pinPersianaAbierta 8
#define pinSensorPresion   9

#define pinRele57  2
#define pinRele34  3
#define pinRele28  4

#define pinError   5

int remoto;
int persianaAbierta;
int sensorPresion;

unsigned long timer;

enum {
  PASO1,
  PASO2,
  PASO3,
  PASO4,
  PASO5,
  PASO6,
  ERROR
};

int paso = PASO1;
int pasoanterior = -1;

void setup() {
  Serial.begin(9600);
  pinMode(pinRemoto, INPUT_PULLUP);
  pinMode(pinPersianaAbierta, INPUT_PULLUP);
  pinMode(pinSensorPresion, INPUT_PULLUP);

  pinMode(pinRele57, OUTPUT); digitalWrite(pinRele57, LOW);
  pinMode(pinRele34, OUTPUT); digitalWrite(pinRele34, LOW);
  pinMode(pinRele28, OUTPUT); digitalWrite(pinRele28, LOW);
  pinMode(pinError, OUTPUT); digitalWrite(pinError, LOW);
}

void loop() {
  remoto = digitalRead(pinRemoto)==LOW;
  persianaAbierta = digitalRead(pinPersianaAbierta)==LOW;
  sensorPresion = digitalRead(pinSensorPresion)==LOW;
  if ( pasoanterior!=paso ) {
    Serial.println(paso+1);
    pasoanterior = paso;
  }
  switch ( paso ) {
    case PASO1:
      if ( remoto==HIGH ) {
        digitalWrite(pinRele57, HIGH);
        timer = millis();
        paso = PASO2;
      }
      break;
    case PASO2:
      if ( persianaAbierta==HIGH ) {
        digitalWrite(pinRele34, HIGH);
        timer = millis();
        paso = PASO3;
      }
      if ( millis()-timer >= 30000UL ) {
        digitalWrite(pinRele57, LOW);
        paso = ERROR;
      }
      break;
    case PASO3:
      if ( sensorPresion==HIGH ) {
        digitalWrite(pinRele28, HIGH);
        paso = PASO4;
      }
      if ( millis()-timer >= 30000UL ) {
        digitalWrite(pinRele57, LOW);
        digitalWrite(pinRele34, LOW);
        paso = ERROR;
      }
      if ( persianaAbierta == LOW ) {
        digitalWrite(pinRele28, LOW);
        digitalWrite(pinRele34, LOW);
        digitalWrite(pinRele57, LOW);
        paso = ERROR;
      }
      break;
    case PASO4:
      if ( remoto==LOW ) {
        digitalWrite(pinRele28, LOW);
        timer = millis();
        paso = PASO5;
      }
      if ( sensorPresion==LOW || persianaAbierta==LOW ) {
        digitalWrite(pinRele28, LOW);
        digitalWrite(pinRele34, LOW);
        digitalWrite(pinRele57, LOW);
        paso = ERROR;
      }
      break;
    case PASO5:
      if ( millis()-timer >= 20000UL ) {
        digitalWrite(pinRele34, LOW);
        paso = PASO6;
      }
      break;
    case PASO6:
      if ( sensorPresion==LOW ) {
        digitalWrite(pinRele57, LOW);
        paso=PASO1;
      }
      break;
    case ERROR:
      digitalWrite(pinError, HIGH);
      break;
  }

}

Ok, lo pruebo y te informo
Saludos.

No funciono, activo RE57 y al energizar persiana abierta, se va a error toda vía.

Hola @victorjam, no hay manera de evitar que en paso 2 se vaya a error a un poniendo todo en HIGH

 if ( sensorPresion==LOW || persianaAbierta==LOW ) {

Esta funcion no la entiendo, pero parece que es por aquí que se da el error a un estando entre paso 4 y paso 5 afecta de forma directa a paso 2

#define pinPersianaAbierta 8
#define pinSensorPresion   9

#define pinRele57  2
#define pinRele34  3
#define pinRele28  4

#define pinError   5

int remoto;
int persianaAbierta;
int sensorPresion;

unsigned long timer;

enum {
  PASO1,
  PASO2,
  PASO3,
  PASO4,
  PASO5,
  PASO6,
  ERROR
};

int paso = PASO1;
int pasoanterior = -1;

void setup() {
  Serial.begin(9600);
  pinMode(pinRemoto, INPUT_PULLUP);
  pinMode(pinPersianaAbierta, INPUT_PULLUP);
  pinMode(pinSensorPresion, INPUT_PULLUP);

  pinMode(pinRele57, OUTPUT); digitalWrite(pinRele57, LOW);
  pinMode(pinRele34, OUTPUT); digitalWrite(pinRele34, LOW);
  pinMode(pinRele28, OUTPUT); digitalWrite(pinRele28, LOW);
  pinMode(pinError, OUTPUT); digitalWrite(pinError, LOW);
}

void loop() {
  remoto = digitalRead(pinRemoto) == LOW;
  persianaAbierta = digitalRead(pinPersianaAbierta) == LOW;
  sensorPresion = digitalRead(pinSensorPresion) == LOW;
  if ( pasoanterior != paso ) {
    Serial.println(paso + 1);
    pasoanterior = paso;
  }
  switch ( paso ) {
    case PASO1:
      if ( remoto == HIGH ) {
        digitalWrite(pinRele57, HIGH);
        timer = millis();
        paso = PASO2;
      }
      break;
    case PASO2:
      if ( persianaAbierta == HIGH ) {
        digitalWrite(pinRele34, HIGH);
        timer = millis();
        paso = PASO3;
      }
      if ( millis() - timer >= 30000UL ) {
        digitalWrite(pinRele57, LOW);
        paso = ERROR;
      }
      break;
    case PASO3:
      if ( sensorPresion == HIGH ) {
        digitalWrite(pinRele28, HIGH);

      }
      if ( persianaAbierta == LOW) {
        digitalWrite(pinRele34, LOW);
        digitalWrite(pinRele28, LOW);
      }
      if ( sensorPresion == LOW) {
        digitalWrite(pinRele34, LOW);
        digitalWrite(pinRele28, LOW);
        paso = PASO4;
      }
      if ( millis() - timer >= 30000UL ) {
        digitalWrite(pinRele57, LOW);
        digitalWrite(pinRele34, LOW);
        digitalWrite(pinRele28, LOW);
        paso = ERROR;
      }

      break;
    case PASO4:
      if ( remoto == LOW ) {
        digitalWrite(pinRele28, LOW);
        timer = millis();
        paso = PASO5;
      }

      break;
    case PASO5:
      if ( millis() - timer >= 20000UL ) {
        digitalWrite(pinRele34, LOW);
        paso = PASO6;
      }
      break;
    case PASO6:
      if ( sensorPresion == LOW ) {
        digitalWrite(pinRele57, LOW);
        paso = PASO1;
      }
      break;
    case ERROR:
      digitalWrite(pinError, HIGH);
      break;
  }

}

Hola esta versión ya apaga los reles, cuando no hay señal de sensores, ahora esta independiente, Persiana Abierta apaga RE34, Sensor Presión apaga RE28, lo malo es que envía a error pasado un tiempo.

Nota: El hilo ya supero las trescientas visitas nunca he abierto un hilo que sea tan popular

Moderador:
Tema movido a Proyectos.

Hola @Surbyte, y donde estará ahora como se accede a el?

Porque se está quedando "clavado" en el paso 2 ó el 3 por más de 30 seg..

Hola @MaximoEsfuerzo, el post # 69 se esta atorando, tienes que ver el post # 59 ese funciona bien, solo que si alguno de los dos sensores no envía señal sigue funcionando.
Me ha estado ayudando @victorjam, solo que ahora esta ocupado y no a tenido tiempo de pasar por el hilo.
Saludos.

Solo te marqué algo que es obvio para que mires cual o cuales entradas están haciendo que quede más de 30 segundos en uno de esos pasos.

Saludos

No veo las marcas

Te marqué, te señalé, te indiqué, te dije.

Saludos

no soy adivina gracias no entiendo tu acertijo mejor dejes molo así gracias

Estoy intentando reproducir el error en proteus y no me sale. La máquina de estados parece estar funcionando bien.

He modificado el programa para que cada vez que haga algo lo muestre por el puerto serie. Haz la "simulación" y me dices que es lo que te ha salido.

#define pinRemoto          7
#define pinPersianaAbierta 8
#define pinSensorPresion   9

#define pinRele57  2
#define pinRele34  3
#define pinRele28  4

#define pinError   5

int remoto;
int persianaAbierta;
int sensorPresion;

unsigned long timer;

enum {
  PASO1,
  PASO2,
  PASO3,
  PASO4,
  PASO5,
  PASO6,
  ERROR
};

int paso = PASO1;
int pasoanterior = -1;

void setup() {
  Serial.begin(9600);
  pinMode(pinRemoto, INPUT_PULLUP);
  pinMode(pinPersianaAbierta, INPUT_PULLUP);
  pinMode(pinSensorPresion, INPUT_PULLUP);

  pinMode(pinRele57, OUTPUT); digitalWrite(pinRele57, LOW);
  pinMode(pinRele34, OUTPUT); digitalWrite(pinRele34, LOW);
  pinMode(pinRele28, OUTPUT); digitalWrite(pinRele28, LOW);
  pinMode(pinError, OUTPUT); digitalWrite(pinError, LOW);
}

void loop() {
  remoto = digitalRead(pinRemoto)==LOW;
  persianaAbierta = digitalRead(pinPersianaAbierta)==LOW;
  sensorPresion = digitalRead(pinSensorPresion)==LOW;
  if ( pasoanterior!=paso ) {
    Serial.println(paso+1);
    pasoanterior = paso;
  }
  switch ( paso ) {
    case PASO1:
      if ( remoto==HIGH ) {
        Serial.println("Remoto activa la secuencia");
        digitalWrite(pinRele57, HIGH);
        timer = millis();
        paso = PASO2;
      }
      break;
    case PASO2:
      if ( persianaAbierta==HIGH ) {
        Serial.println("La persiana esta abierta");
        digitalWrite(pinRele34, HIGH);
        timer = millis();
        paso = PASO3;
      }
      if ( millis()-timer >= 30000UL ) {
        Serial.println("Ha pasado el tiempo y la ventana no se ha abierto");
        digitalWrite(pinRele57, LOW);
        paso = ERROR;
      }
      break;
    case PASO3:
      if ( sensorPresion==HIGH ) {
        Serial.println("Se ha alcanzado la velocidad y el sensor de presion se cerro");
        digitalWrite(pinRele28, HIGH);
        paso = PASO4;
      }
      if ( millis()-timer >= 30000UL ) {
        Serial.println("No se ha alcanzado la velocidad de ventilador y se ha agotado el tiempo");
        digitalWrite(pinRele57, LOW);
        digitalWrite(pinRele34, LOW);
        paso = ERROR;
      }
      if ( persianaAbierta == LOW ) {
        Serial.println("La persiana se ha cerrado mientras esperabamos al sensor de presion");
        digitalWrite(pinRele28, LOW);
        digitalWrite(pinRele34, LOW);
        digitalWrite(pinRele57, LOW);
        paso = ERROR;
      }
      break;
    case PASO4:
      if ( remoto==LOW ) {
        Serial.println("Hemos alcanzado la temperatura y debemos apagar");
        digitalWrite(pinRele28, LOW);
        timer = millis();
        paso = PASO5;
      }
      if ( sensorPresion==LOW || persianaAbierta==LOW ) {
        if ( sensorPresion==LOW ) Serial.println("No hay presion de aire");
        if ( persianaAbierta==LOW ) Serial.println("Se cerro la persiana");
        digitalWrite(pinRele28, LOW);
        digitalWrite(pinRele34, LOW);
        digitalWrite(pinRele57, LOW);
        paso = ERROR;
      }
      break;
    case PASO5:
      if ( millis()-timer >= 20000UL ) {
        Serial.println("Estamos dando tiempo a que el ventilador se pare");
        digitalWrite(pinRele34, LOW);
        paso = PASO6;
      }
      break;
    case PASO6:
      if ( sensorPresion==LOW ) {
        Serial.print("El ventilador ya se paro y no tenemos presion");
        digitalWrite(pinRele57, LOW);
        paso=PASO1;
      }
      break;
    case ERROR:
      digitalWrite(pinError, HIGH);
      break;
  }

}

Hola @victorjam, sigue la falla, activo RE57 bien, pero cuando le envió al Arduino la señal de persiana abierta, se va a error de inmediato el código de post # 59 no hace eso si sigue la secuencia Remoto, persiana Abierta y Sensor Presión.

Nota: si pongo las tres entradas en alto y reinicio si activa los tres relés peo eso en la vida real no existe.
Saludos

Dime que texto te muestra la salida del programa.