Skip to content

Commit 8fd697f

Browse files
committed
add dark frame calibration and add calculateLux method as per Si114x AN523
1 parent c10c31b commit 8fd697f

File tree

2 files changed

+66
-8
lines changed

2 files changed

+66
-8
lines changed

Diff for: Adafruit_SI1145.cpp

+46-8
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
Adafruit_SI1145::Adafruit_SI1145() {
2121
_addr = SI1145_ADDR;
22+
_vis_dark = 256; // as per Si114x manual - previously ADC_OFFSET but now fixed at 256
23+
_ir_dark = 256;
2224
}
2325

2426

@@ -108,25 +110,61 @@ void Adafruit_SI1145::reset() {
108110

109111

110112
//////////////////////////////////////////////////////
113+
// returns the visible gain
114+
Adafruit_SI1145::Gain Adafruit_SI1145::readVisibleGain() {
115+
return (Adafruit_SI1145::Gain) readParam(SI1145_PARAM_ALSVISADCGAIN);
116+
}
117+
118+
// adjust the visible gain
119+
void Adafruit_SI1145::setVisibleGain(Adafruit_SI1145::Gain gain) {
120+
uint8_t g = (uint8_t) gain;
121+
writeParam(SI1145_PARAM_ALSVISADCGAIN, g);
122+
}
123+
124+
// returns the IR gain
125+
Adafruit_SI1145::Gain Adafruit_SI1145::readIRGain() {
126+
return (Adafruit_SI1145::Gain) readParam(SI1145_PARAM_ALSIRADCGAIN);
127+
}
128+
129+
// adjust the IR gain
130+
void Adafruit_SI1145::setIRGain(Adafruit_SI1145::Gain gain) {
131+
uint8_t g = (uint8_t) gain;
132+
writeParam(SI1145_PARAM_ALSIRADCGAIN, g);
133+
}
111134

112135
// returns the UV index * 100 (divide by 100 to get the index)
113136
uint16_t Adafruit_SI1145::readUV(void) {
114137
return read16(0x2C);
115138
}
116139

140+
// returns a calculated lux value as per SI144x AN523.6.
141+
float Adafruit_SI1145::calculateLux(uint16_t vis, uint16_t ir) {
142+
uint8_t gain = readVisibleGain();
143+
float lux = ((5.41f * vis) + (-0.08f * ir)) / (1 + 2 * gain);
144+
return lux;
145+
}
146+
117147
// returns visible+IR light levels
118148
uint16_t Adafruit_SI1145::readVisible(void) {
119-
return read16(0x22);
149+
uint16_t vis = read16(SI1145_REG_ALSVISDATA0);
150+
if (vis < _vis_dark)
151+
_vis_dark = vis;
152+
vis -= _vis_dark;
153+
return vis;
120154
}
121155

122156
// returns IR light levels
123157
uint16_t Adafruit_SI1145::readIR(void) {
124-
return read16(0x24);
158+
uint16_t ir = read16(SI1145_REG_ALSIRDATA0);
159+
if (ir < _ir_dark)
160+
_ir_dark = ir;
161+
ir -= _ir_dark;
162+
return ir;
125163
}
126164

127165
// returns "Proximity" - assumes an IR LED is attached to LED
128166
uint16_t Adafruit_SI1145::readProx(void) {
129-
return read16(0x26);
167+
return read16(SI1145_REG_PS1DATA0);
130168
}
131169

132170
/*********************************************************************/
@@ -149,12 +187,12 @@ uint8_t Adafruit_SI1145::readParam(uint8_t p) {
149187

150188
uint8_t Adafruit_SI1145::read8(uint8_t reg) {
151189
uint16_t val;
152-
Wire.beginTransmission(_addr);
153-
Wire.write((uint8_t)reg);
154-
Wire.endTransmission();
190+
Wire.beginTransmission(_addr);
191+
Wire.write((uint8_t)reg);
192+
Wire.endTransmission();
155193

156-
Wire.requestFrom((uint8_t)_addr, (uint8_t)1);
157-
return Wire.read();
194+
Wire.requestFrom((uint8_t)_addr, (uint8_t)1);
195+
return Wire.read();
158196
}
159197

160198
uint16_t Adafruit_SI1145::read16(uint8_t a) {

Diff for: Adafruit_SI1145.h

+20
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,28 @@
150150

151151
class Adafruit_SI1145 {
152152
public:
153+
enum Gain {
154+
ADC_0 = 0,
155+
ADC_1,
156+
ADC_2,
157+
ADC_3,
158+
ADC_4,
159+
ADC_5,
160+
ADC_6,
161+
ADC_7
162+
};
153163
Adafruit_SI1145(void);
154164
boolean begin();
155165
void reset();
156166

167+
Gain readVisibleGain();
168+
void setVisibleGain(Gain gain);
169+
170+
Gain readIRGain();
171+
void setIRGain(Gain gain);
172+
173+
float calculateLux(uint16_t vis, uint16_t ir);
174+
157175
uint16_t readUV();
158176
uint16_t readIR();
159177
uint16_t readVisible();
@@ -167,5 +185,7 @@ class Adafruit_SI1145 {
167185
uint8_t writeParam(uint8_t p, uint8_t v);
168186

169187
uint8_t _addr;
188+
uint16_t _vis_dark;
189+
uint16_t _ir_dark;
170190
};
171191
#endif

0 commit comments

Comments
 (0)