Contagiri RPM da bobina TCI

Perfetto, lettura ogni 600 ms e funziona abbastanza bene, peccato perdere precisione se si aumentano le letture, ma fa parte del gioco. Grazie!
Continuo a non capire la logica di funzionamento del primo sketch allegato : memorizza l ' intervallo di tempo tra le due "letture", ma come come lo condiziona secondo voi?

Per evitare che la lettura "balli" potresti sincronizzare l'inizio dei 600 ms con l'arrivo di un impulso. Saresti sicuro che, a parità di numero di impulsi al secondo, la lettura non "ballerà".

Ciao,
P.

Intendi far partire il timer ogni volta che ottengo un impulso? così su due piedi mi è venuto in mente una cosa così, non l ho ancora provata!

unsigned long start;
unsigned long currentRPMValue;
volatile unsigned long pulse;
int K = 1;
int pin = 2;
volatile unsigned long startTimer;

void setup() {
  Serial.begin (115200);
  pinMode (pin, INPUT);
  attachInterrupt (digitalPinToInterrupt (pin), speedCalc, RISING);
  pulse = 0;
  startTimer = 0;
  start = millis();
}

void speedCalc () {
  pulse++;
  startTimer = 1;
}

void loop() {
  if (startTimer == 1) {
    if (millis() - start >= 600) {
      getRPM();
    }
  }
}

void getRPM () {
  currentRPMValue = (pulse * 100) * K;
  startTimer = 0;
  pulse = 0;
  start = millis();
  Serial.println(currentRPMValue);
}

A mio avviso manca un pezzettino

MartinoMsp:

unsigned long start;

unsigned long currentRPMValue;
volatile unsigned long pulse;
int K = 1;
int pin = 2;
volatile unsigned long startTimer;

void setup() {
 Serial.begin (115200);
 pinMode (pin, INPUT);
 attachInterrupt (digitalPinToInterrupt (pin), speedCalc, RISING);
 pulse = 0;
 startTimer = 0;
 start = millis();
}

void speedCalc () {
 pulse++;
 startTimer = 1;
}

void loop() {
 if (startTimer == 1) {
   if (millis() - start >= 600) {
     getRPM();
   }
 }
 else {              // pezzettino
 start = millis();   //
 }                   // mancante

void getRPM () {
 currentRPMValue = (pulse * 100) * K;
 startTimer = 0;
 pulse = 0;
 start = millis();
 Serial.println(currentRPMValue);
}

Ciao,
P.

Buonasera a tutti! Allora programma sistemato, finalmente ho ottenuto una buona lettura degli rpm (paragonati a quelli letti tramite obd tramite una diagnosi ho uno scarto di qualche decina) Grazie Pgiagno! Un ultima domanda: se “stampo” i numeri su un display i2c 128x64 e ottengo dei valori superiori a quelli normalmente letti sul seriale, a cosa do la colpa? È come se le scrittura nel loop fosse quasi un delay.

Per frequenze così basse non si contano gli impulsi in un certo tempo, ma si misura il tempo in microsecondi tra due impulsi, ottenendo una precisione di circa 3rpm, e letture che durano quanto la distanza tra due impulsi :wink:

Nel post 14 ho cercato di fare qualcosa di simile, ma non riesco proprio a far funzionare il programma.. ottengo dei numeri casuali

Qualcosa del genere, sempre con speedCalc sotto interrupt:

volatile uint32_t t = 0;
volatile uint32_t durata;


void speedCalc()
{
        uint32_t ta = micros();
        durata = ta - t;
        t = ta;
}


void loop()
{
        delay(250);  // quattro letture al secondo
        uint16_t rpm = 60000000L / durata;
        visualizza(rpm);
}