TODOPIC

Otros Microcontroladores / Dispositivos programables => Arduino => Mensaje iniciado por: MINDFIELD en 18 de Septiembre de 2018, 08:25:33

Título: sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: MINDFIELD en 18 de Septiembre de 2018, 08:25:33
 Hola a todos tengo una consulta con un programita en arduino y es que tengo un codigo que con dos pulsadores tiene que sumar o restar según el botón que se pulse... es un contador ascendente/descendente pero al iniciar la simulación tengo que pulsar sumar y el mensaje me muestra 1 pero despues no suma más, hasta que apreto el botón de restar y hace el proceso normal de ahí y despues funciona correctamente pero el problema está cuando inicia el programa porque se queda como en un bucle y no entiendo el porque... ahí pongo en codigo

Código: [Seleccionar]
        // Pin de entrada del sensor fototransistor (negro)
        int Fototransistor = 7;   

        // Variable que registra el estado del sensor de entrada
        int ValorFototransistor = 0;

        // Variable que registra el numero de personas que pasaron por el sensor
        int Contadorpersonas = 0;

        // Pin de la conexion de LED rojo
        int LedRojo = 10;

        int Sensor = 6;
        int ValorSensor = 0;

        // Configuracion Pantalla LCD
        #include <LiquidCrystal.h>
        LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // pines para pantalla LCD

        void setup()
        {
          Serial.begin(9600);           
          pinMode(Fototransistor, INPUT);   
          pinMode(LedRojo, OUTPUT);
          pinMode(Sensor, INPUT);
         
          // Informacion pantalla inicial
          lcd.begin(16, 2);
          lcd.setCursor(0,0);
          lcd.print("Contador: 0");
          lcd.setCursor(0,1);
        //  lcd.print("Ulibertadores");

        }

        void loop()
        {
          // Establecer la variable ValorFototransistor con el estado del sensor pin 7
          ValorFototransistor = digitalRead(Fototransistor);
          ValorSensor = digitalRead(Sensor);

          //Muestra toda la Informacion de los sensores en el monitor serie **** mostrar en la consola de arduino que esta sucediendo en el prog
        //  Serial.print("ValorFototransistor : ");
        //  Serial.println(ValorFototransistor);
        //  delay(100);

          // Comprobar si el estado del sensor de entrada ha cambiado
          if(ValorFototransistor!=1) // validación cuando el fototransistor deja de recibir luz del infrarojo
          {
            digitalWrite(LedRojo, LOW);
            Contadorpersonas=Contadorpersonas+1;
           
        //    Serial.print("Contador: ");
            Serial.println(Contadorpersonas);
            while(digitalRead(Fototransistor)!=1)
              {
              delay(100);
        //      Serial.println ( "El Sensor se detuvo o esta siendo obstruido!"); // esta siendo obstruido por un objeto o el led rojo falló
              }
              // BORRAMOS TODA LA PANTALLA PARA ACTUALIZARLA CADA SEGUNDO
          lcd.clear();
           lcd.print("Contador: 0");
          lcd.setCursor(0,1);
          // Se Actualiza la pantalla LCD con el valor del contador
            lcd.setCursor(10,0);
            lcd.print(Contadorpersonas);
          }
        /*  else
            {
            digitalWrite(LedRojo, HIGH); // Cuando el Sensor recibe luz infraroja, El led se enciente
            }*/


        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


            if(ValorSensor!=1) // validación cuando el fototransistor deja de recibir luz del infrarojo
          {
            digitalWrite(LedRojo, LOW);
            Contadorpersonas=Contadorpersonas-1;
           
        //    Serial.print("Contador: ");
          //  Serial.println(Contadorpersonas);  lo saqué
            while(digitalRead(Sensor)!=1)
              {
              delay(100);
        //      Serial.println ( "El Sensor se detuvo o esta siendo obstruido!"); // esta siendo obstruido por un objeto o el led rojo falló
              }
              // BORRAMOS TODA LA PANTALLA PARA ACTUALIZARLA CADA SEGUNDO
          lcd.clear();
           lcd.print("Contador: 0");
          lcd.setCursor(0,1);
          // Se Actualiza la pantalla LCD con el valor del contador
            lcd.setCursor(10,0);
            lcd.print(Contadorpersonas);
          }
          else
            {
            digitalWrite(LedRojo, HIGH); // Cuando el Sensor recibe luz infraroja, El led se enciente
            }
           
        }

    Editar / Borrar Editar mensaje   Respuesta rápida a este mensaje Responder   Citar Citar   Multi-Citar este mensaje     

Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: Picuino en 18 de Septiembre de 2018, 10:37:59
Da un poco de pereza tener que leer todo el programa para solucionar un problema tan concreto.
Te recomiendo que pruebes los programas por secciones pequeñas, y una vez que funcionen vas juntándolas.

Por ahora copio el programa con formato mejorado (presionando Ctrl-t en el IDE de Arduino):
Código: C
  1. // Pin de entrada del sensor fototransistor (negro)
  2. int Fototransistor = 7;
  3.  
  4. // Variable que registra el estado del sensor de entrada
  5. int ValorFototransistor = 0;
  6.  
  7. // Variable que registra el numero de personas que pasaron por el sensor
  8. int Contadorpersonas = 0;
  9.  
  10. // Pin de la conexion de LED rojo
  11. int LedRojo = 10;
  12.  
  13. int Sensor = 6;
  14. int ValorSensor = 0;
  15.  
  16. // Configuracion Pantalla LCD
  17. #include <LiquidCrystal.h>
  18. LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // pines para pantalla LCD
  19.  
  20. void setup()
  21. {
  22.   Serial.begin(9600);
  23.   pinMode(Fototransistor, INPUT);
  24.   pinMode(LedRojo, OUTPUT);
  25.   pinMode(Sensor, INPUT);
  26.  
  27.   // Informacion pantalla inicial
  28.   lcd.begin(16, 2);
  29.   lcd.setCursor(0, 0);
  30.   lcd.print("Contador: 0");
  31.   lcd.setCursor(0, 1);
  32.   //  lcd.print("Ulibertadores");
  33.  
  34. }
  35.  
  36. void loop()
  37. {
  38.   // Establecer la variable ValorFototransistor con el estado del sensor pin 7
  39.   ValorFototransistor = digitalRead(Fototransistor);
  40.   ValorSensor = digitalRead(Sensor);
  41.  
  42.   //Muestra toda la Informacion de los sensores en el monitor serie **** mostrar en la consola de arduino que esta sucediendo en el prog
  43.   //  Serial.print("ValorFototransistor : ");
  44.   //  Serial.println(ValorFototransistor);
  45.   //  delay(100);
  46.  
  47.   // Comprobar si el estado del sensor de entrada ha cambiado
  48.   if (ValorFototransistor != 1) // validación cuando el fototransistor deja de recibir luz del infrarojo
  49.   {
  50.     digitalWrite(LedRojo, LOW);
  51.     Contadorpersonas = Contadorpersonas + 1;
  52.  
  53.     //    Serial.print("Contador: ");
  54.     Serial.println(Contadorpersonas);
  55.     while (digitalRead(Fototransistor) != 1)
  56.     {
  57.       delay(100);
  58.       //      Serial.println ( "El Sensor se detuvo o esta siendo obstruido!"); // esta siendo obstruido por un objeto o el led rojo falló
  59.     }
  60.     // BORRAMOS TODA LA PANTALLA PARA ACTUALIZARLA CADA SEGUNDO
  61.     lcd.clear();
  62.     lcd.print("Contador: 0");
  63.     lcd.setCursor(0, 1);
  64.     // Se Actualiza la pantalla LCD con el valor del contador
  65.     lcd.setCursor(10, 0);
  66.     lcd.print(Contadorpersonas);
  67.   }
  68.   /*  else
  69.       {
  70.       digitalWrite(LedRojo, HIGH); // Cuando el Sensor recibe luz infraroja, El led se enciente
  71.       }*/
  72.  
  73.  
  74.   ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  75.  
  76.  
  77.   if (ValorSensor != 1) // validación cuando el fototransistor deja de recibir luz del infrarojo
  78.   {
  79.     digitalWrite(LedRojo, LOW);
  80.     Contadorpersonas = Contadorpersonas - 1;
  81.  
  82.     //    Serial.print("Contador: ");
  83.     //  Serial.println(Contadorpersonas);  lo saqué
  84.     while (digitalRead(Sensor) != 1)
  85.     {
  86.       delay(100);
  87.       //      Serial.println ( "El Sensor se detuvo o esta siendo obstruido!"); // esta siendo obstruido por un objeto o el led rojo falló
  88.     }
  89.     // BORRAMOS TODA LA PANTALLA PARA ACTUALIZARLA CADA SEGUNDO
  90.     lcd.clear();
  91.     lcd.print("Contador: 0");
  92.     lcd.setCursor(0, 1);
  93.     // Se Actualiza la pantalla LCD con el valor del contador
  94.     lcd.setCursor(10, 0);
  95.     lcd.print(Contadorpersonas);
  96.   }
  97.   else
  98.   {
  99.     digitalWrite(LedRojo, HIGH); // Cuando el Sensor recibe luz infraroja, El led se enciente
  100.   }
  101.  
  102. }
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: Picuino en 18 de Septiembre de 2018, 10:48:41
Por lo pronto lo que veo es que dejas al Arduino metido en un bucle cada vez que se activa un sensor, sin atender al otro sensor.

Este programa es multitarea, por lo que te recomiendo que utilices alguna técnica multitarea (por ejemplo un sistema operativo de tiempo real o una máquina de estados).

Por lo demás no parece que el programa tenga que dar ese problema que comentas. Prueba a añadir Serial.println("a"); con diferentes letras en diferentes puntos del programa. Así podrás saber donde está el programa en todo momento y hacer un debug.

Saludos.
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: MINDFIELD en 18 de Septiembre de 2018, 20:15:14
no entiendo porque es multitarea? solo son dos botónes que necesitan ser leidos, pero no ubico tú respuesta en ese punto
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: Picuino en 19 de Septiembre de 2018, 02:11:59
Multitarea porque debería responder a los dos sensores a la vez. Tu programa, mientras atiende un sensor, no atiende al otro.
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: Picuino en 19 de Septiembre de 2018, 02:18:33
En este caso es sencillo resolverlo. Se puede hacer añadiendo un filtro a los sensores mediante un contador, quitando todos los delay para trabajar con millis() que cuenta milisegundos.

Cuando el contador de milisegundos llegue a un valor alto, la entrada se considera activada.
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: MINDFIELD en 19 de Septiembre de 2018, 13:56:50
ok lo simplifique este es el codigo que hace lo mismo

Código: [Seleccionar]
void loop()
{
  estadoBoton1 = digitalRead(6);
  estadoBoton2 = digitalRead(7);

  if (estadoBoton1 == LOW)
  {
    digitalWrite(LedRojo, LOW);
    numero = numero + 1;
  }

  if (estadoBoton2 == LOW)
  {
    digitalWrite(LedRojo, LOW);
    numero = numero - 1;
  }

  lcd.clear();
  lcd.print("Contador: 0");
  lcd.setCursor(10, 0);
  lcd.print(numero);
  delay(100);
}

al comienzo de la simulación si apreto el botón de subir entra en un bucle de conteo descendente y despues si apreto el botón de bajar comienza a funcionar normal... y si al comienzo apreto el botón de bajar entra en un bucle de conteo ascendente despues si apreto el botón de subir comienza a funcionar normalmente... porque hace esto solo con dos if uno por botón??? nunca me paso esto en pic... quiero saber porque entra en un bucle si sólo tengo 2 if??
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: Picuino en 19 de Septiembre de 2018, 16:02:51
El programa está bien. Solo falta un if para que no cuente por debajo de cero. Puede deberse al circuito conectado.

¿Qué simulación utilizas?

Con Serial.print(estadoBoton1) puedes hacer debug de la señal interna.
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: Picuino en 19 de Septiembre de 2018, 16:07:55
Creo que el problema es que debes contar flancos. Almacena tambien el estado anterior del botón.
Cuenta numeros solo si el valor del sensor vale uno y el valor anterior era cero.
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: MINDFIELD en 19 de Septiembre de 2018, 16:46:19
Para simular uso proteus 8 pero me queda la duda si el problema es el hardware simulado ya que en proteus los butons y swintchs activos no son de mi confianza... ahí me queda el 50% de la duda :?
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: Picuino en 19 de Septiembre de 2018, 17:09:00
Prueba con un Arduino. Es bastante sencillo. En vez de LCD puedes utilizar el Serial.print()
Yo no me fio mucho de las simulaciones.

Un saludo.
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: MINDFIELD en 19 de Septiembre de 2018, 21:29:52
pero necesito el puerto serie? porque no tengo!  :shock: lo unico que tengo es el DB15 HDMI y los USB   :(
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: Picuino en 20 de Septiembre de 2018, 01:57:28
Todos los Arduinos tienen un conversor usb - serie. Viene ya con la placa.
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: MINDFIELD en 20 de Septiembre de 2018, 10:47:15
Si! Yo decía de mi pc
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: Picuino en 20 de Septiembre de 2018, 14:55:18
Si no tienes un Arduino, no te compliques.

Puedes subir el proyecto de Proteus y probablemente otro te podrá ayudar (yo no lo tengo instalado)

Un saludo.
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: MINDFIELD en 20 de Septiembre de 2018, 16:02:45
No para un minuto y lee lo que escribí! tengo un arduino mega 2560 pero tengo una notbook que no tiene el puerto serie
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: Picuino en 20 de Septiembre de 2018, 16:42:45
Pues usalo.
https://aprendiendoarduino.wordpress.com/2016/11/09/uart-y-usb-en-arduino/
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: Picuino en 20 de Septiembre de 2018, 16:44:11
Todos los Arduinos tienen un conversor usb - serie. Viene ya con la placa.
Título: Re:sencillo codigo contador ascendente/descendente no funciona correctamente
Publicado por: MINDFIELD en 20 de Septiembre de 2018, 23:44:16
listo! cambie el codigo un poco

Código: [Seleccionar]
void loop()
{
  estadoBoton1 = digitalRead(6);
  estadoBoton2 = digitalRead(7);

  if (estadoBoton1 == LOW)
  {
    digitalWrite(LedRojo, 1);
    numero = numero + 1;
  }
  else
  {
     if (estadoBoton2 == LOW)
  {
    digitalWrite(LedRojo, 1);
    numero = numero - 1;
  }
  else
  {
   digitalWrite(LedRojo, LOW); // Cuando el Sensor recibe luz infraroja, El led se enciente
  }
  }

así no intenta hacer dos procesos juntos como dices aunque dudo mucho ese punto... despues lei que

Si el pin no está conectado a nada, digitalRead () puede devolver HIGH o LOW (y esto puede cambiar aleatóriamente).

en base a eso cambie un poquito la configuracion en los pines de entrada ya que el arduino se confundia y funciono bien en la simulacion!!

lo único que lamento es que puse las entradas conectadas al vcc mediante las R's pero esa vaina es configurable a gusto :D

Creo que por mi parte doy por finalizado este tema aunque mañana si puedo voy a volve con el codigo anterior y lo voy a probar para descartar un error de codigo! saludos y gracias tú ayuda me obligo a pensar un poco más y llegar a la respuesta!