Problema contador de objetos con laser y LDR

Hola buenos días, estoy teniendo problemas al programar mi Arduino para poder contar la cantidad de objetos que pasan por una cinta transportadora con un modulo láser y un LDR.

Se supone que al pasar un objeto se corta la señal y se suma uno a el contador mostrándose en el serial de la plaqueta, pero el problema es que el objeto si es grande o se corta demasiado tiempo la señal entonces se cuenta muchas veces. ¿Como puedo solucionarlo? :confused:

Adjunto el código:

int laser = 13;
int ldr = A0;
int contador = 0;
int valor =0;
int led = 2;
void setup() {
  Serial.begin (9600);
  pinMode(laser, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(ldr, INPUT);
}

void loop() {
  digitalWrite (laser, HIGH);
  valor = analogRead (ldr);
  if (valor >= 1000)  {
    contador++;
  }
  if (valor <= 1000) {
    digitalWrite (led, HIGH);
    Serial.println ("Han entrado");
      Serial.print (contador);
      Serial.println (" objetos");
      Serial.println (valor);
      delay(1000);
      digitalWrite (led, LOW);
  }
}

Muchas gracias!

Te ocurre porque cada vez que se ejecuta el loop y mientras no incide el laser sigues sumando al contador y el contenido del loop puede ejecutarse decenas de veces en un segundo.....Una posible solucion es añadir una variable booleana a modo de flag que inicialmente es false y te sirva para distinguir si esta pasando un objeto.

Hola lucasdep,

Creo que en este caso te sería más útil usar un while en lugar de un if.

Mientras LDR recibe luz del láser no pasa objeto, o viceversa, mientras LDR no recibe luz de láser es porqué pasa objeto.

Vigila el delay, en función de la velocidad de la cinta o la proximidad de los objetos te puede jugar una mala pasada.

Saludos.

Hola jose, Me podrias explicar como añadir la variable booleana como un flag, recien estoy empezando con Arduino y no entiendo mucho todavia.

He probado utilizando el while pero no me esta funcionanado, directamente no recibo nada en el serial. :-/

Prueba esto a ver,ahora no puedo probar.

bool detectando = false;
int contador = 0;
void setup() {
  Serial.begin(9600);
  // put your setup code here, to run once:

}

void loop() {
  int lectura = analogRead(A0);      // Uso los valores de lectura que tu pones en los condicionales,tu sabras si son correctos o no.
  if(lectura >= 1000 && detectando){ // El laser incide en ldr (poca resistencia ,valor alto) y estabamos detectando objeto(variable detectando == true):el objeto ha pasado.
    contador ++;
    detectando = false;
    Serial.println("Ha pasado objeto numero:" + String(contador));
  }
  if(lectura <= 1000 && detectando == false) { // Si laser no incide y no estaba detectando,el objeto acaba de entrar.
    detectando = true;
    Serial.println("Objeto detectado");
  }
}

He probado utilizando el while pero no me esta funcionanado, directamente no recibo nada en el serial.

Recuerda que dentro del bucle debes recoger el dato del ldr que es el que compruebas en cada vuelta, el contador debes incrementarlo solo cuando detectes el objeto. Échale un ojo a esto:

void loop() {
  
  digitalWrite (laser, HIGH);
  valor = analogRead (ldr);
  while (valor <= 999)  {      // Está pasando un objeto
    digitalWrite (led, HIGH);    // Enciendo led 
    valor = analogRead (ldr);  // Compruebo datos del ldr 
    if (valor >= 1000){          // No interfiere nada entre laser y ldr (ha acabado de pasar objeto) 
        digitalWrite (led, LOW); //Apaga led
        contador++;               // Incremento contador   
    }
  }
  Serial.println ("Han entrado " + String(contador) + String(" objetos."));
  delay(1000);

}

Hola, disculpen la demora,
primero agradecerles por todas las respuestas, todas las soluciones funcionaron como buscaba.
ArduMyth, estoy usando un modulo LDR (fotoresistencia) y un modulo láser, gracias por la ayuda pero me podrias explicar esta linea del codigo:

Serial.println("Numero objetos pasados por la cinta: "+String(contador));
}
    
    //Añadimos el tiempo actual para repetir el ciclo
    // cada 100 milisegundos
    tiempo_lectura = millis() + debounce;

Además adjunto imágenes como requeriste del circuito: