Files
mixly3/boards/default/micropython/build/lib/ltr553als.py
2024-07-19 10:16:00 +08:00

107 lines
3.0 KiB
Python

"""
LTR-553ALS-XX
MicroPython library for the LTR-553ALS-XX(ALS,PS)
=======================================================
#Preliminary composition 20220224
#Format unified 20220623
dahanzimin From the Mixly Team
"""
import time
from micropython import const
LTR_553ALS_ADDRESS = const(0x23)
LTR_ALS_REG_CONTR = const(0x80)
LTR_PS_REG_CONTR = const(0x81)
LTR_PS_REG_LED = const(0x82)
LTR_PS_REG_PULSES = const(0x83)
LTR_PS_REG_RATE = const(0x84)
LTR_ALS_REG_RATE = const(0x85)
LTR_553ALS_REG_ID = const(0x87)
LTR_ALS_REG_DATA1 = const(0x88)
LTR_553ALS_REG_ATATUS = const(0x8C)
LTR_PS_REG_DATA1 = const(0x8D)
_ALS_GAIN={
"X1":(1,0x01), # For Gain X1
"X2":(2,0x05), # For Gain X2
"X4":(4,0x09), # For Gain X4
"X8":(8,0x0D), # For Gain X8
"X48":(48,0x19), # For Gain X48
"X96":(96,0x1D), # For Gain X96
}
class LTR_553ALS:
def __init__(self, i2c_bus,addr=LTR_553ALS_ADDRESS,ALS_Gain="X1"):
self._device = i2c_bus
self._address = addr
self.ALS_IR = 0
self.ALS_VIS = 0
self.PS = 0
self.ALS_gain = ALS_Gain
if self._chip_id() != 0x05:
raise AttributeError("Cannot find a LTR_553ALS")
self._configure()
#time.sleep(0.1)
def _wreg(self, reg, val):
'''Write memory address'''
self._device.writeto_mem(self._address,reg,val.to_bytes(1, 'little'))
def _rreg(self, reg,nbytes=1):
'''Read memory address'''
return self._device.readfrom_mem(self._address, reg, nbytes)[0] if nbytes<=1 else self._device.readfrom_mem(self._address, reg, nbytes)[0:nbytes]
def _chip_id(self):
'''校对设备ID'''
return self._rreg(LTR_553ALS_REG_ID)
def _configure(self):
'''配置寄存器'''
self._wreg(LTR_ALS_REG_CONTR,_ALS_GAIN[self.ALS_gain][1]) # ALS_CONTR: Active mode
self._wreg(LTR_PS_REG_CONTR,0x03) # PS_CONTR: Active mode
self._wreg(LTR_PS_REG_LED,0x5B) #PS_LED: LED_pulse_period=50khz,DUTY = 100%,LED_pulsed_current_level = 50mA
self._wreg(LTR_PS_REG_PULSES,0x0A) #PS_N_Pulses: Number_of_pulses = 10
self._wreg(LTR_PS_REG_RATE,0x08) #PS_Measurement_Rate=10ms
self._wreg(LTR_ALS_REG_RATE,0x12) #ALS_Measurement_Rate=200ms,ALS_integration_time=200ms
def _status(self):
'''数据转换状态'''
status=self._rreg(LTR_553ALS_REG_ATATUS)
return status&0x84, status&0x01 #ALS,PS status
@property
def getdata(self):
'''处理获取数据'''
if self._status()[0]:
data_als=self._rreg(LTR_ALS_REG_DATA1,4)
als_ch1=data_als[0] | data_als[1]<<8
als_ch0=data_als[2] | data_als[3]<<8
ratio=als_ch1/(als_ch1+als_ch0) if (als_ch1+als_ch0)>0 else 0
self.ALS_IR =als_ch1*ratio/_ALS_GAIN[self.ALS_gain][0]
self.ALS_VIS=als_ch0*ratio/_ALS_GAIN[self.ALS_gain][0]
if self._status()[1]:
data_ps=self._rreg(LTR_PS_REG_DATA1,2)
self.PS =data_ps[0] | data_ps[1]<<8
return round(self.ALS_VIS,2),round(self.ALS_IR,2),self.PS
def als_vis(self):
'''可见光Lux'''
return self.getdata[0]
def als_ir(self):
'''红外Lux'''
return self.getdata[1]
def ps_nl(self):
'''接近距离'''
return self.getdata[2]