Indicazioni per utilizzare un sensore reed per determinare la velocità istantane

Buonasera, sto usando Arduino Uno già da un anno e molte volte sono capitato in questo forum trovando soluzioni ai miei problemi, ma vorrei qualcuno che mi dicesse la migliore modalità per determinare la velocità istantanea (non esitate ad arrabbiarvi se non ho cercato bene il web -stfw-... e se non ho trovato il posto per la presentazione).
Ho già scritto un po' di codice ma ho dei problemi con la rivelazione della velocità.
Questo è ciò che ho scritto.

// Bici.ino
#include <LiquidCrystal.h>
#include "LM35.h"
// initialize the library with the numbers of the interface pins
int reed=6;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
lcd.begin(16,2);
pinMode(reed,INPUT);
}

void loop() {
//4.38:5=x:y
float batVolts=(analogRead(A0)/511.0)5.05.0/4.38;
lcd.print(batVolts);
lcd.setCursor(5,0);
lcd.print(readC(A1));
lcd.setCursor(10,0);
lcd.print(readKmH(reed, 26));
delay(1500);
lcd.clear();
lcd.setCursor(0,0);
}
float readKmH(int reedPin, int raggio){
const float pi=3.14159265359;
int i=0;
long startMillis=millis();
while(i<5){
if(digitalRead(reedPin)==HIGH){
i++;
delay(20);
}
}
int t=millis()-startMillis;
float s=raggio2pi*5;
return s/t;
}

Grazie!
P.S.
LM35.h è ena libreria che ho scritto io
A1 è il pin del termometro
6 è il pin del reed EDIT:mi ero scordato che avevo chiamato la variabile del pin proprio REED! Mentre 26 passato alla funzione che da la velocità istantanea è il raggio
A0 è il livello della batteria.
EDIT: Volevo chiedervi aiuto sull'uso degli interrupt, per sapere se fossero necessari in questo caso e se si come implementarli perché aumentando il numero di misurazioni si riduce l'errore.
EDIT2: Credo di aver fatto un piccolo errore di concetto: dovrei moltiplicare il risultato della funzione per 360 (60*60/10)
EDIT3: Ho trovato lo spazio delle presentazioni. Se ho sbagliato posto scusatemi, sono veramente nuovo dei forum in generale.

Velocità = Spazio / tempo

  • Lo spazio, giustamente, è la circonferenza della tua ruota, data da Diametro * 3.14
  • Il tempo te lo controlli da millis ogni volta che il reed viene attivato dalla calamita.
    Poi bisogna vedere se vuoi metri al secondo oppure Km / h., quindi circonferenza in Metri e tempo in secondi oppure circonferenza in Km e tempo in ore.

Per gli interrupt, lascia stare, a meno di misurare qualche centinaio di giri della tua ruota AL SECONDO, e non credo tu sia così veloce...

Per lo spazio presentazioni..... mo' ti arriva una raffica di parole !!! :slight_smile:

No, non credo che esista nessuno al mondo in grado di pedalare così in fretta! :smiley: :smiley: :smiley: :smiley:
Comunque credo di essere stato un po' pecipitoso: ecco il codice rivisto (che però non ho avuto modo di testare)

#include <LiquidCrystal.h>
#include "LM35.h"
// initialize the library with the numbers of the interface pins
int reed=6;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
lcd.begin(16,2);
pinMode(reed,INPUT);
}

void loop() {
//4.38:5=x:y
float batVolts=(analogRead(A0)/511.0)5.05.0/4.38;
lcd.print(batVolts);
lcd.setCursor(5,0);
lcd.print(readC(A1));
lcd.setCursor(10,0);
lcd.print(readKmH(reed, 26));
delay(1500);
lcd.clear();
lcd.setCursor(0,0);
}
float readKmH(int reedPin, int raggio){
const float pi=3.14159265359;
int i=0;
long startMillis=millis();
while(i<5){
if(digitalRead(reedPin)==HIGH){
i++;
delay(20);
}
}
int t=(millis()-startMillis)/1000/3600;
float s=raggio2pi*5/100000;
return s/t;//da la velocità in km/h corretta (forse, si spera... :wink:
}