const byte encoderPin = A0;
void setup()
{
Serial.begin(9600); // initialize serial communication
}
void loop() {
static uint32_t lastZeroTime = 0;
int rawValue = analogRead(encoderPin); // read analog input from encoder
//float distance = interpolate(rawValue, calibValues, calibDist, 18); // interpolate distance from calibration data
float distance = rawValue * 150.0 / 1024;
float target = 5.47 / 60 / 1000 * (millis() - lastZeroTime);
float error = target - distance;
Serial.print("Displacement:");
Serial.print(distance, 1); // output distance measurement to serial monitor with 0.1mm accuracy
Serial.print("mm, Target:");
Serial.print(target, 1); // output distance measurement to serial monitor with 0.1mm accuracy
Serial.print("mm error:");
Serial.print(error, 1); // output distance measurement to serial monitor with 0.1mm accuracy
Serial.print("mm\n");
delay(100);// wait for 100ms
if (target > 150 ) {
lastZeroTime = millis();
}
}
float interpolate(float x, float xData[], float yData[], int dataSize) {
// linear interpolation function
for (int i = 0; i < dataSize - 1; i++) {
if (x >= xData[i] && x <= xData[i + 1]) {
return yData[i] + (yData[i + 1] - yData[i]) / (xData[i + 1] - xData[i]) * (x - xData[i]);
}
}
return 0; // return 0 if x is outside of calibration range
}