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.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.