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;
}
}