Portón corredizo Arduino

Hola :raised_hand_with_fingers_splayed: . Soy nueva en todo el tema de códigos y programación, y la verdad me vendría bien un poco de ayuda :smile: . Tengo que hacer un proyecto para la escuela sobre un portón corredizo manejado a control remoto con Arduino. El problema es que realiza la acción de abrir, pero no cierra. Y ahí queda, congelado sin hacer nada más. Si alguien le da un vistazo, gracias de antemano :people_hugging:

#include <RCSwitch.h>
#include <Wire.h>
#include <EEPROM.h>

//Declaracion de pulsadores
#define optimo 5  // ---------------- mantenimiento y funcion remota ----------------
#define usuario 6 // ----------------     pulsador de registro       ----------------

//Declaracion de variables
enum { asociar = 0, arranque, freno1, retroceso, freno2, automatico, nuevo }; // ||| ESTADOS DEL PORTON |||
byte estado;
unsigned long codigoPrincipal = 1,  codigoAlmacenado = 2, codigoRecibido = 0; // || Slots para Controles ||
unsigned long tiempoactual = 0;
int led1 = 12, led2 = 11; //leds de testeo/identificacion de estados
int encendido = 10, direccion = 9, sensor1 = 7, sensor2 = 8; //sensor1 = FCA y sensor2 = FCC

//Declaracion de banderas
boolean primeravez = true;
boolean habilitarFCA = true;
boolean habilitarFCC = false;
boolean code = false, code2 = false, code3 = false, code4 = false;
boolean remoto, habilitar = false, OK = true;

//Declaración de funciones
boolean compararCodigo1();
boolean compararCodigo2();

boolean compararCodigo1(long int codigoPrincipal[],long int codigoRecibido[]){
  if(codigoPrincipal[0] != codigoRecibido[0])return(false);  //Si son distintos retorna falso la función [ 0 ]
  if(codigoPrincipal[1] != codigoRecibido[1])return(false);  //Si son distintos retorna falso la función [ 0 ]
  if(codigoPrincipal[2] != codigoRecibido[2])return(false);  //Si son distintos retorna falso la función [ 0 ]
  if(codigoPrincipal[3] != codigoRecibido[3])return(false);  //Si son distintos retorna falso la función [ 0 ]
  return(true);    
}
boolean compararCodigo2(long int codigoAlmacenado[],long int codigoRecibido[]){
  if(codigoAlmacenado[5] != codigoRecibido[0])return(false);  //Si son distintos retorna falso la función [ 0 ]
  if(codigoAlmacenado[6] != codigoRecibido[1])return(false);  //Si son distintos retorna falso la función [ 0 ]
  if(codigoAlmacenado[7] != codigoRecibido[2])return(false);  //Si son distintos retorna falso la función [ 0 ]
  if(codigoAlmacenado[8] != codigoRecibido[3])return(false);  //Si son distintos retorna falso la función [ 0 ]
  return(true);                             //Si los códigos son iguales retorna verdadero [ 1 ]
}  


RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2
  
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(encendido, OUTPUT);
  pinMode(direccion, OUTPUT);
  pinMode(optimo, INPUT);
  pinMode(usuario, INPUT);
  pinMode(sensor1, INPUT_PULLUP);
  pinMode(sensor2, INPUT_PULLUP);
 
  if(EEPROM.get(0, codigoPrincipal) != -1){

   Serial.println(" - - - - - - - - - - - - - - - - - - - - - - - - - - -");
   Serial.print("             Control disponible: ");
   Serial.println( EEPROM.get(0, codigoPrincipal) );
   Serial.println(" - - - - - - - - - - - - - - - - - - - - - - - - - - -"); 
   estado = arranque;
 
  } else{

   Serial.print(" - - - - - Debe de asociar un control - - - - -");
    estado = asociar;    
  }
}

void loop() {
   switch (estado) {
    
  case asociar: { //Asociar 1er control (Adaptacion de administrador)

if (mySwitch.available()) {
    
    codigoRecibido = mySwitch.getReceivedValue();

  if (codigoRecibido == 1111)
  {
    Serial.println("\nNo hay codigo || ERROR ||");  
  }
  else
  {
    Serial.print("\n\nCodigo entrante: ");
    Serial.println(codigoRecibido);
    Serial.print( mySwitch.getReceivedBitlength() );
    Serial.print(" bits \n");

    codigoPrincipal = codigoRecibido;
    EEPROM.put(0, codigoPrincipal);
    Serial.print("\n\nCodigo entrante guardado exitosamente");
    Serial.print("\nDireccion 0 | ");
    Serial.print( EEPROM.get(0, codigoPrincipal) );
    
    mySwitch.resetAvailable();
    
    estado = arranque;
  }
 }
} break;//asociar

  case arranque:{

    if(mySwitch.available()){
      OK = true;
      codigoRecibido = mySwitch.getReceivedValue();
      if((millis() >= (tiempoactual+2000)) && OK){
        tiempoactual = millis();
        Serial.print(mySwitch.getReceivedValue());
        if(compararCodigo1(codigoRecibido, codigoPrincipal) || compararCodigo2(codigoRecibido, codigoAlmacenado) && remoto) {
         delay(450);
         code = true;
         codigoRecibido = 0;
         remoto = false;
         OK = false;
           }
           mySwitch.enableReceive();
          }
        mySwitch.resetAvailable();
    }
    while(code){
      digitalWrite(12,LOW);
      digitalWrite(11,HIGH);
      digitalWrite(direccion, HIGH);
      delay(20);
      digitalWrite(encendido, HIGH);
      Serial.println("\n\nARRANQUE");
      if(!digitalRead(sensor2)){
          digitalWrite(encendido, LOW);
          delay(20);
          digitalWrite(direccion, LOW);
          code = false;
          estado = retroceso;
      }
      delay(150);
      /*habilitar = true;
       if((habilitar) && (!digitalRead(sensor1)) && (habilitarFCA)){
          digitalWrite(encendido, LOW);
          delay(20);
          digitalWrite(direccion, LOW);
          habilitarFCA = false;
          habilitarFCC = true;
          estado = retroceso;
          }
       if (digitalRead(usuario) == HIGH){ //Deriva a agregar nuevo control ||| ARRANQUE
          while (digitalRead(usuario) == HIGH);
          //Serial.println("Derivando a nuevo usuario");
          while (digitalRead(usuario) == LOW);
          delay(250);
          estado = nuevo;
          }
          if((habilitar) && (digitalRead(nuevo) == LOW)){
          Serial.println("Desabilitando");
          remoto = true;
          code = false;
          habilitar = false;
          delay(250);
          estado = freno1;
         // Serial.println( estado );
      }*/
    }

  }break; //arranque        

   case freno1: {
         
    if(mySwitch.available()){
      OK = true;
      codigoRecibido = mySwitch.getReceivedValue();
     // if((millis() >= (tiempoactual+2000)) && OK){
       // tiempoactual = millis();
        Serial.print(mySwitch.getReceivedValue());
        Serial.print(compararCodigo1(codigoRecibido, codigoPrincipal));
        if(compararCodigo1(codigoRecibido, codigoPrincipal) || compararCodigo2(codigoRecibido, codigoAlmacenado) && remoto) {
         delay(450);
         code2 = true;
         codigoRecibido = 0;
         remoto = false;
         OK = false;
           }
           mySwitch.enableReceive();
         // }
        mySwitch.resetAvailable();
    }
    while(code2){
      digitalWrite(12,HIGH);
      digitalWrite(11,LOW);
      digitalWrite(encendido, LOW);
      delay(20);
      digitalWrite(direccion, LOW);
      Serial.println("\n\nFRENO - 1");
      delay(1000);
      habilitar = true;
          if(habilitar){
          Serial.println("Desabilitando");
          remoto = true;
          delay(250);
          code2 = false;
          habilitar = false;
          estado = retroceso;
         // Serial.println( estado );
      }
    }
  }break; //FRENO - 1


   case retroceso: {
         
    if(mySwitch.available()){
      OK = true;
      codigoRecibido = mySwitch.getReceivedValue();
     // if((millis() >= (tiempoactual+2000)) && OK){
       // tiempoactual = millis();
        Serial.print(mySwitch.getReceivedValue());
        Serial.print(compararCodigo1(codigoRecibido, codigoPrincipal));
        if(compararCodigo1(codigoRecibido, codigoPrincipal) || compararCodigo2(codigoRecibido, codigoAlmacenado) && remoto) {
         delay(450);
         code3 = true;
         codigoRecibido = 0;
         remoto = false;
         OK = false;
           }
           mySwitch.enableReceive();
         // }
        mySwitch.resetAvailable();
    }
    while(code3){
      digitalWrite(12,LOW);
      digitalWrite(11,HIGH);
      digitalWrite(direccion, LOW);
      delay(20);
      digitalWrite(encendido, HIGH);
      Serial.println("\n\nRETROCESO");
      if(!digitalRead(sensor1)){
          digitalWrite(encendido, LOW);
          delay(20);
          digitalWrite(direccion, LOW);
          code3 = false;
          estado = arranque;
      }
      delay(150);
          /*if (digitalRead(optimo) == HIGH){ //Deriva a modo automatico |||| RETROCESO
          while (digitalRead(optimo) == HIGH);
          Serial.println("AUTOMATICO");
          while (digitalRead(optimo) == LOW);
          delay(250);
          estado = automatico;
          }
          if((habilitar) && (digitalRead(optimo) == LOW)){
          Serial.println("Desabilitando");
          remoto = true;
          delay(250);
          code3 = false;
          habilitar = false;
          estado = freno2;
         // Serial.println( estado );
      }*/
    }
  }break; //retroceso

   case freno2: {
         
    if(mySwitch.available()){
      OK = true;
      codigoRecibido = mySwitch.getReceivedValue();
     // if((millis() >= (tiempoactual+2000)) && OK){
       // tiempoactual = millis();
        Serial.print(mySwitch.getReceivedValue());
        Serial.print(compararCodigo1(codigoRecibido, codigoPrincipal));
        if(compararCodigo1(codigoRecibido, codigoPrincipal) || compararCodigo2(codigoRecibido, codigoAlmacenado) && remoto) {
         delay(450);
         code4 = true;
         codigoRecibido = 0;
         remoto = false;
         OK = false;
           }
           mySwitch.enableReceive();
         // }
        mySwitch.resetAvailable();
    }
    while(code4){
      digitalWrite(12,HIGH);
      digitalWrite(11,LOW);
      digitalWrite(encendido, LOW);
      delay(20);
      digitalWrite(direccion, LOW);
      Serial.println("\n\nFRENO - 2");
      delay(1000);
      habilitar = true;
          if(habilitar){
          Serial.println("Desabilitando");
          remoto = true;
          delay(250);
          code4 = false;
          habilitar = false;
          estado = arranque;
         // Serial.println( estado );
      }
    }
  }break; //FRENO - 2
       
  case automatico: { //Funcion automatica para corroborar estado | MANTENIMIENTO |

  boolean modoautomatico = true;
      
while(modoautomatico){

        if(primeravez){
          digitalWrite(encendido, HIGH);
          digitalWrite(direccion, LOW);
          digitalWrite(12,HIGH);
          digitalWrite(11,HIGH);
          primeravez = false;
        }

        if(!digitalRead(sensor1) && habilitarFCA){
          digitalWrite(encendido, LOW);
          delay(5000);
          digitalWrite(direccion, HIGH);
          digitalWrite(encendido, HIGH);
          habilitarFCA = false;
          habilitarFCC = true;
        }

        if(!digitalRead(sensor2) && habilitarFCC){
          digitalWrite(encendido, LOW);
          habilitarFCC = false;
          modoautomatico = false;
          Serial.println("\n\nVUELTA AL PORTON\n");
          estado = arranque;
        }
     }
  }   break;//automatico

  case nuevo: { //Asociar control nuevo (Adaptacion de usuario)

if (mySwitch.available()) {
    
    codigoRecibido = mySwitch.getReceivedValue();

  if (codigoRecibido == 1111)
  {
    Serial.println("\nNo hay codigo || ERROR ||");  
  }
  else
  {
    Serial.print("\n\nCodigo entrante: ");
    Serial.println(codigoRecibido);
    Serial.print( mySwitch.getReceivedBitlength() );
    Serial.print(" bits \n");

    codigoAlmacenado = codigoRecibido;
    EEPROM.put(0, codigoAlmacenado);
    Serial.print("\n\nCodigo entrante guardado exitosamente");
    Serial.print("\nDireccion 5 | ");
    Serial.print( EEPROM.get(5, codigoAlmacenado) );
    
    mySwitch.resetAvailable();

    estado = arranque;
  }
}
} break;//nuevo
    
} //Cierre de switch-case

}

Es acá donde esta fallando?

while (code) {
          digitalWrite(direccion, HIGH);
          digitalWrite(led2, LOW);
          digitalWrite(led1, HIGH);
          delay(20);
          digitalWrite(encendido, HIGH);
          Serial.println("\n\nARRANQUE");
          if (!digitalRead(sensor2)) {
            digitalWrite(encendido, LOW);
            delay(20);
            digitalWrite(direccion, LOW);
            code = false;
            estado = retroceso;
          }
          delay(150);
        }

Sensor2 es un límite de carrera? Lo has probado, funciona?
Lo tienes definido como INPUT_PULLUP de modo que al cerrarse si es NO, dará un LOW, eso esta bien, pero lo hace?
Chequea eso.