zurück

Sensoren: Kalibrierung und Glättung

16.02.2020

Verwendete Bauteile

Aufbau der Schaltung

Für die folgenden beiden Versuche wird dieselbe, folgende Schaltung verwendet. Als Sensor wird hier stellvertretend für jeden anderen Sensor ein LDR (lichtempfindlicher Widerstand der GL55xx-Reihe) benutzt.

Schaltplan

Kalibrierung des Sensors

Im folgenden Sketch wird die Kalibrierung für eine vordefinierte Zeit (hier 10 Sekunden) im setup()-Teil des Codes vorgenommen. Dabei wird der Sensor permanent ausgelesen und die minimalen/maximalen Werte ermittelt. Während dieser Zeit sollte der Sensor alle Zustände erfahren, die in den späteren Messungen mit dem Sensor benötigt werden.
Nach dieser Kalibrierung sind dem Mikrocontroller also die Extremwerte des Sensors bekannt und werden nun bei den folgenden Messungen im loop()-Teil des Codes berücksichtigt. Auf diese Weise kann der Sensor optimal ausgenutzt und auf die momentanen Gegebenheiten angepasst werden werden.

Sketch

#define PIN_LED_CALIBRATION 13
#define PIN_LED_BRIGHTNESS   9
#define PIN_SENSOR          A0

#define CALIBRATION_DURATION 10 // in seconds

int sensorValue = 0, sensorMin = 1023, sensorMax = 0;

void setup()
{
    pinMode(PIN_LED_BRIGHTNESS, OUTPUT);
    pinMode(PIN_LED_CALIBRATION, OUTPUT);

    // Calibrating the sensor
    digitalWrite(PIN_LED_CALIBRATION, HIGH);
    while (millis() < (CALIBRATION_DURATION*1000)) {
        sensorValue = analogRead(PIN_SENSOR);
        sensorMax = max(sensorValue, sensorMax);
        sensorMin = min(sensorValue, sensorMin);
    }
    digitalWrite(PIN_LED_CALIBRATION, LOW);
}

void loop()
{
    sensorValue = analogRead(PIN_SENSOR);

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

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

    analogWrite(PIN_LED_BRIGHTNESS, sensorValue);
}

Glättung der Sensordaten

Da Sensoren oft eine Menge an Daten in kurzer Zeit zurückliefern, ist es manchmal hilfreich, dass diese Messdaten geglättet werden, um Ausreißer in den Daten (z.B. durch kleine Stromschwankungen) auszugleichen.
Im folgenden Sketch werden die Daten nicht direkt ausgelesen und zurückgeliefert, sondern akkumuliert und dann durch die Anzahl der Lesevorgänge (hier: NUM_READINGS) dividiert. Somit ergibt sich ein Durchschitts-Messwert über eine kurze Zeit. Je höher der Wert für NUM_READINGS, desto höher die Glättung der Messdaten, aber dadurch wird sowohl die Messgeschwindigkeit verringert und der Speicherverbauch im RAM des Mikrocontrollers erhöht.

#define PIN_SENSOR A0

#define NUM_READINGS 25

int readings[NUM_READINGS]; // the readings from the analog input

void setup()
{
    Serial.begin(9600);
    pinMode(PIN_SENSOR, INPUT);

    for (int i = 0; i < NUM_READINGS; i++) {
        readings[i] = 0;
    }
}

void loop()
{
    Serial.println(getSensorAverage(PIN_SENSOR));
    delay(500);
}

int getSensorAverage(int pinSensor)
{
    int total = 0;

    for (int i = 0; i < NUM_READINGS; i++) {
        total += analogRead(pinSensor);
        delay(10);
    }

    return total / NUM_READINGS;
}