Saludos. He estado intentando implementar un contador de personas para una puerta utilizando sensores del tipo IR 1838 (véase imagen adjunta)
El problema radica en que cuando alguien pasa una vez, me registra varios eventos. Quiero pensar que similar a un efecto rebote, pero aun usando retardos de tiempo este rebote no se va del todo.
¿Hay alguna manera mas eficiente de detectar la interrupción de trenes de pulsos ?
Adjunto el código que he desarrollado hasta ahora
/*Este código implementado en un Arduino Mega tiene la finalidad de determinar si alguien
* pasa por una puerta e imprimir un mensaje de "Entrada" o "Salida" de acuerdo al sentido en que cruce
* la persona. Se han utilizado 4 sensores IR 1838 para el monitoreo de la puerta,
* estos trabajan con ráfagas de pulsos a 38 kHz. La salida de los mismos es un tren
* de pulsos de aproximadamente 650 Hz, con un tiempo en alto de 920 uS y un tiempo
* bajo de 620 uS. En caso de no recibir rafagas, el sensor da una salida a +5V.
* Para el monitoreo de los sensores se ha utilizado interrupciones a nivel bajo,
* como contadores que se reinician cada 100 mS. En caso de que alguien pase entre
* los sensores, el conteo se vera interrumpido y de acuerdo a los sensores interrumpidos
* se dictamina que alguien ha entrado o salido. */
//Declaracion de Pines
const int sensorIR1 = 18; // Sensor Superior Entrada
const int sensorIR2 = 19; // Sensor Superior Salida
const int sensorIR3 = 20; // Sensor Inferior Entrada
const int sensorIR4 = 21; // Sensor Inferior Salida
//Variables donde guardo los pulsos generados por cada sensor IR
volatile int Pulse1=0;
volatile int Pulse2=0;
volatile int Pulse3=0;
volatile int Pulse4=0;
int counterBl=0;
//Variable para indicar que alguien paso por la puerta
bool YaPase=false;
//Variables para calculo de tiempo
unsigned long tiempo_actual;
unsigned long tiempo_anterior;
void setup() {
// put your setup code here, to run once:
pinMode(sensorIR1,INPUT_PULLUP);
pinMode(sensorIR2,INPUT_PULLUP);
pinMode(sensorIR3,INPUT_PULLUP);
pinMode(sensorIR4,INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(sensorIR1),DS1,FALLING);
attachInterrupt(digitalPinToInterrupt(sensorIR2),DS2,FALLING);
attachInterrupt(digitalPinToInterrupt(sensorIR3),DS3,FALLING);
attachInterrupt(digitalPinToInterrupt(sensorIR4),DS4,FALLING);
Serial.begin(9600);
}
void loop() {
tiempo_actual=millis();
YaPase=false;
//Muestreo cada 100 mS
if(tiempo_actual-tiempo_anterior >=100)
{ tiempo_anterior=tiempo_actual;
// Si los sensores de la entrada han contado menos que los de la salida
// y la suma de los 4 variables contadoras es menor o igual de 240 pulsos
// y la bandera que indica paso es falsa, entonces alguien entro.
if( (Pulse1+Pulse3<Pulse2+Pulse4) && ((Pulse1+Pulse2+Pulse3+Pulse4)<=240) && YaPase==false)
{
Serial.println("Entrada");
YaPase=true;}
// Si los sensores de la salida han contado menos que los de la entrada
// y la suma de los 4 variables contadoras es menor o igual de 240 pulsos
// y la bandera que indica paso es falsa alguien salio
if( (Pulse1+Pulse3>Pulse2+Pulse4) && ((Pulse1+Pulse2+Pulse3+Pulse4)<=240) && YaPase==false)
{
Serial.println("Salida");
YaPase=true; }
// Si alguien se queda parado en la puerta, entonces hay un bloqueo
if(Pulse1<20 && Pulse2<20 &&Pulse3<20 && Pulse4<20)
{ counterBl++;
if(counterBl>=30)
{ Serial.println("Bloqueo");
counterBl=0; }
}
Pulse1=0; Pulse2=0; Pulse3=0; Pulse4=0; // Reinicio de contadores
}
}
/*Rutinas de interrupción. Solo incrementan la variable por cada flanco de bajada*/
void DS1()
{ Pulse1++;}
void DS2()
{ Pulse2++;}
void DS3()
{ Pulse3++;}
void DS4()
{ Pulse4++; }
De antemano, gracias.