O problema com o delay() (que é constantemente mal usado) é que bloqueia o programa, ou seja:
void loop(){
if(fechado==0 & ordem==1){
digitalWrite(motor_abre, HIGH);
}
else{
if(aberto==0){
digitalWrite(motor_abre, LOW);
delay (5000);} \\ <- O PROGRAMA PARA AQUI DURANTE 5 SEGUNDOS
}
}
if(aberto==0 ){
digitalWrite(motor_fecha, HIGH);
}
else{
if(fechado==0){
digitalWrite(motor_fecha, LOW);
}
}
}
Se queres usar temporizacões, experimenta com a funcão millis().
Para tornar o código mais perceptível, não seria pior colocares o desenho ou então definires o que é o 0 e o 1.
Quanto ao problema... acho que é algo como:
if(fechado==0 & ordem==1){ //O portão não está fechado e provavelmente não estás a enviar comando nenhum para activar a ordem. Então, este if falha.
digitalWrite(motor_abre, HIGH);
}
else{
if(aberto==0){ //como o portão está a fechar, os sensores de aberto e fechado estão desactivos e este if vai estar correcto, iniciando um delay().
digitalWrite(motor_abre, LOW);
delay (5000);}
}
}
Tenta fazer uma máquina de estados deste género:
#define PORTAO_ABERTO 10
#define PORTAO_FECHADO 20
#define PORTAO_ABRIR 30
#define PORTAO_FECHAR 40
int estado = 0;
unsigned long inicio = 0;
unsigned long agora = 0;
loop() {
switch (estado) {
case PORTAO_FECHADO : {
if (ordem == true) {
//liga motor para abrir portão.
estado = PORTAO_ABRIR;
}
break; }
case PORTAO_ABRIR: {
if (aberto == true) {
//para motor.
estado = PORTAO_ABERTO;
inicio = millis();
}
break;}
case PORTAO_ABERTO: {
agora = millis();
if (agora-inicio > 5000) {//5 segundos
//ligar motor para fechar portão
estado = PORTAO_FECHAR;
}
if (ordem_para_fechar_portao == true) {
//ligar motor para fechar portão
estado = PORTAO_FECHAR;
}
break;}
case PORTAO_FECHAR: {
if (fechado == true) {
//desliga motor.
estado = PORTAO_FECHADO;
}
break; }
}
Desta forma apenas testas determinadas condicões se o portão estiver no estado pretendido e permite-te adicionar muito mais condicões que não entrem em conflito como tens agora. Por exemplo, se o portão estiver a fechar e tu pretenderes abrir, ou vice-versa, etc, etc...