Go Down

Topic: Ayuda código contador analógico (Read 980 times) previous topic - next topic

UndercoverNerd

Hola. Tengo una pequeña duda que seguro que es una tontería, pero llevo toda la tarde.

Intento hacer un contador a partir de un sensor analógico, imaginaos, cada vez que una fotocélula pase de un valor de 1000, una variable cuente uno más.
Seguro que es una tontería, porque en digital (con un botón) lo he hecho sin problema, pero aquí me da problemas.
Os paso el código que estoy haciendo por si os sugiere algo:

Code: [Select]


//esto fuera del loop:
int pasoVuelta1=LOW;
int lastpasoVuelta1=LOW


//esto va dentro del loop

if (fotovalor1>1000){
pasoVuelta1=HIGH;

};



  if (pasoVuelta1 != lastpasoVuelta1) {          // the button state has changed!
    if (pasoVuelta1==HIGH) {                // check if the button is pressed
      vueltas1++;

      }

    }
  lastpasoVuelta1 = pasoVuelta1;                 // save the new state in our variable



No entiendo por qué, pero solo cuenta hasta uno, luego se queda ahí


Gracias!!

fermg

No te suma más que uno porque al final igualas las 2 variables

  lastpasoVuelta1 = pasoVuelta1;                 

y en la anterior variable le dices que para que te cuente tiene que ser diferentes los estados

if (pasoVuelta1 != lastpasoVuelta1) {          // the button state has changed!
    if (pasoVuelta1==HIGH) {                // check if the button is pressed
      vueltas1++;

      }

   no le cambias en ningún momento la variable primera, tienes las dos en HIGH, o por lo menos es lo que yo veo pero puedo estar confundido, echale un vistazo por si acaso

saludo

noter

#2
Aug 05, 2013, 11:30 pm Last Edit: Aug 05, 2013, 11:53 pm by noter Reason: 1
Creo que lo que ocurre es que en ningún sitio pones la variable pasovuelta1 a LOW. Prueba a ver:
Code: [Select]

if (fotovalor1>1000){
   pasoVuelta1=HIGH;
} else {
   pasoVuelta1=LOW;
}


o bien tal vez funcione directamente:
Code: [Select]

pasoVuelta1=(fotovalor>1000)

UndercoverNerd

Hola.
A ver, creo que no me he explicado bien.

Lo que quiero es que el sensor haga mediciones continuas, y cada vez que el sensor llegue a mil, cuente uno más, y si está 20 segundos midiendo mil, cuente como uno sólo. Es decir, que no vaya sumando mientras que el sensor pase de mil, sino que actúe como un interruptor.
El símil sería que actuara como un interruptor y cuente uno cada vez que hace ON/OFF, y no que cuente MIENTRAS esté en ON.

El problema con la solución de if/else que proponéis es que cuenta uno cuando pasa de mil, pero al volver a bajar de mil, sigue contando, ya que las variables son desiguales.


Muchas gracias por las respuestas!

Voy a seguir haciendo pruebas, que debe ser una tontería.

noter

No sé si has mirado bien tu propio código, pero cuando miras la variable compruebas dos cosas: que haya cambiado y que sea HIGH. Creo que el código con la pequeña variación que te he dado debería incrementar cada vez que pasa de LOW a HIGH, es decir, debería hacer lo que señalas. Otro tema es que pueda haber algún tipo de rebote en la señal.

UndercoverNerd

Hola noter.
Efectivamente, con el ELSE funciona, pero añadiéndole un pequeño parche. Ahora sí va fino.
En el else, aparte de apagar pasoVuelta1, hay que apagar lastpasoVuelta1 para que sean iguales, y no entre en el otro bucle.
La verdad es que no sé si el código es muy ortodoxo, pero así funciona.
Gracias!
Así ha quedado.

Code: [Select]

if (fotovalor1>=1000){
pasoVuelta1=HIGH;
}
else{
pasoVuelta1=LOW;
lastpasoVuelta1=LOW;
}




  if (pasoVuelta1 != lastpasoVuelta1) {          // the button state has changed!
    if (pasoVuelta1=HIGH) {                // check if the button is pressed
      vueltas1++;
      }

    }
  lastpasoVuelta1 = pasoVuelta1;                 // save the new state in our variable
 
[/code}

noter

Pues no debiera ser necesario poner en el else el lastpasoVuelta1=LOW, ya que igualas ambas variables al final del loop:
lastpasoVuelta1 = pasoVuelta1;

Si has copiado y pegado tu código tal cual, has cometido un error frecuente en la programación c, que parece ser que ha quedado compensado por la línea que añadiste al else, ya que donde has puesto
if (pasoVuelta1=HIGH)
debería poner
if (pasoVuelta1==HIGH)
(Este error no figuraba en tu código inicial).
En resumen, prueba a ver:
Code: [Select]

if (fotovalor1>=1000){
    pasoVuelta1=HIGH;
}
else{
    pasoVuelta1=LOW;
}

if (pasoVuelta1 != lastpasoVuelta1) {          // the button state has changed!
    if (pasoVuelta1==HIGH) {                // check if the button is pressed
        vueltas1++;
    }
}
lastpasoVuelta1 = pasoVuelta1;   // actualizamos lastpasoVuelta1


O bien (más condensado :)):
Code: [Select]

pasoVuelta1=(fotovalor1>=1000); // Presupongo que HIGH y LOW equivalen a TRUE y FALSE
if (pasoVuelta1 != lastpasoVuelta1 && pasoVuelta1==HIGH) {                // si el estado ha cambiado y el actual es HIGH
      vueltas1++;
      }
lastpasoVuelta1 = pasoVuelta1;                 // save the new state in our variable

maxid

y si lo transformas a digital? con un divisor resistivo lo calibras al valor esperado para que te de un 1, y usas la interrupcion por cambio de estado.
El que pregunta aprende, el que responde aprende a responder.

UndercoverNerd

Buenas.
@noter: con lo que dices ya funciona, efectivamente era la tontería del "=" en vez de "==". Gracias!
@maxid: de momento lo tengo claro así, no creo necesario pasarlo a digital, pero gracias tambien!


Go Up