19
19
20
20
Adafruit_SI1145::Adafruit_SI1145 () {
21
21
_addr = SI1145_ADDR;
22
+ _vis_dark = 256 ; // as per Si114x manual - previously ADC_OFFSET but now fixed at 256
23
+ _ir_dark = 256 ;
22
24
}
23
25
24
26
@@ -108,25 +110,61 @@ void Adafruit_SI1145::reset() {
108
110
109
111
110
112
// ////////////////////////////////////////////////////
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
+ }
111
134
112
135
// returns the UV index * 100 (divide by 100 to get the index)
113
136
uint16_t Adafruit_SI1145::readUV (void ) {
114
137
return read16 (0x2C );
115
138
}
116
139
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
+
117
147
// returns visible+IR light levels
118
148
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;
120
154
}
121
155
122
156
// returns IR light levels
123
157
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;
125
163
}
126
164
127
165
// returns "Proximity" - assumes an IR LED is attached to LED
128
166
uint16_t Adafruit_SI1145::readProx (void ) {
129
- return read16 (0x26 );
167
+ return read16 (SI1145_REG_PS1DATA0);
130
168
}
131
169
132
170
/* ********************************************************************/
@@ -149,12 +187,12 @@ uint8_t Adafruit_SI1145::readParam(uint8_t p) {
149
187
150
188
uint8_t Adafruit_SI1145::read8 (uint8_t reg) {
151
189
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 ();
155
193
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 ();
158
196
}
159
197
160
198
uint16_t Adafruit_SI1145::read16 (uint8_t a) {
0 commit comments