Arduino, proyecto calcular cadencia en bicicleta

#1
Saludos a esta comunidad, primero decir que esta página es un magnifico trabajo, de verdad, me ha servido mucho, no puedo estar mas satisfecho. Así que, gracias de verdad.

Como no, necesito vuestra ayuda, porque estoy estancado, os cuento brevemente:

Tengo que realizar un proyecto de en el que trabajando con una bicicleta estatica, gracias a arduino saque los valores de temperatura antes y despues del freno de la rueda (tengo dos sensores de temperatura) y que me de la cadencia de la rueda, los giros que va dando, la frecuencia podríamos decir.

El codigo para leer temperatura, aunque supongo que pueda tener algun fallo, creo que lo tengo bien hecho, pero necesito que me ayudeis con lo demás. Hay un imán en la rueda, y a partir de él necesito calcular por interrupcion (tengo que usar el attachInterrupt) el tiempo que se tarda en que la rueda dé una vuelta, y así continuamente, que me de el tiempo que tarda en dar cada vuelta. Por lo que necesito un codigo de interrupcion que almacene este valor de tiempo de una vuelta (que registre el valor del timer, como un conometro, continuamente me tiene que dar la duracion de cada vuelta de la rueda de la bici) y que al darmelo el timer se resetee, T=0, y asi me pueda dar el valor de la siguiente vuelta, asi continuamente. El iman que está en la rueda de la bici pasará por el mismo punto en cada vuelta, tengo que sacar a partir de esa idea la duracion de cada vuelta, lo que tarda en volver a pasar por ese punto otra vez; no estoy seguro que necesito mas elementos en mi sistema para poder hacer esto

Para empezar es solo eso, pero no consigo que se me ocurra como introducir el codigo de interrupcion de attachInterrupt para poder calcular el valor del timer en cada vuelta y meter este codigo junto al que lee temperatura.

Por favor, se os ocurre algo ? gracias de antemano

Aqui pongo lo que llevo de codigo de temperatura:

float temp1;
int sensortempPin1=0;
float temp2;
int sensortempPin2=1;

void setup() {
// put your setup code here, to run once:

Serial.begin(9600);

}

void loop() {
// put your main code here, to run repeatedly:

temp1=analogRead(sensortempPin1);
temp2=analogRead(sensortempPin2);
temp1=(5.0*temp1*100)/1024.0;
temp2=(5.0*temp2*100)/1024.0;

Serial.print(temp1);
Serial.println(” grados C en el sensor 1″);
Serial.print(temp2);
Serial.println(” grados C en el sensor 2″);
//
delay(1000);

} ...
 
#3
Ya he avanzado. Gracias por vuestra ayuda.

Os cuento:
En la rueda de la bicicleta hay un imán, y en la estructura tengo un relé.
Cada vez que el imán da una vuelta y pasa por el punto donde está el relé, éste salta.
Con esto he de calcular el tiempo que tarda en dar cada vuelta, a través de las interrupciones, y a su vez que dos sensores de temperatura (uno antes del freno y otro después del freno) me den sus dos datos.
Por lo que quiero que se me de continuamente estos datos de Temp1, Temp2 y le tiempo de cada vuelta.

He hecho todo lo que he podido del código, pero necesito que le echéis un vistazo, y me vayáis corrigiendo, porque está lleno de errores seguro, y dudas.
Como que variable tengo que poner volatile, para evitar el rebote, o donde tengo que poner la interrupción e iniciarla de nuevo para que se puedan hacer los cálculos, etc.
No sé si los 'if' están bien, quizás se os ocurra otra forma de hacerlo.

Os enseño lo que tengo:
PHP:
const int  releReedPin = 2;
int estadoRele = 0;         
int ultimoEstadoRele = 0;   
long tiempo_anterior = 0;
long tiempo_una_rev = 0;
unsigned long tiempo_ahora;
long rpm;
long T0 = 0 ;  // Variable global para tiempo

// int0 en pin2
// int1 en pin3

float temp1;
int sensortempPin1=0;
float temp2;
int sensortempPin2=1;


void setup() {

  //pinMode(releReedPin, INPUT);
  Serial.begin(9600);
  attachInterrupt(0, contartiempo, FALLING);

}


void loop() {

// Lee el estado del rele
  estadoRele = digitalRead(releReedPin);
 // Compara el estado del rele con el estado previo
  if (estadoRele != ultimoEstadoRele) {
 // Si el estado ha cambiado incrementa el contador
    if (estadoRele == HIGH) 
    {
      
detachInterrupt(0);    //deshabilita le interrupción para realizar los cálculos

      tiempo_ahora =millis();
      tiempo_una_rev = tiempo_ahora - tiempo_anterior;
      rpm = (60000 / tiempo_una_rev) / 3; // 1 minuto = 60000 ms
      
      Serial.print("Tiempo por revolucion: ");
      Serial.println(tiempo_una_rev);
      Serial.print("Revoluciones por minuto: ");
      Serial.println(rpm);

} 
   else {
      Serial.println("Parada"); 

      tiempo_anterior = tiempo_ahora;
    }
  }
// Guarda el estado actual como ultimo estado
  ultimoEstadoRele = estadoRele;

attachInterrupt(0, contartiempo, FALLING); //inicia la interrupción


temp1=analogRead(sensortempPin1);
temp2=analogRead(sensortempPin2);
  temp1=(5.0*temp1*100)/1024.0;
  temp2=(5.0*temp2*100)/1024.0;
 
  Serial.print(temp1); 
  Serial.println(" grados C en el sensor 1");
  Serial.print(temp2); 
  Serial.println(" grados C en el sensor 2");
  //
    delay(1000);



void contartiempo()

 if ( millis() > T0  + 250)
          {                  
             tiempo_ahora =millis() ;
          
              T0 = millis();
          }

}
¿Qué me decís? ¿Qué iríais corrigiendo?

Gracias.
 
Última edición por un moderador:

Temas similares

Arriba