Sensor de barrera con IR Led, fotodiodo y deteccion sonora con buzzer

Hola buenas tardes amigos

Ando haciendo una especie de barrera infrarroja, con fotodiodos e infrarrojos, van hacer 3 sensores colocados a cierta distancia entre ellos, colocados de arriba hacia abajo, entonces cuando pase un objeto en este caso una cajita ara la siguiente condiciones:
si los 3 detectan algo no pasa nada,
ahora que si solo 2 o 1 de ellas detectan se manda una señal para que manda a sonar un buzzer y mande una señal de alto que dure 30 segundos…

comento ando haciendo una especie de banda transportadora ya hice la parte mecánica, pero me falta la de los sensores, que es la que quiero combinar con el código de motor a pasos que les dejo acá abajo e igual les dejo el diagrama de conexión por si les interesa :3…

PD: no se si alguien ya abra hecho algo por el estilo si es así realmente se lo agradecería :smiley:

int velocidad = 2;
int direccion = 3;
int reset = 9;
int pasos = 50;

// the setup routine runs once when you press reset:
void setup() {
  // initialize the digital pin as an output.
  pinMode(velocidad, OUTPUT);
  pinMode(direccion, OUTPUT);
  pinMode(reset, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(reset, LOW); //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
  delay(0);
  digitalWrite(reset, LOW);   //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.
  digitalWrite(direccion, LOW);


  for (int i = 0; i < pasos; i++)   //Equivale al numero de vueltas (200 es 360º grados) o micropasos
  {
    digitalWrite(velocidad, HIGH);  // This LOW to HIGH change is what creates the
    digitalWrite(velocidad, LOW); // al A4988 de avanzar una vez por cada pulso de energia.
    delayMicroseconds(15000); // Regula la velocidad, cuanto mas bajo mas velocidad.

  }

}

el delayMicroseconds de tu control de servos no va con lo que escribi al comienzo.
yo te muestro como podria ser el tema de la detcción de los sensores.
Suponiendo que una barrera que tiene emisor y receptor iluminados esta en 1 y cuando un objeto la interrumpe se pone en 0.

const byte velocidad = 2;
const byte direccion = 3;
const byte reset = 9;
const byte Sensor1 = 4;
const byte Sensor2 = 5;
const byte Sensor3 = 6;
const byte buzzer = 7
int pasos = 50;
boolean alarma = false;
unsigned long start;

// the setup routine runs once when you press reset:
void setup() {
  // initialize the digital pin as an output.
  pinMode(Sensor1, INPUT);
  pinMode(Sensor2, INPUT);
  pinMode(Sensor3, INPUT);
  
  pinMode(velocidad, OUTPUT);
  pinMode(direccion, OUTPUT);
  pinMode(reset, OUTPUT);
  pinMode(buzzer, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  barrera = (digitalRead(Sensor3) << 2) | (digitalRead(Sensor2) << 1) | digitalRead(Sensor1); 
  //  Tabla de verdad
  //  SSS
  //  321
  //  000 = 0  Ninguna Activa
  //  001 = 1  1 barrera activa
  //  010 = 2  1 barrera activa
  //  011 = 3  Dos barreras activas
  //  100 = 4  1 barrera activa
  //  101 = 5  Dos barreras activas
  //  110 = 6  Dos barreras activas
  //  111 = 7  Tres barreras IR activas
  
  if (barrera != 7) {
     digitalWrite(buzzer, LOW);
     alarma = false;
  }
  else { 
     alarma = true;
     start = millis();
     digitalWrite(buzzer, HIGH); // ACtivo Alarma
  }
  if  (alarma) {
      if (millis() - start > 30000UL) {  // si supero los 30 * 1000 mseg detengo.
          alarma = false;
         digitalWrite(buzzer, LOW); // Apago buzzer ?
         // falta incluir la señal 
      }
  }
  
 
  digitalWrite(reset, LOW); //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
 
   digitalWrite(reset, LOW);   //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.
  digitalWrite(direccion, LOW);


  for (int i = 0; i < pasos; i++)   //Equivale al numero de vueltas (200 es 360º grados) o micropasos
  {
    digitalWrite(velocidad, HIGH);  // This LOW to HIGH change is what creates the
    digitalWrite(velocidad, LOW); // al A4988 de avanzar una vez por cada pulso de energia.
    
    // esta linea atenta contra lo que esta arriba. El conteo de los 30 segundos no sera preciso por usar alguna forma de delay
    delayMicroseconds(15000); // Regula la velocidad, cuanto mas bajo mas velocidad.
  }

}

:O

Vale amigo ahorita lo checo, apenas vi el comentario que pusiste, solo termino unas cosas con la maqueta que ando haciendo de la banda y pruebo el codigo con el circuito :3

y muchas gracias por responder :D

SE AGRADECE BASTANTE !!!!!!

surbyte Excelente GRACIAS funciona como lo imagine :o !!!

te molesto por una vez mas D:
en esta parte …

{
  barrera = (digitalRead(Sensor3) << 1) | (digitalRead(Sensor2) << 2) | digitalRead(Sensor1); 
  //  Tabla de verdad
  //  SSS
  //  321
  //  000 = 0  Ninguna Activa
  //  001 = 1  1 barrera activa
  //  010 = 2  1 barrera activa
  //  011 = 3  Dos barreras activas
  //  100 = 4  1 barrera activa
  //  101 = 5  Dos barreras activas
  //  110 = 6  Dos barreras activas
  //  111 = 7  Tres barreras IR activas
  
  if (barrera != 7) {
     digitalWrite(buzzer, LOW);
     alarma = false;
  }

yo lo cambio por el “7” por un “6” para que la alarma se activen solamente con 2 sensores, mi duda es como agrego para que también suene con 1 solo fotodiodo ???

seria algo como esto ??

** if (barrera != 6, 2) { ???**

Vamos a cambiar el enfoque ya que veo que tu has cambiado el problema. Siempre ocurre lo mismo. Para detectar 1, 2 o 3, simplemente sumamos y me olvido de la conversion de binario a decimal.

barrera = !(digitalRead(Sensor3) + !(digitalRead(Sensor2) + !digitalRead(Sensor1);

Como dijismos que un sensor al detectar un objeto se pone en 0, voy a invertirlo con un negador Entonces si un sensor detecta se pone en 1, si no detecta estará en 0, okay?

Supongamos que detectas un solo Sensor entonces 1,2 o 3 estarán en 1 => 1 es solo 1 sensor Si dos detectas, se sumará 2 => 2 son 2 sensores detectados y lo mismo para los 3. Cambia solo eso y compara contra la cantidad de sensores que quieras.

SUpongamos que busques 2 sensores como has preguntado

if (barrera == 2) {
     alarma = true;
     start = millis();
     digitalWrite(buzzer, HIGH); // ACtivo Alarma
  }
  else { 
     digitalWrite(buzzer, LOW);
     alarma = false;   
  }

Hola buenos días surbyte GRACIAS se agradece mucho, saliendo del trabajo pruebo el código de nuevo :D.

Si tengo otra duda te molestaría de nuevo.

Saludos y excelente inicio de semana !! .


surbyte GRACIAS ya quedo en cuando termine el proyecto veo como publicarlo por acá para compartirlo saludos :D !!!