Contador bidirecional de personas con 2 modulos sensor infrarrojo

Buenos dias.
En primer lugar dar enormemente las gracias aquellas personas que utilizan el bien mas preciado (su tiempo) a ayudar a los demás. espero alguna vez tener el suficiente nivel para poder hacer lo mismo.
Llevo tiempo en arduino pero como si empezara porque soy un poco torpe en la materia.
Estaba intentando hacer un contador de personas con una placa arduino y dos modulos de sensores de infrarrojos. Estos modulos como sabeis dan la señal invertida.
He visto varios proyectos similares, pero queria hacer mi propio codigo para intentar solucionar algunos detalles.
El principal problema que me encuentro es que a veces se hace un lio y en vez de sumar resta y viceversa cuando no ha realizado la secuencia correcta completa.(Puede darse el caso en la realidad)
Secuencia de entrada Fase 1: Sensor1 = 1, Sensor 2 = 0(Iniciando entrada)
Fase 2 : Sensor 1 =1 , sensor 2 = 1(Persona en medio de la puerta).
Fase3 : Sensor 1 = 0, Sensor 2 =1(Persona a punto de terminar de entar)
Fase4 : Sensor 1= 0, Sensor 2 = 0(Persona ya ha entrado )

En el caso de salir la secuencia es en modo inverso como adjunto en el codigo.
No se si debo anidar algun if o introducir algun else para solucionarlo pero cada vez que lo toco lo dejo peor.
Otro problema y este es muy tonto es que le pongo que si hay numeros negativos ponga 0 y ni caso,sigue poniéndomelos negativo.
Los sensores irian en paralelo y las personas entarian o saldrian de una en una ya que es una puerta pequeña.

Ante todo gracias por vuestro tiempo. :clap:

int pinSensor1 = 2;
int pinSensor2 = 12;
String estado = "empezando";
int cuenta;

void setup() {
  Serial.begin(9600);
  pinMode(pinSensor1, INPUT);
  pinMode(pinSensor2, INPUT);

}

void loop() {
  int sensor1 = digitalRead(pinSensor1); /* Leemos el valor del Sensor 1*/
  int sensor1Def = !sensor1; /*Invertimos el valor del sensor 1*/
  int sensor2 = digitalRead(pinSensor2); /*Leemos el valor del Sensor 1*/
  int sensor2Def = !sensor2; /* Invertimoss el valor del sensor 2 */


  if (estado == "empezando" && sensor1Def == 1 && sensor2Def == 0) { // empezamos and sensor1=1 y sensor2=0

    estado = "iniciando_entrada"; //Ponemos estado en "iniciando entrada"
  }

  if ( estado == "iniciando_entrada" && sensor1Def == 1 && sensor2Def == 1) { // Entrada al 50%

    estado = "Entrada_50%";
  }

  if (estado == "Entrada_50%" && sensor1Def == 0 && sensor2Def == 1) { // A punto de finlizar la entrada

    estado = "Entrada_75%";
  }

  if (estado == "Entrada_75%" && sensor1Def == 0 && sensor2Def == 0) { // Fin de entrada
    estado = "empezando";
    cuenta = cuenta + 1;

  }

  ////////////////////////////// SALIDA/////////////////////////////////
  if (estado == "empezando" && sensor1Def == 0 && sensor2Def == 1) { //Si empezamos and sensor1 detecta y sensor2=0

    estado = "iniciando_salida"; //Ponemos estado en "iniciando entrada"
  }

  if ( estado == "iniciando_salida" && sensor1Def == 1 && sensor2Def == 1) { // Entrada al 50%

    estado = "Salida_50%";
  }

  if (estado == "Salida_50%" && sensor1Def == 1 && sensor2Def == 0) { // A punto de finlizar la entrada

    estado = "Salida_75%";
  }

  if (estado == "Salida_75%" && sensor1Def == 0 && sensor2Def == 0) { // Fin de entrada
    estado = "empezando";
    cuenta = cuenta - 1;
    if (cuenta == -1) {
      cuenta == 0;
    }

  }





  /*Serial.print("Valor del sensor1  ");
    Serial.println(sensor1Def);

    Serial.print("Valor del sensor2  ");
    Serial.println(sensor2Def);
  */
  //Serial.print("NUMERO DE PERSONAS");
  Serial.println(cuenta);


}

Hola @Kymera. En primer lugar corrige como posteas el codigo ya no vale con el " [co de],[/co de] " como antes, ahora selecciona el codigo y pica en la pestaña " <> ".
Tu codigo funciona correcta mente lo he simulado con dos botones en una protoboard y no da problemas, solo le pasa lo de los numeros negativos y es que donde has puesto:

if (cuenta == -1) {
cuenta == 0;

deberia poner:

if (cuenta == -1) {
cuenta = 0;

como ves te sobraba un " = "
Saludos.

1 Like

Muchisimas gracias Gonpezzi :slightly_smiling_face: . Supongo entonces que me hace cosas raras por el sensor de ifrarrojos.
¿Has probado hacerle secuencias incompletas de entradas y salidas con los botones?
Buen detalle del =.

Lo dicho gracias por la ayuda y por tu tiempo, Gonpezzi. :wave:

Si, y tal como esta el codigo no las admite.

Igual está implementada "más o menos", estaba corrigiendo el código pero cuando @gonpezzi probó tu código y encontró el error, ya no tenía mucho sentido, por eso lo marqué para borrar.

De tu enfoque no me gusta el uso que haces de las strings, por eso te planteaba otro punto de vista y la idea de usar enum fue para asemejarlo a tus cadenas.

Respecto a los "pases incompletos", tendrías que definir un tiempo dentro del cual un paso se considera válido, ese control de tiempo lo haces con millis().

Saludos

Ok, gracias Gonpezzi.
A raiz de tus comentarios he probado con otros detectores infrarrojos y si va como tu bien indicabas.

Muchas gracias gatul lo tendre muy en cuenta.

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