Hulp bij snelheid berekenen snelheid met encoder

Goedeavond,

Ik ben nieuw hier en tevens ook nieuw met Arduino. Ik ben nu een tijdje aan het "spelen" met de Arduino en nu loop ik vast op het volgende. Hopelijk kan iemand me mee op weg helpen.
Wat mijn doel is, is het volgende. Ik heb een encoder die 200 pulsen per omwenteling afgeeft. Deze lees ik in mijn arduino. Het wiel wat op de encoder zit heeft een diameter van 55. Dus daarmee kan ik uiteindelijk de afgelegde afstand mee berekenen. Dit is mij ook gelukt. Echter wil nu ook weer kunnen geven wat de snelheid is in m/s. Hier loop ik op vast. Ik zit in de richting te denken dat ik de pulsen per seconde moet tellen en deze weer omzetten naar m/s. Maar hoe ik dit precies moet doen, ben ik nog niet uit. Hopelijk kunnen jullie me op weg helpen.

// include the library code:
#include <LiquidCrystal.h>


// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 7, 6);

int encoderPin1 = 2;
int encoderPin2 = 3;

volatile int lastEncoded = 0;
volatile long encoderValue = 0;
float pos = 0;
float posi = 0;

long lastencoderValue = 0;

int lastMSB = 0;
int lastLSB = 0;

void setup() {

    // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Snelheid:");
  
  lcd.setCursor(13, 0);
  // print speed to the LCD:
  lcd.print("m/s");

  lcd.setCursor(0, 1);
  // print lengte to the LCD:
  lcd.print("Lengte:");

   lcd.setCursor(15, 1);
  // print meter to the LCD:
  lcd.print("m");

  pinMode(encoderPin1, INPUT_PULLUP); 
  pinMode(encoderPin2, INPUT_PULLUP);

  digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
  digitalWrite(encoderPin2, HIGH); //turn pullup resistor on

  //call updateEncoder() when any high/low changed seen
  //on interrupt 0 (pin 2), or interrupt 1 (pin 3) 
  attachInterrupt(0, updateEncoder, CHANGE); 
  attachInterrupt(1, updateEncoder, CHANGE);

#define DIAM 55.0
#define PI 3.1415926535
#define CPR 200
}

void loop(){ 
  
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(8, 1);
  // print the encoder value since reset:
  lcd.print(posi,3);

    pos = encoderValue * DIAM * PI / CPR / 4 ;
    posi = pos / 1000; // distance in meter
}

void updateEncoder(){
  int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  int LSB = digitalRead(encoderPin2); //LSB = least significant bit

  int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
  int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value

  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;

  lastEncoded = encoded; //store this value for next time
}

je hebt eigenlijk twee tellers namelijk een tijdteller en een pulsteller.
je moet dus uitkomen op hoeveel pulsen je per 1000 tijd hebt gedaan.
maar dat kan dus gaan bijv, van 123 pulsen in 234 tijd dus 123/234 en daar komt dus de lengte bij dus 123 maal afstand per puls gedeeld door de tijd.
tijd wordt in een arduino gemeten met millis() of zelfs micros().gebruik hier maar gewoon millis() want micros zijn niet erg nauwkeurig.

Ik heb nu dit toegevoegd. Is dit de manier zoals het zou moeten? Ik weet niet zeker of dit de juiste methode is.
Probleem wat ik namelijk heb is dat mijn pulsen en mijn afgelegde afstand steeds hoger worden. Dus ik moet enkel de pulsen en afgelegde afstand hebben binnen 1000 milliseconde voor het berekenen van mijn m/s. In hoor graag jullie bevindingen.

void loop(){ 
  
  currentMillis = millis();  //get the current "time" (actually the number of milliseconds since the program started)
  if (currentMillis - startMillis >= period)  //test whether the period has elapsed
  {
    spd = (encoderValue - startencoderValue) * (posi - startposi) / currentMillis;
    startMillis = currentMillis;  //IMPORTANT to save the start time
    startencoderValue = encoderValue;
    startposi = posi; 
  }

De vorige code lijkt niet goed te werken..
Ben eens verder aan het testen en in principe zou ik heel simpel kunnen zeggen: Snelheid = afstand / tijd.
Ik zat te denken om na elke seconde te berekenen wat de afgelegde afstand dan is. Echter blijft spd steeds 0.0 aangeven. Heeft dit te maken dat ik een "float" deel door een "unsigned Long"?

void loop(){ 
  
  currentMillis = millis();  //get the current "time" (actually the number of milliseconds since the program started)
  if (currentMillis - startMillis >= period)  //test whether the period has elapsed
  {
      
      spd = posi / currentMillis; // speed = Distance / Time. Repeats every 1000ms
      // set the cursor to column 10, line 0
      // (note: line 1 is the second row, since counting begins with 0):
      lcd.setCursor(10, 0);
      // print the speed value since reset:
      lcd.print(spd,1);
    startMillis = currentMillis;  //IMPORTANT to save the start time 
  }

je vergeet om de laatste positie te onthouden.
dus afstand is (nieuwe positie-oude positie)en dan wordt de oude positie de nieuwe pos.
ofwel eerst afstand=nieuwepos-oudepos;
oudepos=nieuwepos;
dat kan je toch wel zelf bedenken lijkt mij.

Excuses voor mijn onwetendheid. Het is voor mij een hele tijd geleden dat ik bezig ben geweest met programmeren. Dus probeer het een beetje boven water te krijgen. Maar daardoor zie ik wellicht de meest simpele dingen even niet.
Maar doel je op de laatst gepost stukje code? Of het stukje code daarvoor?

je moet onthouden wanneer je begint met meten en wanneer je eindigt en je moet onthouden hoeveel pulsen er staan bij het begin en het einde, en daar laat je de berekening op los dus pulsen / tijd.

Je zou het haast niet denken, maar dat is dus zo'n beetje het belangrijkste wat je leert uit de Blink Without Delay (klik!).