Skip to content

Commit 5bcc11f

Browse files
committed
Add UV index, refactor to adafruit_register
1 parent e457f2c commit 5bcc11f

File tree

1 file changed

+47
-8
lines changed

1 file changed

+47
-8
lines changed

adafruit_si1145.py

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727
"""
2828

2929
import time
30-
import struct
3130
from micropython import const
3231
from adafruit_bus_device import i2c_device
32+
from adafruit_register.i2c_struct import Struct
3333

3434
__version__ = "0.0.0-auto.0"
3535
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_SI1145.git"
@@ -38,10 +38,15 @@
3838
SI1145_DEFAULT_ADDRESS = const(0x60)
3939
SI1145_PART_ID = const(0x00)
4040
SI1145_HW_KEY = const(0x07)
41+
_COEFF_0 = const(0x13)
42+
_COEFF_1 = const(0x14)
43+
_COEFF_2 = const(0x15)
44+
_COEFF_3 = const(0x16)
4145
SI1145_PARAM_WR = const(0x17)
4246
SI1145_COMMAND = const(0x18)
4347
SI1145_RESPONSE = const(0x20)
4448
SI1145_ALS_VIS_DATA0 = const(0x22)
49+
SI1145_UV_INDEX_DATA0 = const(0x2C)
4550
SI1145_PARAM_RD = const(0x2E)
4651

4752
# Commands (for COMMAND register)
@@ -58,20 +63,30 @@
5863
class SI1145:
5964
"""Driver for the SI1145 UV, IR, Visible Light Sensor."""
6065

66+
_device_info = Struct(SI1145_PART_ID, "<BBB")
67+
_ucoeff_0 = Struct(_COEFF_0, "<B") # TODO: const(coeff)
68+
_ucoeff_1 = Struct(_COEFF_1, "<B")
69+
_ucoeff_2 = Struct(_COEFF_2, "<B")
70+
_ucoeff_3 = Struct(_COEFF_3, "<B")
71+
_als_data = Struct(SI1145_ALS_VIS_DATA0, "<HH")
72+
_aux_data = Struct(SI1145_UV_INDEX_DATA0, "<H")
73+
6174
def __init__(self, i2c, address=SI1145_DEFAULT_ADDRESS):
62-
self._i2c = i2c_device.I2CDevice(i2c, address)
75+
self.i2c_device = i2c_device.I2CDevice(i2c, address)
6376
dev_id, dev_rev, dev_seq = self.device_info
6477
if dev_id != 69 or dev_rev != 0 or dev_seq != 8:
6578
raise RuntimeError("Failed to find SI1145.")
6679
self.reset()
6780
self._write_register(SI1145_HW_KEY, 0x17)
6881
self._als_enabled = True
69-
self.als_enabled = True
82+
self._uv_index_enabled = True
83+
self.als_enabled = self._als_enabled
84+
self.uv_index_enabled = self._uv_index_enabled
7085

7186
@property
7287
def device_info(self):
7388
"""A three tuple of part, revision, and sequencer ID"""
74-
return tuple(self._read_register(SI1145_PART_ID, 3))
89+
return self._device_info
7590

7691
@property
7792
def als_enabled(self):
@@ -92,8 +107,32 @@ def als_enabled(self, enable):
92107
def als(self):
93108
"""A two tuple of the Ambient Light System (ALS) visible and infrared raw sensor values."""
94109
self._send_command(SI1145_CMD_ALS_FORCE)
95-
data = self._read_register(SI1145_ALS_VIS_DATA0, 4)
96-
return struct.unpack("HH", data)
110+
return self._als_data
111+
112+
@property
113+
def uv_index_enabled(self):
114+
"""The UV Index system enabled state"""
115+
return self._uv_index_enabled
116+
117+
@uv_index_enabled.setter
118+
def uv_index_enabled(self, enable):
119+
chlist = self._param_query(SI1145_RAM_CHLIST)
120+
if enable:
121+
chlist |= 0b01000000
122+
else:
123+
chlist &= ~0b01000000
124+
self._param_set(SI1145_RAM_CHLIST, chlist)
125+
self._als_enabled = enable
126+
127+
self._ucoeff_0 = 0x00
128+
self._ucoeff_1 = 0x02
129+
self._ucoeff_2 = 0x89
130+
self._ucoeff_3 = 0x29
131+
132+
@property
133+
def uv_index(self):
134+
"""The UV Index value"""
135+
return self._aux_data[0] / 100
97136

98137
def reset(self):
99138
"""Perform a software reset of the firmware."""
@@ -126,12 +165,12 @@ def _send_command(self, command):
126165

127166
def _read_register(self, register, length=1):
128167
buffer = bytearray(length)
129-
with self._i2c as i2c:
168+
with self.i2c_device as i2c:
130169
i2c.write_then_readinto(bytes([register]), buffer)
131170
return buffer[0] if length == 1 else buffer
132171

133172
def _write_register(self, register, buffer):
134173
if isinstance(buffer, int):
135174
buffer = bytes([buffer])
136-
with self._i2c as i2c:
175+
with self.i2c_device as i2c:
137176
i2c.write(bytes([register]) + buffer)

0 commit comments

Comments
 (0)