diff --git a/SQM_TSL2591/SQM_TSL2591.cpp b/SQM_TSL2591/SQM_TSL2591.cpp index 219a04f..54ba84b 100644 --- a/SQM_TSL2591/SQM_TSL2591.cpp +++ b/SQM_TSL2591/SQM_TSL2591.cpp @@ -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(static_cast(ir) * irCalibrationFactor); + full = static_cast(static_cast(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; diff --git a/SQM_TSL2591/SQM_TSL2591.h b/SQM_TSL2591/SQM_TSL2591.h index ba1dbde..952de4c 100755 --- a/SQM_TSL2591/SQM_TSL2591.h +++ b/SQM_TSL2591/SQM_TSL2591.h @@ -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; };