Nonlinear Mapping

<p></p>


Similar to Arduino’s map function, this value remapping allows a simple adaption of nonlinear input or output devices.
If you have a device like a sensor with a behavior that follows the red line for example draw some joined lines through the red curve and make note of  the five node points which are occurring here.

{{    0,10  }  , {    10,50  }  , {    20,150  }  , {    40,200  }  ,{    50,200  }};

Put these values in the “nodepoints” array where the reMap() function calculates the linear equations (y=mx+b) and according to that the resulting output value.

If you need more nodes simply enlarge the “nodepoints” Array. The node values can be positive or negative .


// curve mapping with n interpolation points

// KHM 2010 Lab3

// nodes for linear equations / nodepoits are concatening  lines
float nodepoints[5][2]= {
  {
    0,10  }
  , {
    10,50  }
  , {
    20,150  }
  , {
    40,200  }
  ,{
    50,200  }
};

void setup() {
  Serial.begin(115200);
}
void loop() {

// test
// a given linear input leads to remapped output
  for ( int ii = 0; ii <= 50; ii++) {
    Serial.print(ii);
    Serial.print("  ");
    int result= reMap(nodepoints,ii);

    Serial.print(result);
    Serial.println("  ");
  }
  while(1);
}

//***************************************************************************
//
int reMap(float pts[10][2], int input) {
  int rr;
  float bb,mm;

  for (int nn=0; nn < 4; nn++) {

    if (input >= pts[nn][0] && input <= pts[nn+1][0]) {
      mm= ( pts[nn][1] - pts[nn+1][1] ) / ( pts[nn][0] - pts[nn+1][0] );
      mm= mm * (input-pts[nn][0]);
      mm = mm +  pts[nn][1];
      rr = mm;
    }
  }
  return(rr);
}



Martin Nawrath / KHM 2010