Programar dos sensores infrarrojos en arduino UNO R3

Hola amigos, estoy haciendo un proyecto que trata sobre un contador de entrada y salida de una tienda con arduino, tiene que llevar dos sensores infrarrojos (uno en cada puerta) y un display de 7 segmento con Circuito Integrado.

Cuando interrumpo la señal del "sensor_entrada" se tiene que sumar 1 a un contador, luego se tiene que mostrar el valor del contador en el display.
Cuando interrumpo la señal del "sensor_salida" se tiene que restar 1 al contador y luego volver a mostrar en el display.

Ya conecte todo bien en el arduino y la protoboard, el problema es al momento de programar.
No me deja poner las lecturas de los sensores seguido, si lo hago no me lee la segunda lectura, solo me lee la primera.
Saben como puedo solucionarlo?
Gracias de antemano : )

int A=2;
int B=3;
int C=4;
int D=5;
int sensor_entrada=8;
int sensor_salida=10;
int entrada=0;
int salida=0;
int contador=0;

void setup() {
pinMode(A,OUTPUT);
pinMode(B,OUTPUT);
pinMode(C,OUTPUT);
pinMode(D,OUTPUT);
pinMode(sensor_entrada,INPUT);
pinMode(sensor_salida,INPUT);
contador=0;
Serial.begin(9600);
}

void loop() {
entrada=digitalRead(sensor_entrada);
  if(entrada==LOW)
  {
    contador++;
do{
entrada=digitalRead(sensor_entrada);
 } while(entrada!=HIGH);
  }
salida=digitalRead(sensor_salida);
  if(salida==LOW)
  {
    contador--;
do{
salida=digitalRead(sensor_salida);
 } while(salida!=HIGH);
  }
if(contador<0){
contador=0;
}
else if(contador>9){
contador=0;
}
switch(contador)
  {
case 0:{
 cero();
 break;
}
case 1:{
uno();
 break;
}
case 2:{
 dos();
 break;
}
case 3:{
 tres();
 break;
}
case 4:{
cuatro();
 break;
}
case 5:{
 cinco();
 break;
}
case 6:{
seis();
 break;
}
case 7:{
 siete();
 break;
}
case 8:{
 ocho();
 break;
}
case 9:{
 nueve();
 break;
}
}

  }
  void cero(){
digitalWrite(A,0);
digitalWrite(B,0);
digitalWrite(C,0);
digitalWrite(D,0);
}
void uno(){
digitalWrite(A,1);
digitalWrite(B,0);
digitalWrite(C,0);
digitalWrite(D,0);
}
void dos(){
digitalWrite(A,0);
digitalWrite(B,1);
digitalWrite(C,0);
digitalWrite(D,0);
}
void tres(){
digitalWrite(A,1);
digitalWrite(B,1);
digitalWrite(C,0);
digitalWrite(D,0);
}
void cuatro(){
digitalWrite(A,0);
digitalWrite(B,0);
digitalWrite(C,1);
digitalWrite(D,0);
}
void cinco(){
digitalWrite(A,1);
digitalWrite(B,0);
digitalWrite(C,1);
digitalWrite(D,0);
}
void seis(){
digitalWrite(A,0);
digitalWrite(B,1);
digitalWrite(C,1);
digitalWrite(D,0);
}
void siete(){
digitalWrite(A,1);
digitalWrite(B,1);
digitalWrite(C,1);
digitalWrite(D,0);
}
void ocho(){
digitalWrite(A,0);
digitalWrite(B,0);
digitalWrite(C,0);
digitalWrite(D,1);
}
void nueve(){
digitalWrite(A,1);
digitalWrite(B,0);
digitalWrite(C,0);
digitalWrite(D,1);
}

Lo siento, no hablo español ... Usé Google Translate.

Debería escribir algo de depuración en el monitor serial para que pueda confirmar lo que está sucediendo.

void loop() 
{
  entrada=digitalRead(sensor_entrada);
  if(entrada==LOW)
  {
    contador++;
    Serial.println("Entrada");
    do
    {
      entrada=digitalRead(sensor_entrada);
    }
    while(entrada!=HIGH);
  }
  
  salida=digitalRead(sensor_salida);
  if(salida==LOW)
  {
    contador--;
    Serial.println("Salida");
    do
    {
      salida=digitalRead(sensor_salida);
    } 
    while(salida!=HIGH);
  }

Pruebe también un
delay (200);
después de leer las señales.

No te publico todo el código porque las salidas al display son las mismas.

int A = 2;
int B = 3;
int C = 4;
int D = 5;
int sensor_entrada = 8;
int sensor_salida = 10;
int entrada, entradaAnt = 0;
int salida, salidaAnt  = 0;
int contador = 0;

void setup()
{
    pinMode(A, OUTPUT);
    pinMode(B, OUTPUT);
    pinMode(C, OUTPUT);
    pinMode(D, OUTPUT);
    pinMode(sensor_entrada, INPUT);
    pinMode(sensor_salida, INPUT);
    contador = 0;
    Serial.begin(9600);
}

void loop() {

    entrada = digitalRead(sensor_entrada);
    if (entrada == LOW && entradaAnt == HIGH) {
        contador++;
        if (contador > 9) contador = 0;
    }
    entradaAnt = entrada;

    salida = digitalRead(sensor_salida);
    if (salida == LOW && salidaAnt == HIGH)  {
        contador--;
        if (contador < 0) contador = 0;
    }
    salidaAnt = salida;
    
    switch (contador)    {
        case 0:
            cero();
            break;
        case 1:
            uno();
            break;
        case 2:
            dos();
            break;
        case 3:
            tres();
            break;
        case 4:
            cuatro();
            break;
        case 5:
            cinco();
            break;
        case 6:
            seis();
            break;
        case 7:
            siete();
            break;
        case 8:
            ocho();
            break;
        case 9:
            nueve();
            break;
    }
}

Yo uso flacos no el sistema entreverado que preguntar el estado y luego el while si no se no ha cambiado.
El flanco asegura que solo se incrementa en ese caso. Tmb las condiciones del contador las consulto donde corresponde, no en el loop general porque nunca contador será menor que sero si lo incrementas y nunca sera mayor a 9 si lo decrementas.
Hay una mejora importante que simplifica el código en la salida al display 7 segmentos y es esta:

int A = 2;
int B = 3;
int C = 4;
int D = 5;
int sensor_entrada = 8;
int sensor_salida = 10;
int entrada, entradaAnt = 0;
int salida, salidaAnt  = 0;
int contador = 0;

void setup()
{
    pinMode(A, OUTPUT);
    pinMode(B, OUTPUT);
    pinMode(C, OUTPUT);
    pinMode(D, OUTPUT);
    pinMode(sensor_entrada, INPUT);
    pinMode(sensor_salida, INPUT);
    contador = 0;
    Serial.begin(9600);
}

void loop() {

    entrada = digitalRead(sensor_entrada);
    if (entrada == LOW && entradaAnt == HIGH) {
        contador++;
        if (contador > 9) contador = 0;
    }
    entradaAnt = entrada;

    salida = digitalRead(sensor_salida);
    if (salida == LOW && salidaAnt == HIGH)  {
        contador--;
        if (contador < 0) contador = 0;
    }
    salidaAnt = salida;
    
    presento7segmentos(contado)();

    
}

void presento7segmentos(byte tmp)
{
    digitalWrite(A, tmp && 0x01);
    digitalWrite(B, tmp && 0x02);
    digitalWrite(C, tmp && 0x04);
    digitalWrite(D, tmp && 0x08);
}

lo unico que cambia es que contador toma valores de 0 a 9. El valor de contador se envia a

presento7segmentos(contador);

la rutina lo unico que haces es toma el valor de la variable contador que ahora llamo tmp
tmp && 0x01 la enmascaro y obtengo los bits para cada caso
supongamos contador = 7
7 en su representación binaria de 4 bits es 0111
tmp && 0x01 = 0b00000111 & 0b00000001 = 1
tmp && 0x02 = 0b00000111 & 0b00000010 = 1
tmp && 0x04 = 0b00000111 & 0b00000100 = 1
tmp && 0x08 = 0b00000111 & 0b00001000 = 0
o sea obtienes lo mismo y ahorras 10 procedimientos como cero() a nueve()

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.