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++;
}