Error Contador con led infrarrojo (SOLUCIONADO)

Amigos, soy nuevo en el mundo de arduino, necesito ayuda por favor.
Les explico: Quiero hacer un contador de visitar, tengo 2 led infrarrojos que cuando pasa una persona suma cuando se corta la señal, pero mi problema es que cuando dejo cortada la señal suma y suma y lo que no se hacer es que solo quede como una persona más.
Les dejo mi codigo

const int analogInPin = A1; // Pin del Fototransistor
const int OutPin = 13;      // Pin para el led indicador
 
int sensorValue = 0;        
int contador = 0;           

void setup() {
  // Inicializamos la comunicacion serial a 9600 bps:
  Serial.begin(9600); 
  pinMode(OutPin, OUTPUT);
}
 
void loop() {
 
  sensorValue = analogRead(analogInPin); 
   
  
  
 if(sensorValue > 500)
  {
   digitalWrite(OutPin, HIGH);
   contador = contador +1;
   }
  else
  {
    digitalWrite(OutPin, LOW);
   
    
  }
   
  // Imprimimos el valor en el monitor.
  Serial.print("contador = " );                       
  Serial.println(contador);     
 
  delay(250);                     
}

Primero la bronca. Por favor, lee las normas del foro, las tienes al principio de cada subforo, el tema Normas del FORO EN ESPAÑOL. En el punto 5, verás que un título como "Ayuda por favor" no es correcto, ya que no es descriptivo del problema. Por favor, edita el primer mensaje del post, y substituyelo por algo que describa realmente el problema. Además, has duplicado el post, de forma que voy a pedir a un moderador que elimine el duplicado, ya que no aporta nada.

Ahora vamos a por la solución. Necesitas usar una variable de estado, de forma que, mientras está cortado el haz de luz, no cuente más, y reiniciar ese estado, cuando se restablezca el haz de luz.

Lo primero que vamos a hacer, es declarar la variable de estado, del tipo boolean, antes del setup.

boolean estado = false; // Variable de estado

Usamos una boolean, porque no necesitamos más, y ocupa solamente un byte de memoria. Lo que vamos a hacer, es que, mientras no pase nadie por la puerta, la variable de estado será false. y cuando pase alguien, será true. Ahora, lo que hacemos es que en al if, le añadimos el estado==false, y cuando se cumpla el if, cambiamos el estado a true:

  if (sensorValue > 500 && estado == false)
  {
    digitalWrite(OutPin, HIGH);
    contador = contador + 1;
    estado = true;
  }

Este if, se cumplirá en el momento en que empiece a pasar alguien, y tape el haz de luz. En ese momento, el led del pin 13 se enciende, se cuenta una persona al contado, y el estado pasa a true. Mientras esté el haz de luz interrumpido, no se volverá a cumplir más este if, ya que, aunque el sensorValue sea mayor que 500, el estado sigue estando en true.

Una vez que la persona ha pasado del todo y se restablece el haz de luz, tenemos que restablecer también el estado a false, de forma que eliminamos el else que había antes, y lo substituimos por otro if:

  if (sensorValue < 500 && estado == true)
  {
    digitalWrite(OutPin, LOW);
    estado = false;
  }

Este if, solo se cumple, cuando ha pasado alguien, puso el estado en true, y deja libre de nuevo el haz de luz. En ese momento, el led se apaga y cambia el estado a false, de forma que deja vía libre al contador, para la siguiente persona que entra.

Prueba a implementar esto y me dices que tal va. Yo lo he probado y me funciona.

Bueno yo agrego que no entiendo porque lo lees con un pin analógico cuando se trata SUPUESTAMENTE de una seña digital.
No hace falta comparar con 500 sino con HIGH y LOW
para ellos defines en lugar de
const int analogInPin = A1;
usa cualquiera menos el que estas usando para el led como entrada
supongamos el 2
entonces

 // No hace falta definir los pines como const int cuando solo son menores a 255 o sea byte
const byte irPin = 2;  // Pin del Fototransistor
const byte OutPin = 13;      // Pin para el led indicador
 
int sensorValue = 0;        
int contador = 0;           

void setup() {
  // Inicializamos la comunicacion serial a 9600 bps:
  Serial.begin(9600); 
  pinMode(OutPin, OUTPUT);
  pinMode(irPin, INPUT);
}
 
void loop() {
 
  sensorValue = digitalRead(irPin); 
   
  
 if(sensorValue == HIGH and sensorValueAnt == LOW) // con esto solo vemos una transición 0 a 1
  {                                                                          // paso algo disparo. Lo demás no.
   digitalWrite(OutPin, HIGH);
   contador = contador +1;
   }
  else
  {
    digitalWrite(OutPin, LOW);
   
    
  }
   
  sensorValueAnt = SensorValue;

  // Imprimimos el valor en el monitor.
  Serial.print("contador = " );                       
  Serial.println(contador);     
 
  delay(250);                     
}

Requiere que el sensor se ponga en 1 cuando se interrumpe el haz, sino invertir LOW y HIGH en el if.

Bueno, yo no he querido entrar en eso. He pensado que si lo hacía así, tendría sus razones, y la verdad es que funciona. Yo también he hecho las pruebas con un pin digital, pero finalmente, he decidido no cambiar esa parte.

Te comprendo carmeloco pero ni tu ni yo lo haríamos de ese modo.
Solo intento que vea que usar algo digital en un pin analógico es uso equivocado del arduino, aunque claro que funciona pero lo sigue siendo un concepto equivoado.

En realidad lo que hace es medir digamos casi 2.5V y si es mayor hace algo y sino lo contrario.
Pero para que si leerlo digitalmente es mas rápido?

Estimados muchas gracias.
Si tuve un inconveniente, se me duplico el post no supe como borrarlo.
lo deje de las dos formas
Forma uno carmeloco :

const int analogInPin = A1; // Pin del Fototransistor
const int OutPin = 13;      // Pin para el led indicador
 
int sensorValue = 0;        
int contador = 0;           
boolean estado = false; // Variable de estado

void setup() {
  // Inicializamos la comunicacion serial a 9600 bps:
  Serial.begin(9600); 
  pinMode(OutPin, OUTPUT);
}
 
void loop() {
 
  sensorValue = analogRead(analogInPin); 
   
  
  
 if(sensorValue > 500 && estado == false)
  {
   digitalWrite(OutPin, HIGH);
   contador = contador +1;
   estado = true;
   }
  else if (sensorValue < 500 && estado == true)
  {
    digitalWrite(OutPin, LOW);
    estado = false;
   
    
  }
   
  // Imprimimos el valor en el monitor.
  Serial.print("contador = " );                       
  Serial.println(contador);     
 
  delay(150);                     
}

y de esta forma surbyte

const byte irPin = A1; // Pin del Fototransistor
const byte OutPin = 13;      // Pin para el led indicador
 
int sensorValue = 0;        
int contador = 0;           
boolean estado = false; // Variable de estado


void setup() {
  // Inicializamos la comunicacion serial a 9600 bps:
  Serial.begin(9600); 
  pinMode(OutPin, OUTPUT);
  pinMode(irPin, INPUT);
}
 
void loop() {
 
  sensorValue = digitalRead(irPin); 
   
  
  
 if(sensorValue == HIGH && estado == false)
  {
   digitalWrite(OutPin, HIGH);
   contador = contador +1;
   estado = true;
   }
  else if (sensorValue == LOW &&  estado == true)
  {
    digitalWrite(OutPin, LOW);
    estado = false;
      
  }
   
  // Imprimimos el valor en el monitor.
  Serial.print("contador = " );                       
  Serial.println(contador);     
 
  delay(250);                     
}

Antes hacia la comparacion de > 500 por que no siempre me marcaba, tenia que pasar algo bien grueso para que no detecte la señal.

Muchas Gracias :smiley:

bueno mezclaste mi código de un modo raro.
La modificación de tu código solo funciona para una transición 0 a 1 asi que todo lo demás debe apagar digitalWrite(OutPin, LOW); de modo que no se para que le pones

if (sensorValue == LOW &&  estado == true)

basta con

else 
       digitalWrite(OutPin, LOW);

prueba y luego me cuentas.
y además no es con estado sino con el estado anterior del pin que es LOW.

Hay que pensar en el cambio de estado y en el contador, por eso no sirve un simple else.

Cuando se cumple el primer if, el estado cambia a true, para que no cuente más mientras la persona está pasando. Si en vez del segundo if, ponemos ese else, volvemos a cambiar el estado a false, mientras está pasando la persona y cuenta más veces de las que queremos que cuente.

Por cierto, se puede quitar el else antes del segundo if.