Quote:
Originally Posted by randerson0248
...I think the refresh rate is too fast. I see instant mileage jumping around several times per second. I think updating data every 1/2 second or so would be about right.
|
Software mods: MPG is a rolling average refreshed every 2 seconds, top right is miles to empty, bottom right is projected total tank miles. Running ATmega328.
Code:
//Code for display of rolling average MPG at less frequent intervals
//Based on MPGuino v0.75
//Captures the last 10 MPG values
//Calculates the average MPG for those 10 values
//Refreshes the MPG display each 2 seconds
//insert before setup()
pFunc displayFuncs[] ={
...
doDisplayInstantA, //insert this in displayFuncs[]
//insert in setup()
displayFuncNames[x++]= PSTR("InstantA "); //add this for new display template
//insert before loop(), add these global vars to retain values across loops
//mpg averaging
unsigned long instAvgMpg = 0;
unsigned long instMpg = 0;
unsigned long prevMpg = 0;
byte loopIdx = 0;
byte dispIdx = 0;
//insert in loop() right after sei();
//accumulate mpg values in an array of 10 values, oldest values are overwritten
instMpg = instantmpg(); //get current mpg
if (instMpg >= 999999000) instMpg = prevMpg; //if unbelievably high, use mpg from previous loop
prevMpg = instMpg; //keep track of value for next time through loop
avgBuff[loopIdx][mpgIdx] = instMpg; //store the current mpg in array
loopIdx++; //increment the loop number
if (loopIdx > 9) loopIdx = 0; //keep track of 10 loops max
//mpg averaging & display damping
if (dispIdx <= 0) { //recalculate after some number of loops
instAvgMpg = 0; //initialize to zero
for (byte x=0; x<10; x++) instAvgMpg += avgBuff[x][mpgIdx]; //sum all array values
instAvgMpg = instAvgMpg / 10; //calculate avg of array values
dispIdx = 4; //recalculate after 4 loops (~2 seconds)
}
dispIdx--; //decrement index each time through loop
//insert new display template containing instAvgMpg
void doDisplayInstantA(){displayTripCombo('i','M',instAvgMpg,'S',instantmph(),'G','H',instantgph(),'D',current.miles());}
It works for me! YMMV.