Problema con pulsadores y releé

Hola gente, soy nuevo en el foro y nuevo en Arduino.

Estoy tratando de programar un Arduino UNO, para controlar 2 persianas diferentes, con 2 pulsadores cada uno. si presiono un pulsador Sube, y si presiono el contrario Baja, anulando al anterior. Lo que no logro es que presionando el mismo pulsador este detenga la acción de Sube o Baja.

Cada persiana tiene distintos tiempos de subida y bajada, a modo de prueba he puesto 4seg y 5 seg, en realidad tardan 2min y 2,5min, la idea es que el retardo sea de 3min y utiliza el mismo fin de carrera del motor, una vez que resuelva el primer tema, acomodaré los tiempos. Estoy usando un modulo RF con 4 botones, como si fueran simples pulsadores y funciona perfecto.

El código base lo saqué de aquí mismo: Control Persianas ***** SOLUCIONADO ***** - Proyectos - Arduino Forum

Este es el codigo adaptado a mis necesidades...

const byte ReleSubir1  = 2;   // Relay In1
const byte ReleBajar1  = 3;   // Relay In2
const byte ReleSubir2  = 4;   // Relay In3
const byte ReleBajar2  = 5;   // Relay In4
const byte inputPin1 = 8;    // pulsador A
const byte inputPin2 = 9;    // pulsador B
const byte inputPin3 = 10;    // pulsador C
const byte inputPin4 = 11;    // pulsador D


int p1, p1Ant;
int p2, p2Ant;
int p3, p3Ant;
int p4, p4Ant;
int sube = 0;
int baja = 0;
int sube2 = 0;
int baja2 = 0;

unsigned long stime = 0;
unsigned long stime2 = 0;


void setup() {
  pinMode(ReleSubir1, OUTPUT);
  pinMode(ReleBajar1, OUTPUT);
  pinMode(ReleSubir2, OUTPUT);
  pinMode(ReleBajar2, OUTPUT);
  digitalWrite(2, HIGH); 
  digitalWrite(3, HIGH); 
  digitalWrite(4, HIGH); 
  digitalWrite(5, HIGH); 

  
  pinMode(inputPin1, INPUT_PULLUP);
  pinMode(inputPin2, INPUT_PULLUP);
  pinMode(inputPin3, INPUT_PULLUP);
  pinMode(inputPin4, INPUT_PULLUP);

  
}


void loop(){

      
  p1=digitalRead(inputPin1);
  p2=digitalRead(inputPin2);
  p3=digitalRead(inputPin3);
  p4=digitalRead(inputPin4);

  ///////////////////////////////////
 //Programa
 
     
 if (p1 == HIGH && p1Ant == LOW) {
        
    digitalWrite(ReleBajar1, HIGH);
    delay(2000);
    digitalWrite(ReleSubir1, LOW);
    sube = true; 
    baja = false;
    stime = millis();
 
}  

   
  if (p2 == HIGH && p2Ant == LOW) {
 
    digitalWrite(ReleSubir1, HIGH);
    delay(2000);
    digitalWrite(ReleBajar1, LOW);
    sube = false; 
    baja = true;
    stime = millis();


  }
  
  
  if (p3 == HIGH && p3Ant == LOW)  {
 
     digitalWrite(ReleBajar2, HIGH);
     delay (2000);
     digitalWrite(ReleSubir2, LOW);
     sube2 = true; 
     baja2 = false;
     stime2 = millis();
      
  }

    
  if (p4 == HIGH && p4Ant == LOW) {

     digitalWrite(ReleSubir2, HIGH);
     delay (2000);
     digitalWrite(ReleBajar2, LOW);
     sube2 = false; 
     baja2 = true;
     stime2 = millis();
          
    }
p1 = p1Ant;
p2 = p2Ant;
p3 = p3Ant;   
p4 = p4Ant;

  if (sube) {
     if (millis() - stime > 4000UL) {
        digitalWrite(ReleSubir1, HIGH);
        sube = false;
     }        
  }

  if (baja) {
     if (millis() - stime > 4000UL) {
        digitalWrite(ReleBajar1, HIGH);
        baja = false;
     } 
           
      
  }
  if (sube2) {
     if (millis() - stime2 > 5000UL) {
        digitalWrite(ReleSubir2, HIGH);
        sube2 = false;
     }        
  }

  if (baja2) {
     if (millis() - stime2 > 5000UL) {
        digitalWrite(ReleBajar2, HIGH);
        baja2 = false;
     }   
  }
    
}

Agradeceré de antemano cualquier ayuda, saludos!

Lo que ocurre es que como todo lo copiado no lo comprendes

Esto

if (p1 == HIGH && p1Ant == LOW) {
    digitalWrite(ReleBajar1, HIGH);
    delay(2000);
    digitalWrite(ReleSubir1, LOW);
    sube = true; 
    baja = false;
    stime = millis();
  }

Tiene un contrasentido gigantesco.
Si usas millis() que hace un delay(2000) ahi?

Esperas el cambio de un pulsador pero te detienes 2 seg? y traduce a minutos cuando lo uses.

Si usas millis() todo debe ser con millis() no parcializado.

Muchas gracias Surbyte por la respuesta!
Si, voy aprendiendo mediante la práctica y la asimilación, efectivamente sobre lo copiado voy interpretando y probando.

Esos 2 segundos, de cambio entre sube y baja, es para darle tiempo al motor a parar, es monofásico, mediante teclas comunes he comprobado que si no tiene ese tiempo de pare tiende a seguir con la carrera que traía.

Debería entonces sacar ese delay y agregar millis para la misma función?

Debería entonces sacar ese delay y agregar millis para la misma función?

Si no lo haces y tu quieres cambiar con los pulsadores algo no podras.

Tendras que armar una máquina de estados.

Mira en Documentación => indices de temas tutoriales => Maquina de Estados.

Hay algun ejemplo sobre el final en el que yo respondo y modifico un código por una máquina de estados.

@surbyte gracias por los consejos, estuve leyendo lo de las Maquinas de Estados...

Qué es y cómo funciona una maquina de estados

Comportamiento no esperado Delay ()

Fueron de mucha ayuda, ahora puedo ver en lo que estaba equivocado.

Lo que me genera duda ahora, son los estados que tengo, no se si tomar como referencia los pulsadores o los estados del relé.

Tengo la ayuda de mi hermano, que me aconsejó empezar todo de nuevo.

const byte ReleSubir1  = 2;   // Relay In1
const byte ReleBajar1  = 3;   // Relay In2
const byte ReleSubir2  = 4;   // Relay In3
const byte ReleBajar2  = 5;   // Relay In4
const byte inputPin1 = 8;    // pulsador A
const byte inputPin2 = 9;    // pulsador B
const byte inputPin3 = 10;    // pulsador C
const byte inputPin4 = 11;    // pulsador D

int pulsoP1, pulsoP2, pulsoP3,pulsoP4;
int tiempo, espera;

void setup() {
  pinMode(ReleSubir1, OUTPUT);
  pinMode(ReleBajar1, OUTPUT);
  pinMode(ReleSubir2, OUTPUT);
  pinMode(ReleBajar2, OUTPUT);

  pinMode(inputPin1, INPUT_PULLUP);
  pinMode(inputPin2, INPUT_PULLUP);
  pinMode(inputPin3, INPUT_PULLUP);
  pinMode(inputPin4, INPUT_PULLUP);

  digitalWrite(2, HIGH); 
  digitalWrite(3, HIGH); 
  digitalWrite(4, HIGH); 
  digitalWrite(5, HIGH); 

 int espera=200;
 int tiempo=0;

}

void loop() {
//  int espera=200;
 // int tiempo=0;

 // Comenté las variables espera y tiempo al inicio del loop()
 
 // tengo dudas de como funciona la secuencia (millis() - tiempo > espera) 
 // si es correcta para ajustar el efecto rebote
 // y si está bien aplicada en este código
 
  if( digitalRead(inputPin1) == HIGH) // Si pulsa Boton A
  {
   pulsoP1++;
   
    switch (pulsoP1)
    {
  case 1:
        
    // Mira condicion del Relebajar1, comprueba si está bajando
    
           if( (digitalRead(ReleBajar1) == LOW)  && (millis() - tiempo > espera) ) // antirrebote
            {
             digitalWrite(ReleBajar1,HIGH);  //  si esta bajando, lo para 
       
       // acá falta, sentencia para esperar 2 segundos
       
      }
       
           digitalWrite(ReleSubir1,LOW); // Sube persiana

       // acá falta, que corte a los 3 minutos

       break;
    case 2:
           digitalWrite(ReleSubir1,HIGH);   // Si aprieta dos veces el boton A, para de subir persiana
           tiempo = millis();
           pulsoP1 = 0;
           break;
    }
  }

//  Para la segunda condicion IF no se como toma la variable "tiempo",
// si hay que acumularle el tiempo ó poner acá "tiempo = 0;"

  if(digitalRead(inputPin2) == HIGH) // Si pulsa Boton B
  {
   pulsoP2++;
   
    switch (pulsoP2)
    {
  case 1:
        
    // Mira condicion del ReleSubir2, comprueba si está subiendo
    
           if( (digitalRead(ReleSubir1) == LOW) && (millis() - tiempo > espera)) // antirrebote
            {
             digitalWrite(ReleSubir1,HIGH);  //  si esta subiendo, lo para  


       // acá falta,  sentencia para esperar 2 segundos

       }
       
           digitalWrite(ReleBajar1,LOW); // Baja persiana
       
       // acá falta, que corte a los 3 minutos

       break;
    case 2:
           digitalWrite(ReleBajar1,HIGH);   // Si aprieta dos veces el boton B, para de bajar persiana
           tiempo = millis();
           pulsoP2 = 0;
           break;
    }
  }
  
}