Automatizacion porton garaje

Hola,soy newbie, quizas no vaya en este foro pero al editar no soy capaz de cambiarlo para otro el tema es que me tire a la piscina con esto, el tema que me ocupa ahora es sustituir una electronica de un porton de garaje abatible que se quemo, mi idea es sustituirla por un arduino nano con dos reles de fuerza 24v cc y un modulador de pulsos para controlar el motor de 24v cc ( el modulador seria el ibt2), aprovecharia las señales de los finales de carrera que me llegan a la caja original , y probablemente le añada y que no esta implementado en el codigo una barrera fotosensible.
El funcionamiento intento que sea como la electronica original, el decir posicion inicial final de carrera inf pisado le damos un pulso y abre (hace una pequeña rampa de arranque) si mientras esta abriendo le doy otro pulso para, le doy otro pulso y baja, haciendo lo mismo si esta cerrando, por supuesto cuando pisa algun fin de carrera para. el problema que tengo es que no soy capaz de implementar en codigo el uso de millis() en la temporizacion de la rampa de subida o bajada y actualmente uso delay(), pero el problema que veo es de seguridad que si le doy un pulso mientras esta en la rampa de arranque no para hasta que no agota la temporizacion de los dos delays.
Os agradeceria me ayudaseis a implementar esa funcion en los void bjar y subir para que el micro no se detuviera en los delays

void subir()// programacion apertura puerta
   { 
    analogWrite(Pbajar,0);
    digitalWrite(Rf1,HIGH);
    analogWrite(Psubir,100);
    digitalWrite(Rf2,HIGH);
    delay(2000);
    for(subiendo=100; subiendo<=255; subiendo++){
    analogWrite(Psubir,subiendo);
    delay (10);
    abriendo=1;
    motor=1; 
    
       }
   }
  void bajar()// programacion cierre puerta
  {   
    analogWrite(Psubir,0);
    digitalWrite(Rf1,HIGH);
    analogWrite(Pbajar,100);
    digitalWrite(Rf2,HIGH);
    delay(2000);
    for(bajando=100; bajando<=255; bajando++){
    analogWrite(Pbajar,bajando);
    delay (10);
    cerrando=1;
    motor=1; 
    
       }

un saludo y gracias

yo tengo un proyecto similar al tuyo igual no lo e podido hacer funcionar.

yo solo necesito que suba y baje el portón.

asta el momento solo manejo un botón de fin de carrera(Cuando el portón esta abierto) pero creo que implementare otro para detectar cuando el portón allá bajado.

te envió un poco de código del que estoy manejando si lo usas es sobre tu propio riesgo jaja los 4 relay son por que usaba dos para una polaridad y luego los otros dos (subir y bajar)

si tienes alguna duda no dudes en preguntar si puedo pues ayudo ( no soy ni programador ni electronico)

void SUBIR(void) { CFIN = digitalRead(FINC); // Tengo definido el pin donde esta conectado el nboton fin de carrera Serial.println(" SUBIENDO"); while(CFIN == 1){ digitalWrite(rele3,HIGH); digitalWrite(rele4,HIGH); digitalWrite(rele1,LOW); digitalWrite(rele2,LOW); CFIN = digitalRead(FINC); // cada que pasa leo el pin hasta que el botón es presionado. (salgo del while y detengo el motor } STOP(); // solo apago se podría decir los relay

espero y te pueda ayudar así no dependes de tiempo sino exclusivamente de los pines de fin de carrera . mañana intentare con el l298n a ver si puedo hacer que funciones como quiero.

cualquier dato estaré actualizando los comentarios.