Conteo en arduino con ir sharp

Hola , estoy realizando un contador de personas que entran y salen de un salón, alguien sabe como se programaría este proyecto en arduino, tengo ya algo de código , pero no logro diferenciar correctamente las personas que salen de las que entran. Uso sensores IR uno para entrada y otro para detectar la salida, este es el código:

if (S1 > 155 && S2 < 155){ // si el primer sensor se activa y el segundo aun no, aumento el valor del registro entrada
nS1 ++;
escritura (); // llevo el registro a un subprograma donde imprimo por el monitor serial
}
if (S2 > 155 && S1 < 155){ //si el segundo sensor se activa y el primero aun no, aumento el valor del registro salida
nS2 ++;
escritura2 ();
}


en ocasiones funciona en otras no en otras cuenta en ambos sentidos en otras en cada sentido aumenta ambos registros.
 
Pon una flag para que el segundo sensor sepa que el primero se activo y que alguien va a pasar por él pronto, así hasta que no haya pasado no cometa el error de considerar que esta caminando al otro sentido. Lo otro y sería agregar un retraso lado que permita eso antes de que el otro sensor cuente.
 
Hola, gracias por responder. He usado el método de las banderas pero aunque detecta las señales en el orden que necesito, por alguna razón no aumenta el contador.

Lo probé de esta forma:
Código:
void loop() {
 float S1= analogRead(pinS1);
 Serial.println(S1);
 float S2= analogRead(pinS2);
 Serial.println(S2);
 if (S1 > 155 && S2 < 155){
   flag1= HIGH;
   flag2= LOW;
   if(flag1 == HIGH && S2 > 155){
     nS1 ++;
     flag1= LOW;  
   }
   
 }   
 if (S2 > 155 && S1 < 155){
   flag2= HIGH;
   flag1= LOW;
   if(flag2 == HIGH && S1 > 155){
    nS2 ++;  
    flag2= LOW; 
    
   } 
 }
 
Última edición por un moderador:
Observa esto, si tu codigo dice:

float S1= analogRead(pinS1);

y no sacas ningun promedio de las lecturas en el pin S1, significa que S1 es tipo "int",
Saludos
Americo8888
 
Bien, lo que tenias que hacer es emplear las banderas para entrar en while esperando al segundo sensor, entones es cuando la borras e incrementas el contador en el sentido adecuado. Como lo hiciste habría que pasar corriendo a una velocidad ridículamente alta para activar el segundo sensor a tiempo.

Las banderas solo es para detectar el orden y esperar, eso elimina el error de que al cruzar y activar solo el segundo sensor se cometa el error de que alguien esta saliendo, pero tienes que entrar en bucle a la espera de que ocurra eso, que la persona ya haya pasado por ambos sensores.

Un consejo extra, intenta conseguir los receptores infrarrojos de una TV o cualquier otro aparato, estos reciben una del señal modulada de al rededor 38kHz, pero la salida es una señal digital, usar eso con las interrupciones ye dará mejor velocidad de respuesta y reduce interferencia con fuentes externas, con el PWM puedes modular los LEDs a la frecuencia del transmisor, perros habría que revisar un poco el como hacerlo.
 
Última edición:
creo que no te entiendo bien , o por lo menos no comprendo la diferencia que haría entrar al bucle, lo que yo entiendo de la bandera y el while es esto:

void loop() {
int S1= analogRead(pinS1);
Serial.println(S1);
int S2= analogRead(pinS2);
Serial.println(S2);
if (S1 > 155 && S2 < 155){
flag1= HIGH;
while(flag1 == HIGH && S2 > 155){
nS1 ++;
flag1= LOW;
}
}
if (S2 > 155 && S1 < 155){
flag2= HIGH;
while(flag2 == HIGH && S1 > 155){
nS2 ++;
flag2= LOW;
}
}

pero sucede lo mismo que son el while
 
Mas bien era
Código:
while(flag1 == HIGH){
  if(S2 > 155){
    nS1 ++;
    flag1= LOW; 
  } 
}
Entras al buclue y dentro de este realizas tu consulta hasta detectar la condición, luego sales, el asunto es que esperes. Como lo pusiste anteriormente el if o while no se cumplen por que no es S2 > 155 (no se como es tu circuito así que solo estoy suponiendo que es al positivo el sensor) así que tu código de cuenta nunca se ejecuta.
 
Sí, el sensor está a positivo. Intentaré este cambio. Gracias por tu ayuda. :D

:( He incluido el while tal como pone Nuyel, pero al activarse un solo sensor, cualquiera de los dos, el buble se detiene, sólo anda si ambos están sensando y aumenta ambos contadores.
Le he puesto un delay empezando el while pero tampoco ayuda.
Los sensores que uso me entregan una variación de voltaje, el valor 155 es un umbral que he puesto para reconocer que hay un objeto obstruyendo.
 
Última edición por un moderador:
Puedes publicar tu código actual y la disposición física de los sensores? ahora ando en la universidad y el Arduino está en casa, aparte solo tengo un par de LDR pero creo que servirá para una prueba, cuando llegue te ayudo más.
Al principio supuse que los sensores se ubican uno dentro y otro fuera del marco de la puerta (una puerta única), en ese caso se rige por los siguientes puntos:
1: Se tienen dos sensores A(dentro) y B(fuera)
2: Si se activa el sensor X y el Y no está activado el objeto proviene de la posición del sensor que se activó primero.
3: El objeto se mueve de un sensor a otro por lo que el otro sensor debe esperar que el objeto que detectó el anterior haya pasado por él para confirmar el acceso y contar.
4: Si el objeto es muy grande puede activar simultáneamente ambos sensores durante un periodo de tiempo.
5: Si el objeto activa y desactiva un sensor pero no el otro significa que hubo aproximación pero no entró o salió de la habitación.

Eso fue basándome en el código inicial que publicaste, pero ya no se como está tú código, no deberías tener tantos problemas, aunque como lo pusiste antes es probable que se dé la tercera condición y solo cuente en positivo cuando se activen los dos por que no se vuelven a presentar las condiciones de los if, tras pasar por el primero y quedar activo solo el segundo se cumple el segundo if lo que terminaría en bucle esperando que el objeto pasara por el primero, esto te cometería un error en la cuenta.
 
actualmente el codigo esta asi:

int pinS1 = 3;
int pinS2 = 4;
int nS2;
int nS1;
int flag1;
int flag2;

void setup() {
Serial.begin(9600);
pinMode(pinS1, INPUT);
pinMode(pinS2, INPUT);
}

void loop() {
int S1= analogRead(pinS1);
Serial.println(S1);
int S2= analogRead(pinS2);
Serial.println(S2);
if (S1 > 155 && S2 < 155){
flag1= HIGH ;
while(flag1 == HIGH){
if(S2 > 155){
nS1 ++;
flag1= LOW;
}
}
}
if (S2 > 155 && S1 < 155){
flag2= 1 ;
while(flag1 == HIGH){
if(S2 > 155){
nS1 ++;
flag1= LOW;
}
}
}
Serial.println(nS1);
Serial.println(nS2);
Serial.println(flag1);
Serial.println(flag2);
delay(200);
}


la disposición de los sensores es tal como te la imaginas, uno después de otro en el marco de una única puerta a aproximadamente 10 cm de separación, adjunto la imagen de mi montaje de prueba , por el momento lo tengo en un icopor sobre la mesa pero haz de cuenta que el icopor es el marco de la puerta, la idea es que pasen personas. visto desde arriba una persona ocuparía aproximadamente 30 cm
 

Adjuntos

  • IMG_20141212_160501.jpg
    IMG_20141212_160501.jpg
    50.8 KB · Visitas: 5
Atrás
Arriba