Fallo en Control de persiana automatica

Buenas, vereis el caso es que en mi casa tengo una persiana "automatica" con dos pulsadores, uno arriba y otro abajo, pero tienes que mantener pulsado para que suba o baje.
El tema es con 2 reles de 220v controlo la pulsacion de los pulsadores, y con otro modulo de relés comandado por el arduino activo la señal de subir o de bajar que va al motor.

La parte que funciona es si pulso 2 veces el mismo pulsador y ha pasado menos de medio segundo, sube hasta arriba automaticamente o hasta abajo, eso si fuciona.
La parte que no funciona es que si lo mantengo pulsado, sin soltar, deberia subir hasta que yo suelto, y esa parte no entiendo por que no funciona en mi codigo.

Los relés comandados por el arduino se activan si la señal es LOW, a ver si algun entendido le echa un ojo al codigo y puede resolver que es lo que pasa.

const int I1=3; //Pulsador arriba
const int I2=4; //Pulsador abajo
const int O1=6; //Contacto subida
const int O2=8; //Contacto bajada

  int pulsador1=0;
  int pulsador2=0;
  int actual1=0;
  int actual2=0;
  int anterior1=0;
  int anterior2=0;
  unsigned long t1=0; //Temporizador para delay de contactos
  unsigned long t2=0;
  unsigned long tc=0; //Temporizadores para delay de activacion
  unsigned long tact=0;

void setup() {
  Serial.begin(9600);
  pinMode(I1, INPUT);  //Declaracion de entradas y salidas
  pinMode(I2, INPUT);
  pinMode(O1, OUTPUT);
  pinMode(O2, OUTPUT);
}

void loop() {
  actual1=digitalRead(I1);   //Lectura del valor actual de pulsadores
  actual2=digitalRead(I2);
   if (actual1 == HIGH)  //Prueba para ver si mientras esta pulsado esta el motor encendido
   {
    Serial.println(actual1); //La señal funciona, pero no pone la salida en LOW
    digitalWrite(01, LOW);
    
    delay(50);
   }
   if (actual2 == HIGH)
   {
    Serial.println(actual2);
    digitalWrite(02, LOW);
    
    delay(50);
   }

  if (actual1 != anterior1) {    // Si el valor cambia es que se ha pulsado
    if (actual1 == LOW) {         //Si cambia a 1 es porque antes estaba inactivo, ha pulsado
      pulsador1++;
      if (pulsador1==1) {         //Aumentamos el contador de pulsaciones
        t1=millis();
        digitalWrite(O1, LOW); //Iniciamos la temporizacion entre pulsaciones
      }
    }
    anterior1=actual1;
  }
  if (actual2 != anterior2) {     //Lo mismo para la bajada
    if (actual2 == LOW) {
      pulsador2++;
      if (pulsador2==1) {
        t2=millis();
        digitalWrite(O2, LOW);
      }
    }
    anterior2=actual2;
  }
  if (pulsador1 > 0) {               //Si se ha pulsado comprobamos si han sido 2 veces y si ha pasado el tiempo minimo
    if ((pulsador1 == 2) && ((millis()-t1) <= 500 )) {
      digitalWrite(O1, LOW);                                  //Si se cumplen las condiciones activamos y temporizamos
      tc=millis();
      tact=millis();
      while ((tact-tc)<=21000){         //Mientras dure la temporizacion solo se sale del bucle si se activa algun pulsador
        tact=millis();
        if((digitalRead(I1)==HIGH) || (digitalRead(I2)==HIGH)){
          delay(50);
          actual1=LOW;
          actual2=LOW;
          pulsador1=0;
          pulsador2=0;
          tact=tc+30000;                //Si se activa algun pulsador hacemos que la condicion del bucle sea falsa
        }
      }
      digitalWrite(O1, HIGH);             //Y apagamos el motor
      delay(300);
    }
    if ((millis()-t1)>500) {
      pulsador1=0;
      digitalWrite(O1, HIGH);
    }
  }
  if (pulsador2 > 0) {                           //Lo mismo para la bajada
    if ((pulsador2 == 2) && ((millis()-t2) <= 500 )) {
      digitalWrite(O2, LOW);
      tc=millis();
      tact=millis();
      while ((tact-tc)<=21000){
        tact=millis();
        if((digitalRead(I1)==HIGH) || (digitalRead(I2)==HIGH)){
          actual1=LOW;
          actual2=LOW;
          tact=tc+30000;
          pulsador2=0;
          pulsador1=0;
        }
      }
      digitalWrite(O2, HIGH);
      delay(300);
    }
    if ((millis()-t2)>500) {
      pulsador2=0;
      digitalWrite(O2, HIGH);
    }
  }


}

Persianafinnuevo.ino (3.16 KB)

Por lo que entiendo de tu código si mantienes presionado p1 o p2 haces esto, hablamos de mas de 500 mseg

if ((millis()-t1) > 500) {
      pulsador1 = 0;
      digitalWrite(O1, HIGH);
    }

Pones a 0 pulsador1 o 2 y detienes el motor.
Lo activas cuando detectas HIGH pero luego entras en este parte del código que miras primero si presionaste 2 veces dentro de 500mseg y si no ejecutas esta parte.

En realidad lo que debe detener tu motor es que soltaste el botón.
De todas maneras LA FORMA en que lo haces me parece complicada.
Mira si la resuelves y si estoy en lo cierto, claro está.
Sino te sugeriré otro modo de encarar tu problema.

Gracias por contestar! Pero el tema de que cuando la entrada sea LOW apague el motor asi directamente no me sirve, porque si ha pulsado y soltado 2 veces dentro de los 500ms debe seguir funcionando.

Lo de que en esos 500ms el motor siga funcionando es por que el motor no pegue 2 tirones tan rapidos, para suavizar los 2 picos de corriente que pegaría. No se puede hacer como yo digo?
Puede ser que si que lo haya hecho un poco complicado, pero tengo nociones muy basicas de programacion y no se optimizar bien las cosas, se te ocurre alguna otra manera?

De todas formas la primera parte que pone:

if (actual1 == HIGH)  
   {
    Serial.println(actual1);
    digitalWrite(01, LOW);
   
    delay(50);
   }

No llega a funcionar bien, ese es el trozo que me mosquea porque el serialprint si detecta "actual1" en HIGH asi que el condicional funciona, pero sin embargo no activa el motor, o lo activa y por otro lado de codigo que no consigo encontrar lo desactiva tan rapido que es imperceptible