Automatización para portón eléctrico

Saludos, esta seria mi primera consulta, tengo ya un tiempo estudiando la programación con Arduino y en base a lo que he logrado aprender hice un pequeño código para controlar a través de un motor un portón eléctrico, el mismo lo tengo ya funcionando y no me ha presentado problemas aun, les dejare el código para que lo vean... Solo que ahora quiero agregarle que funcione paso a paso, si estaba abriendo y presiono el botón que pare y que cuando vuelva a presionar el botón cierre, igual para cuando este cerrando...

const int pulso=       2; // pulso de activacion para abir y cerrar
const int p_cerrada=  3; // sensor de puerta cerrada
const int p_abierta=   4; // sensor de puerta abierta

const int relaya=      6; // rele de activacion de apertura
const int relayc=      7; // rele de activacion de cerrado


short boton= 1;
short abrir = 1;
short flag_abre = 0;        
short flag_cierra = 0;     
short f_c_abrir=1;
short f_c_cerrar=1;


void setup() {
  
pinMode(pulso, INPUT); // pulso de activacion para abir y cerrar
pinMode(p_cerrada, INPUT); // sensor de puerta cerrada
pinMode(p_abierta, INPUT); // sensor de puerta abierta
pinMode(relaya, OUTPUT); // rele de activacion de apertura
pinMode(relayc, OUTPUT); // rele de activacion de cerrado


delay(200);


}

void loop() {

while (true) {


abrir=digitalRead(pulso);
f_c_abrir=digitalRead(p_abierta);
f_c_cerrar=digitalRead(p_cerrada);

//*********************************************************************
//       RUTINAS PARA LEER LOS FINALES DE CARRERA
//*********************************************************************

if(!f_c_abrir)                               // Si se activa el final de carrera de abrir
                {
            if(flag_abre)                       
              {      
               digitalWrite(relaya, 0);      // detiene el motor
               boton=1;                      
               flag_abre=0; 
               }
              }


           
if(!f_c_cerrar)                                // Si se activa el final de carrera puerta cerrada
              {
               if(flag_cierra)                 
               {                          
               digitalWrite(relayc, 0);         // detiene el motor
               flag_cierra=0;                   
               boton=2;                           
               }
              }

//*********************************************************************
//       RUTINAS PARA ACTIVAR EL MOTOR EN MODO APERTURA O CIERRE
//*********************************************************************

if(boton==1 && !abrir)                         // Si hemos pulsado abrir
                  {
                  digitalWrite(relayc, 1);     // se activa el motor en modo cierre                
                  flag_cierra=1;               // Fija el final de carrera para el motor   

                  }

if(boton==2 && !abrir)                         // si el porton esta cerrado y hemos pulsado abrir
                  {
                  digitalWrite(relaya, 1);     // activa el motor para abrir                  
                  flag_abre=1;                // Activa bandera cierra             
                  }
                                                
    }
}
while (true) {

en este caso es innecesario porque todo lo que está dentro de loop() se repite indefinidamente.

Gracias compañero lo tendré en cuenta...

Hola @abimilec

Por si te sirve de referencia, adjunto un sencillo programa que ya publique anteriormente.

Es una aplicación de un motor paso a paso con doble sentido de marcha, final de carrera en cada extremo final de recorrido y con parada en cualquier momento por interrupción.

Un saludo !!!

:cocktail:... :cocktail:

/*
   MAQUINA ESTADOS APLICADA A MOTOR PASO/PASO MATSUSHITA

   Doble sentido de giro.

   CON: VOID SUBE Y BAJA
        VOID APAGA LEDS/BOBINAS
        VOID INTERRUPCION
  Con el controlador ULN2003A.

*  ****************  ENGRAL Marzo 2024 ***********************

*/


int Puls_S = 5 ; //Pulsador SUBIDA
int Puls_B = 14; //Pulsador BAJADA

int Sens_A = 4 ; //Sensor/fin carrera arriba
int Sens_B = 15; //Sensor/fin carrera abajo

int Led_P   = 7; // Led encendido:Estado PARADO

// *************** CONEXIONES a CONTROLADOR Y MOTOR ********************

int IN_1 = 8;  // CONEX-1 ULN2003A y MOTOR
int IN_2 = 9;  // CONEX-2 ULN2003A y MOTOR
int IN_3 = 10; // CONEX-3 ULN2003A y MOTOR
int IN_4 = 11; // CONEX-4 ULN2003A y MOTOR

// **********************************************

enum Situacion {PARADO, SUBE, BAJA };

Situacion ESTADO = PARADO; // Declaracion GLOBAL.

int INTERVALO = 5; // ORIGINAL:5 INTERVALO
int descanso =  200;
//************************  FUNCIONES  ********************
void INTERRU()// Produce la interrupción.
{
  Serial.println("      INTERRUPCION STOP !!!! ");
  ESTADO = PARADO;
}
//********************************

void sube()            // Gira el motor  SENTIDO HORARIO
{
  digitalWrite( IN_1, HIGH);  // paso 1 PASO DOBLE
  digitalWrite( IN_2, HIGH);
  digitalWrite( IN_3, LOW);
  digitalWrite( IN_4, LOW);
  delay(INTERVALO);           // LAPSO ENTRE PASOS

  digitalWrite( IN_1, LOW);   // paso 2  PASO DOBLE
  digitalWrite( IN_2, HIGH);
  digitalWrite( IN_3, HIGH);
  digitalWrite( IN_4, LOW);
  delay(INTERVALO);

  digitalWrite( IN_1, LOW);  // paso 3 PASO DOBLE
  digitalWrite( IN_2, LOW);
  digitalWrite( IN_3, HIGH);
  digitalWrite( IN_4, HIGH);
  delay(INTERVALO);

  digitalWrite( IN_1, HIGH);   // paso 4 PASO DOBLE
  digitalWrite( IN_2, LOW);
  digitalWrite( IN_3, LOW);
  digitalWrite( IN_4, HIGH);
  delay(INTERVALO);
}
//****************************************

void baja()  // Gira el motor  SENTIDO ANTI-HORARIO
{
  digitalWrite( IN_1, LOW);//1 paso 1 PASO DOBLE
  digitalWrite( IN_2, LOW);
  digitalWrite( IN_3, HIGH);
  digitalWrite( IN_4, HIGH);
  delay(INTERVALO);        // LAPSO ENTRE PASOS

  digitalWrite( IN_1, LOW);//2 paso 2  PASO DOBLE
  digitalWrite( IN_2, HIGH);
  digitalWrite( IN_3, HIGH);
  digitalWrite( IN_4, LOW);
  delay(INTERVALO);

  digitalWrite( IN_1, HIGH);//3 paso 3 PASO DOBLE
  digitalWrite( IN_2, HIGH);
  digitalWrite( IN_3, LOW);
  digitalWrite( IN_4, LOW);
  delay(INTERVALO);

  digitalWrite( IN_1, HIGH );//4 paso 4 PASO DOBLE
  digitalWrite( IN_2, LOW);
  digitalWrite( IN_3, LOW);
  digitalWrite( IN_4, HIGH);
  delay(INTERVALO);
}
//****************************************
void apaga_leds()         //  APAGA Leds y BOBINAS MOTOR
{
  digitalWrite(IN_1, LOW);
  digitalWrite(IN_2, LOW);
  digitalWrite(IN_3, LOW);
  digitalWrite(IN_4, LOW);
  delay(descanso);        //  DESCANSO antes de nueva pulsacion.

} // LL-void apaga_leds()

// ***********************FIN FUNCIONES  ************************
void setup()
{
  Serial.begin(9600);
  Serial.println("");
  Serial.println("========   A_A_MOTOR_PAP_MAQUINA_ESTADOS-INTERRUP_MS_4_FORO  =======  \n");


  pinMode (Sens_A,  INPUT);   // Sensor_Arriba - fin de carrera
  pinMode (Sens_B,  INPUT);   // Sensor_Abajo - fin de carrera
  pinMode (Puls_S,  INPUT);   // Pulsador Subida
  pinMode (Puls_B,  INPUT);   // Pulsador Bajada
  pinMode (Led_P,  OUTPUT);   // Led encendido: PARADA
  pinMode (   2,    INPUT);    // PULSADOR: INTERRUPCION/STOP

  //***************** CONEXIONES MOTOR  ****************

  pinMode (IN_1,  OUTPUT);    // CONEX-1 MOTOR
  pinMode (IN_2,  OUTPUT);    // CONEX-2 MOTOR
  pinMode (IN_3,  OUTPUT);    // CONEX-3 MOTOR
  pinMode (IN_4,  OUTPUT);    // CONEX-4 MOTOR
  
 // ****************** ANULACION ENCENDIDO LED 13  ****************
  pinMode (13,  OUTPUT); 
  digitalWrite (13, LOW);
 //****************************************************************

  // PULSANDO(2) pasa de LOW a HIGH ("RISING") Crea INTERRUPCION.
  attachInterrupt(digitalPinToInterrupt(2), INTERRU, RISING );

}


void loop()
{

  switch (ESTADO)
  {
    case PARADO:
      if (digitalRead(Puls_S) == HIGH) // puls_SUBE
    {
        ESTADO = SUBE;          // Envia a estado SUBE
    }
      if (digitalRead(Puls_B) == HIGH) // puls_BAJA
    {
        ESTADO = BAJA;          // Envia a estado BAJA
     }
      else
    {
        Serial.println ("====   PARADO ");
        digitalWrite (Led_P, HIGH); // Enciende Led indicador PARADO
        apaga_leds();  //  APAGA BOBINAS MOTOR
     }
      break;

    case SUBE:
      if (digitalRead(Sens_A) == HIGH)// sensor Arriba-FIN DE CARRERA
    {
        Serial.println ("====   SENSOR de ARRIBA ");
        ESTADO = PARADO ;             // Envia a estado PARADO
    }
      else
    {
        Serial.println ("====   SUBE ");
        digitalWrite (Led_P, LOW);    // Apaga Led indicador PARADO
        sube();
     }
      break;

    case BAJA:
      if (digitalRead(Sens_B) == HIGH)// sensor-Abajo-FIN DE CARRERA
    {
        Serial.println ("====   SENSOR de ABAJO");
        ESTADO = PARADO;              // Envia a estado PARADO
     }
      else
    {
        Serial.println ("====   BAJA ");
        digitalWrite (Led_P, LOW);      // Apaga Led indicador PARADO
        baja();
    }
      break;
  }
}

//**********************  FIN  **********************

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