const int sensorPin = A0;  // pin that the sensor is attached to
const int ledPin = PB0;      // pin that the LED is attached to
const int indicatorLed = PB7;// pin to indicate the calibration period
// variables:
int sensorValue = 0;   // the sensor value
int sensorMin = 1023;  // minimum sensor value
int sensorMax = 0;     // maximum sensor value


void setup() {
  Serial.begin(115200);
  // turn on LED to signal the start of the calibration period:
  pinMode(indicatorLed, OUTPUT);
  digitalWrite(indicatorLed, HIGH);

  // calibrate during the first five seconds
  while (millis() < 10000) {
    sensorValue = analogRead(sensorPin);

    // record the maximum sensor value
    if (sensorValue > sensorMax) {
      sensorMax = sensorValue;
    }

    // record the minimum sensor value
    if (sensorValue < sensorMin) {
      sensorMin = sensorValue;
    }
    Serial.print("sensorMin:");
    Serial.print(sensorMin);
    Serial.print(',');
    Serial.print("sensorMax:");
    Serial.print(sensorMax);
    Serial.print(',');
    Serial.print("sensorValue:");
    Serial.println(sensorValue);
  }  
  Serial.println("Calibration Done.");
  // signal the end of the calibration period
  digitalWrite(indicatorLed, LOW);
}

void loop() {
  // read the sensor:
  sensorValue = analogRead(sensorPin);

  // in case the sensor value is outside the range seen during calibration
  sensorValue = constrain(sensorValue, sensorMin, sensorMax);

  // apply the calibration to the sensor reading
  sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);

  // fade the LED using the calibrated value:
  analogWrite(ledPin, sensorValue);
}