Pololu Robotics & Electronics
Menu
My account Comments or questions? About Pololu Contact Ordering information Distributors

Pololu Forum

Recall calibration value fromm eeprom

I used this code to recall pre calibrated value from eeprom but can’t assign those value to qtr.calibrationOn.minimum.
this shows some garbage value. if i use some other variable instead, then i get correct value


void recallCalibrationValue()
{
  qtr.calibrate();
  for (uint8_t i = 0; i < SensorCount; i++)
  {
    storeMinVal[i] = EEPROM.read(addressMin[i]);
    storeMinValue[i] = storeMinVal[i] * 4;
    qtr.calibrationOn.minimum[i] = storeMinValue[i];
    
    storeMaxVal[i] = EEPROM.read(addressMax[i]);
    // storeMaxValue[i] = storeMaxVal[i] * 4;
    qtr.calibrationOn.maximum[i] = storeMaxValue[i];

  }
  
  delay(100);
}

void printCalibrationValue()
{
  for (uint8_t i = 0; i < SensorCount; i++)
  {
    Serial.print(qtr.calibrationOn.minimum[i]);
    Serial.print(' ');
  }
  Serial.println();
  for (uint8_t i = 0; i < SensorCount; i++)
  {
    Serial.print(qtr.calibrationOn.maximum[i]);
    Serial.print(' ');
  }
  Serial.println();
}

Hello, Sadsiam.

Could you post the simplest complete program that demonstrates the problem, including your code that writes the EEPROM? Also, what Arduino or microcontroller are you using?

Brandon

1 Like

Hi Brandon.

Thank you for your reply.
I am trying to make a line follower robot with arduino mega 2560 and qtr sensor.
I try to store calibrated value in EEPROM and then use it later so that i don’t have to calibrate each time i restart my arduino.
But when I check those values of qtr.calibrationOn.minimum[] and qtr.calibrationOn.maximum[] in serial monitor, it seems some of the values overwrite others.
image
here first eight values in the first line comes wrong as it repeats from second line. Heres two function I used.

void calibration()
{
  qtr.setTypeAnalog();
  qtr.setSensorPins((const uint8_t[]){
                        0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
                    SensorCount);
  qtr.setEmitterPin(2);

  delay(500);
  digitalWrite(LED_BUILTIN, HIGH); // turn on Arduino's LED to indicate we are in calibration mode

  for (uint16_t i = 0; i < 400; i++)
  {
    qtr.calibrate();
  }

  delay(100);

  for (uint8_t i = 0; i < SensorCount; i++)
  {
    minValue[i] = qtr.calibrationOn.minimum[i] / 4;
    maxValue[i] = qtr.calibrationOn.maximum[i] / 4;
    EEPROM.update(addressMin[i], minValue[i]);
    delay(10);
    EEPROM.update(addressMax[i], maxValue[i]);
    delay(10);
  }

  digitalWrite(LED_BUILTIN, LOW); // turn off Arduino's LED to indicate we are through with calibration
  delay(1000);
}

void recallCalibrationValue()
{
  qtr.calibrate();

  for (int i = 0; i < SensorCount; i++)
  {
     qtr.calibrationOn.minimum[i] = EEPROM.read(addressMin[i]) * 4;
 qtr.calibrationOn.maximum[i] = EEPROM.read(addressMax[i]) * 4;
  }

  for (int i = 0; i < SensorCount; i++)
  {
    Serial.print(qtr.calibrationOn.minimum[i]);
    Serial.print("\t");
  }
  Serial.println();
  for (int i = 0; i < SensorCount; i++)
  {
    Serial.print(qtr.calibrationOn.maximum[i]);
    Serial.print("\t");
  }
}

Thank you for the extra information, but there is still not enough for me to make any helpful suggestions. Could you please post the simplest complete program (e.g. a full program that would be able to be uploaded to an Arduino as-is) that demonstrates the problem?

Brandon

1 Like