Autor Tema: sencillo codigo contador ascendente/descendente no funciona correctamente  (Leído 8402 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
 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     


Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:sencillo codigo contador ascendente/descendente no funciona correctamente
« Respuesta #1 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. }

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:sencillo codigo contador ascendente/descendente no funciona correctamente
« Respuesta #2 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.

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re:sencillo codigo contador ascendente/descendente no funciona correctamente
« Respuesta #3 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

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:sencillo codigo contador ascendente/descendente no funciona correctamente
« Respuesta #4 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.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:sencillo codigo contador ascendente/descendente no funciona correctamente
« Respuesta #5 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.

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re:sencillo codigo contador ascendente/descendente no funciona correctamente
« Respuesta #6 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??

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:sencillo codigo contador ascendente/descendente no funciona correctamente
« Respuesta #7 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.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:sencillo codigo contador ascendente/descendente no funciona correctamente
« Respuesta #8 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.

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re:sencillo codigo contador ascendente/descendente no funciona correctamente
« Respuesta #9 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 :?

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:sencillo codigo contador ascendente/descendente no funciona correctamente
« Respuesta #10 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.

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re:sencillo codigo contador ascendente/descendente no funciona correctamente
« Respuesta #11 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   :(
« Última modificación: 19 de Septiembre de 2018, 21:34:11 por MINDFIELD »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:sencillo codigo contador ascendente/descendente no funciona correctamente
« Respuesta #12 en: 20 de Septiembre de 2018, 01:57:28 »
Todos los Arduinos tienen un conversor usb - serie. Viene ya con la placa.

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re:sencillo codigo contador ascendente/descendente no funciona correctamente
« Respuesta #13 en: 20 de Septiembre de 2018, 10:47:15 »
Si! Yo decía de mi pc

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:sencillo codigo contador ascendente/descendente no funciona correctamente
« Respuesta #14 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.