Pages: [1]   Go Down
Author Topic: Ayuda código contador analógico  (Read 874 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 1
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

//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!!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 543
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Creo que lo que ocurre es que en ningún sitio pones la variable pasovuelta1 a LOW. Prueba a ver:
Code:
if (fotovalor1>1000){
    pasoVuelta1=HIGH;
} else {
    pasoVuelta1=LOW;
}

o bien tal vez funcione directamente:
Code:
pasoVuelta1=(fotovalor>1000)
« Last Edit: August 05, 2013, 04:53:18 pm by noter » Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 543
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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}
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 543
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 smiley):
Code:
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
Logged

Cordoba
Offline Offline
God Member
*****
Karma: 41
Posts: 718
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

El que pregunta aprende, el que responde aprende a responder.

Offline Offline
Jr. Member
**
Karma: 1
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!

Logged

Pages: [1]   Go Up
Jump to: