Problema con programa para barrera acceso vehiculos

Bueno si no he entendido mal, creo que podria quedar algo asi, lo he probado en el simulador y parece que va, me queda desplazarme y pasarlo a placa y probar.

Bueno a ver que os parece, por si tengo que tocar (que sera lo mas seguro), esta algo mas limpio y parece mas sencillo.

//PROGRAMA BARRERA HIDRAULICA

//Definir pines de salida

#define rldown 4		//grupo de reles de bajada
#define rlup 5			//grupo de reles de subida
#define rlpow 6			// rele de alimentacion general
int tsubida = 13000;
int tbajada = 10000;
volatile int b = 0;
volatile int state = 1; //state 1=subida, state 2=bajando, state 3=bajada, state 4=subiendo, state 5=parada arriba
int tespera = 30000;
unsigned long tiempo;

void control()
{
	para();
	b = 1;
}

void setup()

{
	// put your setup code here, to run once:
	pinMode(rldown, OUTPUT);
	pinMode(rlup, OUTPUT);
	pinMode(rlpow, OUTPUT);
	pinMode(3, INPUT);
	
	digitalWrite(rlpow, HIGH);
	digitalWrite(rldown, HIGH);
	digitalWrite(rlup, HIGH);
	
	state = 1;
	
	attachInterrupt(1, control, FALLING);	
	
	tiempo=millis();
}



void sube()
{
	
	digitalWrite(rlup, LOW);  delay(500); digitalWrite(rlpow, LOW);
	
}

void baja()
{
	
	digitalWrite(rldown, LOW); delay(500); digitalWrite(rlpow, LOW);
}

void para()
{
	digitalWrite(rlpow, HIGH); digitalWrite(rldown, HIGH); digitalWrite(rlup, HIGH);
}

void loop()

{	
	
	
	
	if (state==1) 	//subida en tiempo de espera
	{
		if (b==1)		//orden de parada
		{
			state=5; b=0;
		}
		if (millis()>tiempo+tespera)
		{
			baja(); state=2;
		}	
	}
	
	if (state==2) 	//bajando
	{
		if (b==1)	//orden de inversion
		{
			b=0; para(); sube(); state=4; tiempo=millis();
		}
		if (millis()>tiempo+tbajada)
		{
			para(); state=3;
		}
	}
	
	if (state==3)	//bajada
	{
		if (b==1)	//orden de subida
		{
			b=0; sube(); state=4;tiempo=millis();
		}
		
	}
	if (state==4)	//subiendo
	{
		if (b==1)	//orden de inversion
		{
			b=0; para(); baja(); state=2; tiempo=millis();
		}
		if (millis()>tiempo+tsubida)
		{
			para(); state=1;
		}
	}
	if (state==5)	//subida en paro permanente
	{
		if (b==1)	//orden de bajada
		{
			baja(); state=2; b=0;tiempo=millis();
		}
	}
	
}

A ver si no la lio subiendo el código.

Gracias de nuevo.

actualizacion.ino (1.97 KB)