-
Notifications
You must be signed in to change notification settings - Fork 0
/
Si1145.py
278 lines (206 loc) · 7.51 KB
/
Si1145.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
#!/usr/bin/python
# -*- coding:UTF-8 -*-
import smbus
import time
# COMMANDS
SI1145_PARAM_QUERY = 0x80
SI1145_PARAM_SET = 0xA0
SI1145_NOP = 0x0
SI1145_RESET = 0x01
SI1145_BUSADDR = 0x02
SI1145_PS_FORCE = 0x05
SI1145_ALS_FORCE = 0x06
SI1145_PSALS_FORCE = 0x07
SI1145_PS_PAUSE = 0x09
SI1145_ALS_PAUSE = 0x0A
SI1145_PSALS_PAUSE = 0xB
SI1145_PS_AUTO = 0x0D
SI1145_ALS_AUTO = 0x0E
SI1145_PSALS_AUTO = 0x0F
SI1145_GET_CAL = 0x12
# Parameters
SI1145_PARAM_I2CADDR = 0x00
SI1145_PARAM_CHLIST = 0x01
SI1145_PARAM_CHLIST_ENUV = 0x80
SI1145_PARAM_CHLIST_ENAUX = 0x40
SI1145_PARAM_CHLIST_ENALSIR = 0x20
SI1145_PARAM_CHLIST_ENALSVIS = 0x10
SI1145_PARAM_CHLIST_ENPS1 = 0x01
SI1145_PARAM_CHLIST_ENPS2 = 0x02
SI1145_PARAM_CHLIST_ENPS3 = 0x04
SI1145_PARAM_PSLED12SEL = 0x02
SI1145_PARAM_PSLED12SEL_PS2NONE = 0x00
SI1145_PARAM_PSLED12SEL_PS2LED1 = 0x10
SI1145_PARAM_PSLED12SEL_PS2LED2 = 0x20
SI1145_PARAM_PSLED12SEL_PS2LED3 = 0x40
SI1145_PARAM_PSLED12SEL_PS1NONE = 0x00
SI1145_PARAM_PSLED12SEL_PS1LED1 = 0x01
SI1145_PARAM_PSLED12SEL_PS1LED2 = 0x02
SI1145_PARAM_PSLED12SEL_PS1LED3 = 0x04
SI1145_PARAM_PSLED3SEL = 0x03
SI1145_PARAM_PSENCODE = 0x05
SI1145_PARAM_ALSENCODE = 0x06
SI1145_PARAM_PS1ADCMUX = 0x07
SI1145_PARAM_PS2ADCMUX = 0x08
SI1145_PARAM_PS3ADCMUX = 0x09
SI1145_PARAM_PSADCOUNTER = 0x0A
SI1145_PARAM_PSADCGAIN = 0x0B
SI1145_PARAM_PSADCMISC = 0x0C
SI1145_PARAM_PSADCMISC_RANGE = 0x20
SI1145_PARAM_PSADCMISC_PSMODE = 0x04
SI1145_PARAM_ALSIRADCMUX = 0x0E
SI1145_PARAM_AUXADCMUX = 0x0F
SI1145_PARAM_ALSVISADCOUNTER = 0x10
SI1145_PARAM_ALSVISADCGAIN = 0x11
SI1145_PARAM_ALSVISADCMISC = 0x12
SI1145_PARAM_ALSVISADCMISC_VISRANGE = 0x20
SI1145_PARAM_ALSIRADCOUNTER = 0x1D
SI1145_PARAM_ALSIRADCGAIN = 0x1E
SI1145_PARAM_ALSIRADCMISC = 0x1F
SI1145_PARAM_ALSIRADCMISC_RANGE = 0x20
SI1145_PARAM_ADCCOUNTER_511CLK = 0x70
SI1145_PARAM_ADCMUX_SMALLIR = 0x00
SI1145_PARAM_ADCMUX_LARGEIR = 0x03
# REGISTERS
SI1145_REG_PARTID = 0x00
SI1145_REG_REVID = 0x01
SI1145_REG_SEQID = 0x02
SI1145_REG_INTCFG = 0x03
SI1145_REG_INTCFG_INTOE = 0x01
SI1145_REG_INTCFG_INTMODE = 0x02
SI1145_REG_IRQEN = 0x04
SI1145_REG_IRQEN_ALSEVERYSAMPLE = 0x01
SI1145_REG_IRQEN_PS1EVERYSAMPLE = 0x04
SI1145_REG_IRQEN_PS2EVERYSAMPLE = 0x08
SI1145_REG_IRQEN_PS3EVERYSAMPLE = 0x10
SI1145_REG_IRQMODE1 = 0x05
SI1145_REG_IRQMODE2 = 0x06
SI1145_REG_HWKEY = 0x07
SI1145_REG_MEASRATE0 = 0x08
SI1145_REG_MEASRATE1 = 0x09
SI1145_REG_PSRATE = 0x0A
SI1145_REG_PSLED21 = 0x0F
SI1145_REG_PSLED3 = 0x10
SI1145_REG_UCOEFF0 = 0x13
SI1145_REG_UCOEFF1 = 0x14
SI1145_REG_UCOEFF2 = 0x15
SI1145_REG_UCOEFF3 = 0x16
SI1145_REG_PARAMWR = 0x17
SI1145_REG_COMMAND = 0x18
SI1145_REG_RESPONSE = 0x20
SI1145_REG_IRQSTAT = 0x21
SI1145_REG_IRQSTAT_ALS= 0x01
SI1145_REG_ALSVISDATA0= 0x22
SI1145_REG_ALSVISDATA1= 0x23
SI1145_REG_ALSIRDATA0 = 0x24
SI1145_REG_ALSIRDATA1 = 0x25
SI1145_REG_PS1DATA0 = 0x26
SI1145_REG_PS1DATA1 = 0x27
SI1145_REG_PS2DATA0 = 0x28
SI1145_REG_PS2DATA1 = 0x29
SI1145_REG_PS3DATA0 = 0x2A
SI1145_REG_PS3DATA1 = 0x2B
SI1145_REG_UVINDEX0 = 0x2C
SI1145_REG_UVINDEX1 = 0x2D
SI1145_REG_PARAMRD = 0x2E
SI1145_REG_CHIPSTAT = 0x30
SI1145_I2C_ADDRESS = 0x60
bus = 0
def Si1145_Init():
global bus
bus = smbus.SMBus(1)
id = Si1145_read8(SI1145_REG_PARTID)
if(id != 0x45):
print("Si1145 ID error ! Now you read is: ", id)
while(1):
time.sleep(1)
Si1145_Reset()
#***********************************
# enable UVindex measurement coefficients!
Si1145_write8(SI1145_REG_UCOEFF0, 0x29)
Si1145_write8(SI1145_REG_UCOEFF1, 0x89)
Si1145_write8(SI1145_REG_UCOEFF2, 0x02)
Si1145_write8(SI1145_REG_UCOEFF3, 0x00)
# enable UV sensor
Si1145_writeParam(SI1145_PARAM_CHLIST, SI1145_PARAM_CHLIST_ENUV |\
SI1145_PARAM_CHLIST_ENALSIR | SI1145_PARAM_CHLIST_ENALSVIS |\
SI1145_PARAM_CHLIST_ENPS1)
# enable interrupt on every sample
Si1145_write8(SI1145_REG_INTCFG, SI1145_REG_INTCFG_INTOE)
Si1145_write8(SI1145_REG_IRQEN, SI1145_REG_IRQEN_ALSEVERYSAMPLE)
#****************************** Prox Sense 1
# program LED current
Si1145_write8(SI1145_REG_PSLED21, 0x03) # 20mA for LED 1 only
Si1145_writeParam(SI1145_PARAM_PS1ADCMUX, SI1145_PARAM_ADCMUX_LARGEIR)
# prox sensor #1 uses LED #1
Si1145_writeParam(SI1145_PARAM_PSLED12SEL, SI1145_PARAM_PSLED12SEL_PS1LED1)
# fastest clocks, clock div 1
Si1145_writeParam(SI1145_PARAM_PSADCGAIN, 0)
# take 511 clocks to measure
Si1145_writeParam(SI1145_PARAM_PSADCOUNTER, SI1145_PARAM_ADCCOUNTER_511CLK)
# in prox mode, high range
Si1145_writeParam(SI1145_PARAM_PSADCMISC, SI1145_PARAM_PSADCMISC_RANGE|\
SI1145_PARAM_PSADCMISC_PSMODE)
Si1145_writeParam(SI1145_PARAM_ALSIRADCMUX, SI1145_PARAM_ADCMUX_SMALLIR)
# fastest clocks, clock div 1
Si1145_writeParam(SI1145_PARAM_ALSIRADCGAIN, 0)
# take 511 clocks to measure
Si1145_writeParam(SI1145_PARAM_ALSIRADCOUNTER, SI1145_PARAM_ADCCOUNTER_511CLK);
# in high range mode
Si1145_writeParam(SI1145_PARAM_ALSIRADCMISC, SI1145_PARAM_ALSIRADCMISC_RANGE);
# fastest clocks, clock div 1
Si1145_writeParam(SI1145_PARAM_ALSVISADCGAIN, 0);
# take 511 clocks to measure
Si1145_writeParam(SI1145_PARAM_ALSVISADCOUNTER, SI1145_PARAM_ADCCOUNTER_511CLK);
# in high range mode (not normal signal)
Si1145_writeParam(SI1145_PARAM_ALSVISADCMISC, SI1145_PARAM_ALSVISADCMISC_VISRANGE);
# measurement rate for auto
Si1145_write8(SI1145_REG_MEASRATE0, 0xFF); # 255 * 31.25uS = 8ms
# auto run
Si1145_write8(SI1145_REG_COMMAND, SI1145_PSALS_AUTO);
print("Si145 Init success !")
def Si1145_Reset():
Si1145_write8(SI1145_REG_MEASRATE0, 0)
Si1145_write8(SI1145_REG_MEASRATE1, 0)
Si1145_write8(SI1145_REG_IRQEN, 0)
Si1145_write8(SI1145_REG_IRQMODE1, 0)
Si1145_write8(SI1145_REG_IRQMODE2, 0)
Si1145_write8(SI1145_REG_INTCFG, 0)
Si1145_write8(SI1145_REG_IRQSTAT, 0xFF)
Si1145_write8(SI1145_REG_COMMAND, SI1145_RESET)
time.sleep(0.01)
Si1145_write8(SI1145_REG_HWKEY, 0x17)
time.sleep(0.01)
# returns the UV index * 100 (divide by 100 to get the index)
def Si1145_readUV():
return Si1145_read16(0x2C)
# returns visible+IR light levels
def Si1145_readVisible():
return Si1145_read16(0x22)
# returns IR light levels
def Si1145_readIR():
return Si1145_read16(0x24)
# returns "Proximity" - assumes an IR LED is attached to LED
def Si1145_readProx():
return Si1145_read16(0x26)
#*********************************************************************/
def Si1145_writeParam(p, v):
Si1145_write8(SI1145_REG_PARAMWR, v)
Si1145_write8(SI1145_REG_COMMAND, p | SI1145_PARAM_SET)
return Si1145_read8(SI1145_REG_PARAMRD)
def Si1145_readParam(p):
Si1145_write8(SI1145_REG_COMMAND, p | SI1145_PARAM_QUERY)
return Si1145_read8(SI1145_REG_PARAMRD)
#*********************************************************************/
def Si1145_read8(addr):
global bus
return bus.read_byte_data(SI1145_I2C_ADDRESS, addr)
def Si1145_read16(addr):
global bus
return bus.read_word_data(SI1145_I2C_ADDRESS, addr)
def Si1145_write8(addr, val):
global bus
bus.write_byte_data(SI1145_I2C_ADDRESS, addr, val)
def Si1145_close():
global bus
bus.close()