It is common to control the speed of a pump based on a sensor reading. But what if you want the pump speed to change at a different rate at different parts of the sensor range? If the response isn’t approximated by an equation, you can break down the response in to segments and use a new equation for each segment. That is exactly what is done here.
The code is just a series of nested if statements to find which segment to use, then calculates the slope and intercept of the segment to get to the output (y) value:
//steps through a series of 7 numbers (x values) to find which one starts the interval containing the input //calculates the slope for the given interval based on the ((delta y)/(delta x)) //calculates the y intercept using y=mx+b (plugging in m, x and y, solving for b) //calculates the y value using y=mx+b (plugging in m, x, and b, solving for y) //Rev0 February 25, 2015 sparkygeek.com int interval; //this var was just for testing float m; //slope float b; //y intercept float x; //incoming number float y; //result float x0; //first datapoint on x-axis float x1; //second datapoint on x-axis float x2; //third datapoint on x-axis float x3; //fourth datapoint on x-axis float x4; float x5; float x6; float x7; float x8; float y0; //first datapoint on y-axis float y1; float y2; float y3; float y4; float y5; float y6; float y7; float y8; // copy values over so remainder of code stays the same x := Pump1.Xin; x0 := Pump1.Xmin; x1 := Pump1.x1; x2 := Pump1.x2; x3 := Pump1.x3; x4 := Pump1.x4; x5 := Pump1.x5; x6 := Pump1.x6; x7 := Pump1.x7; x8 := Pump1.Xmax; y0 := Pump1.Ymin; y1 := Pump1.y1; y2 := Pump1.y2; y3 := Pump1.y3; y4 := Pump1.y4; y5 := Pump1.y5; y6 := Pump1.y6; y7 := Pump1.y7; y8 := Pump1.Ymax; if( x < x1 ){ interval = 0; m := (y1-y0)/(x1-x0); b := y1-m*x1; } else if ( x < x2 ){ interval = 1; m := (y2-y1)/(x2-x1); b := y2-m*x2; } else if ( x < x3 ){ interval = 2; m := (y3-y2)/(x3-x2); b := y3-m*x3; } else if ( x < x4 ){ interval = 3; m := (y4-y3)/(x4-x3); b := y4-m*x4; } else if ( x < x5 ){ interval = 4; m := (y5-y4)/(x5-x4); b := y5-m*x5; } else if ( x < x6 ){ interval = 5; m := (y6-y5)/(x6-x5); b := y6-m*x6; } else if ( x < x7 ){ interval = 6; m := (y7-y6)/(x7-x6); b := y7-m*x7; } else if ( x < x8 ){ interval = 7; m := (y8-y7)/(x8-x7); b := y8-m*x8; } y := m*x+b; return y;