Calibreren

Hallo,

Voor mijn oldtimer ben ik (nog steeds) een boordcomputer aan het bouwen. Op de boordcomputer wordt oa de range weergegeven. Eerst wilde ik dit via een lcd-scherm zichtbaar maken. Maar omdat een lcd niet in een oldtimer past heb ik een ouderwetse dagteller aangepast zodat deze op en af kan tellen.

De dagteller wordt aangedreven door een continous servomotor, via een magneet(3xN/Z per ommegang) meet ik het aantal omwentellingen en dus de stand van de dagteller.

Alleen als ik mijn bereik snel herbereken mist hij soms een puls en denkt de arduino op een andere km stand te zitten als er daadwerkelijk weergegeven wordt. Na een half uur kan ik soms een afwijking hebben van 20km=2omwentelingen.

mijn bedachte oplossing/probleem
Op de aangedreven as zit aan het uiteinde nog staafje die ik kan detecteren met een optische sensor. Ik weet dat wanneer het staafje passeert mijn werkelijke waar eindigt op een 8 (dus xxx8)

Nu is mijn vraag hoe moet ik, als de arduino denkt dat hij 127 aangeeft en dit in werkelijkheid 128 is, een programeerregel erin zetten dat hij weer weet dat hij op een 128 zit.

Alle hulp wordt zeer gewaardeerd, wie kan mij in de juiste richting sturen.

Voor het gemak mijn huidige code

#include <Servo.h> 
 
Servo myservo;  
 float teller;
 int motorspeed=71;  // hierbij staat de servo still
 float range=0;      // dagteller staat op 0
 float lastrange;
 float bereik=0;
 int schuifweerstand=A0;
 int lastmotorspeed=0;
 
 
 
void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
  
  attachInterrupt(1, telling, RISING);
   
   
  Serial.begin(9600); 
} 
 
 
void loop() {
Serial.print("Teller: ");
Serial.println(teller);
Serial.print("range: ");
Serial.println(range);
Serial.print("MS: ");
Serial.println(motorspeed);
Serial.print("bereik: ");
Serial.println(bereik);
myservo.write(motorspeed);
lastmotorspeed=motorspeed;

bereik=analogRead(schuifweerstand);

if(motorspeed==71){
  teller=0;
  lastrange=range;}
  
 else if (motorspeed>71){      // dagteller telt af
   range=lastrange-(teller/3*10);  // teller is het aantal keer dat de hallsensor een magnetisch veld verandering waarneemt. /3 omdat per omwenteling 3x de polariteit veranderd en 1 omwenteling is 10km
 }
   
 else if (motorspeed<71){     // dagteller telt op
   range=lastrange+(teller/3*10);
 }
     

if (bereik>range){
  if (bereik-range>=100){   // aftellen snel
    motorspeed=0;}
    else if ((bereik-range>=50) && (bereik-range<100)){
      motorspeed=40;}       //aftellen minder snel
    else if ((bereik-range>=10) && (bereik-range<50)){
    motorspeed=61;}         //aftellen langzaam met plusminus 10km weergave onnauwkeurigheid, maar range moet kloppen
    else if ((bereik-range>0) && (bereik-range<10 )){
    motorspeed=71;}
   }
    
 else if (bereik<range){
   if (range-bereik>=100){
    motorspeed=180;}
    else if ((range-bereik>=50) && (range-bereik<100)){
      motorspeed=140;}
    else if ((range-bereik>=10) && (range-bereik<50)){
    motorspeed=90;}
    else if ((range-bereik>0) &&(range-bereik<10)){
    motorspeed=71;}
  }

 else if (bereik==range){
 motorspeed=71;}

if (motorspeed != lastmotorspeed){   // rekenregel om te resetten wanneer het bereik snel herberekent wordt, voornamelijk voor het voor en achteruit draaien
   teller=0;
   lastrange=range;
   lastmotorspeed=motorspeed;
 
 }}


 void telling()
 {
   teller++;
   }

Als je pulsen niet wilt missen moet je met een interrupt werken. Dan heb je alle extras niet nodig.
Met vriendelijke groet
Jantje

ik werk met een interrupt, maar de ene keer tel ik die pulsen op en die ander keer haal ik ze er vanaf.
en daarom moet ik af en toe de teller resetten.

En als ik een puls registreer dan haalt hij er 3,33 af, maar als ik in dat traject naar de volgende puls in 1 keer van richting verander en dan registreert hij een puls dan telt hij er 3,33 bij op. Dus als ik bij de 2(aftellend van de richting verander (optel) dan registreerd de arduino 3,33 ipv 5,33 omdat de puls pas bij 0 kwam.