## More useful curve fitting – temperature compensation

One of my current projects involves making a USB bathroom scale (I’ll post details later).

So as part of the process, I’ve been collecting the data and graphing it to make sure it gives a stable reading. It’s currently sitting in the garage with a 30lb bag of concrete on it, and the readings are not stable — they vary with temperature. Good to know, but how to fix it?

Here’s a day’s worth of data:

Since the weight is constant, the only variation (i’m assuming) is due to the fluctuations in temperature. It looks like a pretty close correlation. OK so far so good.

I exported the datapoints into a text file, looking like this:
``` 258 158 258 157.269 258 157 ... ```

First I plotted them against each other, to see if there was a strong linear correlation
``` gnuplot> plot './tmpwght.txt' using 1:2 with points ```

It seems pretty linear.. (see the combined graph below). The temperature sensor in the attiny85 has only 1C increments, and the datapoints seem to land on ‘even’ numbers more often than not, creating groups of vertical points on the graph.

I then need to find the slope of the line that best fits the curve. I’m expecting a straight line of best fit, eg `y=mx+b` style, so i feed that into gnuplot’s “FIT” routines

``` gnuplot> f(x)=a*x+b gnuplot> fit f(x) './tmpwght.txt' via a,b .... Final set of parameters a = 1.20761 b = -152.923 ```

so it appears theres about a 1.2:1 correlation between temperature and weight reading (‘a’ from the curve fit). Let’s check the graph
``` gnuplot> f(x)=a*x+b gnuplot> a=1.20761 gnuplot> b=-152.923 gnuplot> plot './tmpwght.txt' using 1:2 with points, f(x) ```

The fit looks good enough to try out. Let’s see if it does what we want.

Since the ratio is based on the raw reading of temperature, we need to multiply the 2 together before we do any shifting: `1.20761 * temperature`. Then, we need to make the temperature reading move the opposite way, so when the temp goes up, the number goes down. This is done by subtracting it from another number. I picked 325. This should give us a value that exactly contradicts the effect the temperature had on the weight measurement.
`offset = 325 - (1.20761 * temperature)`