Adding temperature calibration

pull/2/head
Marco Gulino 2019-07-16 19:51:23 +01:00
rodzic 43d1ec2453
commit 9a9ae893ca
2 zmienionych plików z 56 dodań i 5 usunięć

Wyświetl plik

@ -119,6 +119,19 @@ void SQM_TSL2591::disable(void) {
TSL2591_ENABLE_POWEROFF);
}
void SQM_TSL2591::setTemperatureCalibration (const temperatureCalibration &calibrationData) {
_temperatureCalibration = calibrationData;
}
void SQM_TSL2591::setTemperature (float temperature) {
_hasTemperature = true;
_temperature = temperature;
}
void SQM_TSL2591::resetTemperature () {
_hasTemperature = false;
}
void SQM_TSL2591::setGain(tsl2591Gain_t gain) {
if (!_initialized) {
if (!begin()) {
@ -305,6 +318,28 @@ void SQM_TSL2591::bumpTime(int bumpDirection) {
setTiming(config.time);
}
void SQM_TSL2591::calibrateReadingsForTemperature(uint16_t &ir, uint16_t &full) {
if (_hasTemperature) {
if (verbose) {
Serial.print("Values before temperature calibration: ir=");
Serial.print(ir);
Serial.print(", full=");
Serial.println(full);
}
float irCalibrationFactor = _temperature * _temperatureCalibration.irSlope + _temperatureCalibration.irIntercept;
float fullCalibrationFactor = _temperature * _temperatureCalibration.fullLuminositySlope + _temperatureCalibration.fullLuminosityIntercept;
ir = static_cast<uint16_t>(static_cast<float>(ir) * irCalibrationFactor);
full = static_cast<uint16_t>(static_cast<float>(full) * fullCalibrationFactor);
if (verbose) {
Serial.print("Values after temperature calibration: ir=");
Serial.print(ir);
Serial.print(", full=");
Serial.println(full);
}
}
}
void SQM_TSL2591::takeReading(void) {
uint32_t lum;
niter = 1;
@ -312,6 +347,7 @@ void SQM_TSL2591::takeReading(void) {
lum = getFullLuminosity();
ir = lum >> 16;
full = lum & 0xFFFF;
calibrateReadingsForTemperature(ir, full);
vis = full - ir;
if ((float)full < (float)ir) {
if (verbose) {
@ -347,6 +383,7 @@ void SQM_TSL2591::takeReading(void) {
lum = getFullLuminosity();
ir = lum >> 16;
full = lum & 0xFFFF;
calibrateReadingsForTemperature(ir, full);
fullCumulative += full;
irCumulative += ir;
visCumulative = fullCumulative - irCumulative;

Wyświetl plik

@ -128,6 +128,13 @@ typedef struct {
tsl2591IntegrationTime_t time;
} sensorConfig;
typedef struct {
float fullLuminositySlope = 0.000705244123;
float fullLuminosityIntercept = 0.9794303797;
float irSlope = -0.001939421338;
float irIntercept = 1.05;
} temperatureCalibration;
class SQM_TSL2591 : public Adafruit_Sensor
{
@ -141,11 +148,14 @@ class SQM_TSL2591 : public Adafruit_Sensor
uint16_t read16 ( uint8_t reg );
uint8_t read8 ( uint8_t reg );
float calculateLux ( uint16_t ch0, uint16_t ch1 );
void setGain ( tsl2591Gain_t gain );
void setTiming ( tsl2591IntegrationTime_t integration );
void setCalibrationOffset ( float calibrationOffset);
uint32_t getFullLuminosity ( );
float calculateLux ( uint16_t ch0, uint16_t ch1 );
void setGain ( tsl2591Gain_t gain );
void setTiming ( tsl2591IntegrationTime_t integration );
void setCalibrationOffset ( float calibrationOffset);
uint32_t getFullLuminosity ( );
void setTemperatureCalibration ( const temperatureCalibration &calibrationData);
void setTemperature ( float temperature);
void resetTemperature ( );
tsl2591IntegrationTime_t getTiming();
tsl2591Gain_t getGain();
@ -172,6 +182,10 @@ class SQM_TSL2591 : public Adafruit_Sensor
tsl2591Gain_t _gain;
int32_t _sensorID;
float _calibrationOffset;
temperatureCalibration _temperatureCalibration;
float _temperature;
bool _hasTemperature = false;
void calibrateReadingsForTemperature(uint16_t &ir, uint16_t &full);
boolean _initialized;
};