Detener banda transportador por 4 segundos con sensor infrarrojo

HOLA, tengo que crear una cinta transportador capaz de cambiar dirección, velocidad, con 4 sensores IR, 1 para encender, 1 para paro definitivo y dos para que pare y después de 4 segundo se active de nuevo.
El problemas es que al momento de detectar un objeto la banda no se reactiva después de los 4 segundos debido a que el sensor se queda activo.

/*Velocidad y Direccion*/
int pulsadorizq=2;
int pulsadorder=3;
int pot=A0;
int IN3=7;
int IN4=8;
int ENB=9;
int statusizq;
int statusder;
int value;
int total;
/*Sensores*/
const int entrada1 = A1;
const int entrada2= A2;
const int entrada4= A4;
int estado1;
int estado2;
int estado4;

void setup() {
  /*Velocidad y Direccion*/
    pinMode(pulsadorizq,INPUT);
    pinMode(pulsadorder,INPUT);
    pinMode(pot,INPUT);
    pinMode(IN3,OUTPUT);
    pinMode(IN4,OUTPUT);
    pinMode(ENB,OUTPUT);
    /*Sensores*/
    pinMode(entrada1,INPUT);
    pinMode(entrada2,INPUT);    
    pinMode(entrada4,INPUT);
  }

  void loop() {
    /*Sensores*/
     estado1 = digitalRead(entrada1);
if( estado1 == LOW){       /*Detecta Objeto*/
  digitalWrite(IN3,HIGH);  /*Enciende Motor*/
  digitalWrite(IN4,LOW);
    }

    estado2 = digitalRead(entrada2);
if( estado2 == LOW){        /*Detecta Objeto*/
  digitalWrite(IN3,LOW);     /*Apaga el motor*/
  digitalWrite(IN4,LOW);
  delay(4000);                             /*Pasan 4 segundos*/
  digitalWrite(IN3,HIGH);          /*Deberia encender el motor*/
  digitalWrite(IN4,LOW);
    }
    
    estado4 = digitalRead(entrada4);
if( estado4 == LOW){         /*Detecta Objeto*/
  digitalWrite(IN3,LOW);     /*Apaga Motor*/
  digitalWrite(IN4,LOW);
    }
    /*Velocidad y Direccion*/
    statusizq= digitalRead(pulsadorizq);
    statusder= digitalRead(pulsadorder);
    value= analogRead(pot);
    total=map(value,0,1023,0,255);
    analogWrite(ENB,total);
    Serial.println(total);
    if(statusizq==HIGH){
      digitalWrite(IN3,HIGH);
      digitalWrite(IN4,LOW);
    }else{
      if(statusder==HIGH){
        digitalWrite(IN3,LOW);
        digitalWrite(IN4,HIGH);
      }
    }
    delay(100);

    
}  

Tienes que trabajar con el flanco de la señal del sensor, si solo trabajas con el estado "actual" lógicamente desactivas nuevamente el motor.

Lées el sensor y lo comparas con el estado anterior, si pasa de alto a bajo apagas el motor y demás, finalmente guardas el estado para la siguiente lectura.

Algo así

bool estado2ant = true;

// luego en loop()

estado2 = digitalRead(entrada1); 
if (estado2 != estado2ant) {
  if (estado2 == LOW) { /*Detecta Objeto*/
    digitalWrite(IN3, LOW); /*Apaga el motor*/
    digitalWrite(IN4, LOW);
    delay(4000); /*Pasan 4 segundos*/ 
    digitalWrite(IN3, HIGH); /*Deberia encender el motor*/
    digitalWrite(IN4, LOW);
  }
  estado2ant = estado2;
}

Este código es mas funcional aunque resta considerar el accionar del potenciómetro que por lo que veo solo ajusta velocidad del motor.
Los 3 detectores IR ahora funcionan con simultaneidad.
La sugerencia anterior no te permite esto que te comento porque el delay(4000) lo impide x 4 segundos.

/*Velocidad y Direccion*/
int pulsadorizq = 2;
int pulsadorder = 3;
int pot = A0;
int IN3 = 7;
int IN4 = 8;
int ENB = 9;
int statusizq;
int statusder;
int value;
int total;
/*Sensores*/
const int entrada1 = A1;
const int entrada2 = A2;
const int entrada4 = A4;
int estado1, estado1Ant;
int estado2, estado2Ant;
int estado4, estado4Ant;
bool iniciaAccion = false;
unsigned long inicioTime;
byte modo = 0;

void setup() {
  /*Velocidad y Direccion*/
  pinMode(pulsadorizq, INPUT);
  pinMode(pulsadorder, INPUT);
  pinMode(pot, INPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(ENB, OUTPUT);
  /*Sensores*/
  pinMode(entrada1, INPUT_PULLUP);
  pinMode(entrada2, INPUT_PULLUP);
  pinMode(entrada4, INPUT_PULLUP);
  Serial.begin(115200);
}

void loop() {
  /*Sensores*/
  estado1 = digitalRead(entrada1);
  if (!estado1 && estado1Ant) {      /*Detecta Objeto*/
    Serial.println("Enciendo motor x IR1");
    digitalWrite(IN3, HIGH); /*Enciende Motor*/
    digitalWrite(IN4, LOW);
  }
  estado1Ant = estado1;

  estado2 = digitalRead(entrada2);
  if (!estado2 && estado2Ant) {     /*Detecta Objeto*/
      Serial.println("Secuencia Motor 4seg IR2");
      iniciaAccion = true;
      modo = 0;
  }
  estado2Ant = estado2;
  if (iniciaAccion ) {
    switch (modo) {
      case 0: Serial.println("apago motor x IR2");
              digitalWrite(IN3, LOW); /*Apaga el motor*/
              digitalWrite(IN4, LOW);
              inicioTime = millis();
              modo = 1;
              break;
      case 1: if (millis() - inicioTime > 4000UL){
                  Serial.println("Enciendo motor x IR2");
                  digitalWrite(IN3, HIGH); /*Deberia encender el motor*/
                  digitalWrite(IN4, LOW);
                  modo = 2;
              }
              break;
      case 2: modo = 0;
              Serial.println("Dejo listo para proxima acción");
              iniciaAccion = false;
              break;
    }
  }

  estado4 = digitalRead(entrada4);
  if (!estado4 && estado4Ant) {     /*Detecta Objeto*/
      Serial.println("Apaga motor x IR4");
      digitalWrite(IN3, LOW); /*Apaga Motor*/
      digitalWrite(IN4, LOW);
  }
  estado4Ant = estado4;

  /*Velocidad y Direccion*/
  statusizq = digitalRead(pulsadorizq);
  statusder = digitalRead(pulsadorder);
  value = analogRead(pot);
  total = map(value, 0, 1023, 0, 255);
  analogWrite(ENB, total);
  Serial.println(total);
  if (statusizq == HIGH) {
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
  } else {
    if (statusder == HIGH) {
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, HIGH);
    }
  }
  delay(100);
}

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