kenny
March 4, 2012, 3:04pm
1
I've been looking for some good scale lib's and i decided to rewrite my Siemens S7 code and put it in a arduino!
I really don't know if it is the best approach but i really think that it is very easy and also very easy to calibrate.
If you know a better way just reply....
// H_out = Highest possible output
// L_out = Lowest possible output
// H_in = Highest possible input
// L_in = Lowest possible input
// calib = final calibration
// input = the scaling start-off (probably te analog input)
float Scale_sensor(float H_out, float L_out, float H_in, float L_in, float Calib, float Input){
float result;
float Part_1 = H_out - L_out;
float Part_2 = Input - L_in;
float Part_3 = Part_2 * Part_1;
float Part_4 = H_in - L_in;
float Part_5 = Part_3 / Part_4;
float Part_6 = L_out + Part_5;
result = Part_6 + Calib;
return result;
}
I used this with some NTC sensors and it works perfect!
system
March 4, 2012, 5:04pm
2
I think the map function does the same thing, but good work!
system
March 4, 2012, 5:23pm
3
I think the map function does the same thing
...but with integer arithmetic
Good function kenny_-_,
map() does indeed the same in int domain except for the calibration value which is often needed.
Some remarks:
write it without intermediate variables, compiler can handle this oneliner.
keep the order of the parameters the same as the map function (acceptance in the community); maybe call it mapCalibrate() ?
do the divide first and then 2nd multiply to prevent overflow.
==> return L_out + ((Input - L_in) /(H_in - L_in)) * (H_out - L_out) + Calib;
kenny
March 5, 2012, 10:33am
6
Yes really good thank you i'll keep that in mind, what it was that i literary copied it from s7-ladder to vb.net (for some other project) and also to the arduino.
That's why it's written like this (and yes i'd have to say that i didn't put to much effort in the translation) but now i will change it to
your formula, it'll be better i agree!
Sometimes it's good to post something to the community because you will get something back, thanks guys!
kenny
March 5, 2012, 10:36am
7
// H_out = Highest possible output
// L_out = Lowest possible output
// H_in = Highest possible input
// L_in = Lowest possible input
// calib = final calibration
// input = the scaling start-off (probably te analog input)
float mapCalibrate(float H_out, float L_out, float H_in, float L_in, float Calib, float Input){
return L_out + ((Input - L_in) /(H_in - L_in)) * (H_out - L_out) + Calib;
}
(for the record)