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.
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.
#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);
}
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 Durchschnitts-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 Speicherverbrauch 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;
}
zurück