环境光传感器
2023-09-11
环境光传感器包含光照强度传感器、颜色传感器、紫外线传感器和兼具多种功能的传感器。它可以提供多种环境光相关的数据,包括光照强度、颜色信息和紫外线辐射等,为系统提供丰富的环境感知能力。以下是一些典型应用场景。
- 智能亮度调节:环境光传感器可以测量周围环境的光照强度,并根据测量结果自动调节显示屏、背光灯或照明设备的亮度。这可以实现室内和室外显示设备的舒适视觉体验,并节省能源。
- 智能农业系统:在农业领域,光照强度传感器可以用于监测环境的光照水平。根据测量数据,触发自动调光系统或实现节能措施。
- 健康监测设备:紫外线传感器可以测量环境中的紫外线辐射强度。应用在穿戴设备上,可在户外环境中对紫外线辐射水平进行实时监测,并提醒用户采取适当的防护措施。
支持列表
Quecpython目前已支持的环境光传感器型号表
型号 | 类型 | 总线 | 规格书 | 代码链接 |
---|---|---|---|---|
OPT3001 | 光照度传感器 | I2C | 规格书 | 代码链接 |
BH1750 | 光照度传感器 | I2C | 规格书 | 代码链接 |
GL5516 | 光敏电阻 | ADC | 规格书 | 代码链接 |
GL5528 | 光敏电阻 | ADC | 规格书 | 代码链接 |
硬件介绍
本章节主要基于 LTE OPEN-EVB_V1.1和EC600U TE-A和OPT3001传感器模块,演示如何调试一款光照传感器。
软件设计
工作流程
如下图所示为一个典型的光照度传感器的工作流程。
API参考
以下 API 实现了对OPT3001传感器的功能抽象,用户可直接引用OPT3001类,调用其API编写传感器应用程序。
不同光照传感器通信总线和光照强度计算方式可能有点差异,用户可以根据规格书,调整这两点来实现自己的传感器类。
类引用:
from opt3001 import Opt3001
实例化:
i2c_obj=I2C(I2C.I2C1,I2C.FAST_MODE)
opt = Opt3001(i2c_obj)
参数描述:
i2c_obj
- I2C对象,obj类型。dev_addr
- I2C从设备地址,int类型,默认0x44。
Opt3001.set_measure_mode
设置测量模式,持续测量和单次测量或休眠模式。
参数描述:
mode
- 测量模式,非必填,int类型,缺省值2,2:连续测量模式。0:休眠模式,1:单次测量模式。
返回值描述:
-1
- 失败。0
- 成功。
Opt3001.read
读取照度值。
注意:转化时间初始化为800ms,两次读取之间间隔需大于800ms。
返回值描述:
illuminance
- 照度,float类型。
实验设计
1.初始化EC600U的I2C 1通道,通过I2C来读取opt3001数据。
2.配置opt3001寄存器。
3.设置测量模式为连续测量模式,将读取值转化成lux值。
实验代码
传感器类设计如下:
class Opt3001(object):
def __init__(self,i2c,dev_addr=I2C_ADDR):
self._i2c = i2c
self._i2c_addr = dev_addr
manu_id = self._read_data(I2C_LS_REG_MANUFACTURERID, 2)
manu_id = (manu_id[0] << 8) | manu_id[1]
print(manu_id)
if manu_id != 0x5449:
raise Exception("OPT3001 manu id err.")
self._write_data(I2C_LS_REG_CONFIG, [0xcc,0x10])
utime.sleep_ms(15)
print("sensor init complete.")
def _write_data(self, reg, data):
self._i2c.write(self._i2c_addr,
bytearray([reg]), len([reg]),
bytearray(data), len(data))
def _read_data(self, reg, length):
r_data = [0x00 for i in range(length)]
r_data = bytearray(r_data)
ret = self._i2c.read(self._i2c_addr,
bytearray([reg]), len([reg]),
r_data, length,
0)
return list(r_data)
def set_measure_mode(self,mode=CONTINU_MODE):
'''
Set the measurement mode, continuous measurement and single measurement or shutdown
:param mode: measurement mode 0-off 1-single 2-continuous
:return: 0-success -1-mode wrong selection
'''
if mode not in range(3):
return -1
r_data = self._read_data(I2C_LS_REG_CONFIG, 2)
r_data = (r_data[0] << 8) | r_data[1]
print(r_data)
w_data = (r_data & 0xf9ff) | (mode << 9)
print(w_data)
self._write_data(I2C_LS_REG_CONFIG, [(w_data >> 8), (w_data & 0xff)])
utime.sleep_ms(20)
return 0
def read(self):
'''
The read value is converted into a lux value
please ensure that the measurement mode is not 0, otherwise it will get stuck
@return: illuminance value,Unit:lux
'''
while 1:
r_data = self._read_data(I2C_LS_REG_CONFIG, 2)[1]
if (r_data & (1 << 7)): #converted flag
lux_ori = self._read_data(I2C_LS_REG_RESULT,2)
lux_ori = (lux_ori[0] << 8) | lux_ori[1]
#convert illuminance value
mantisse = lux_ori & 0x0fff
exponent = (lux_ori & 0xf000) >> 12
lux = 2 ** exponent * mantisse * 0.01
return lux
注意
- 初始化过程中读取设备ID错误,可能是因为总线通信失败,或是规格书中的设备ID与代码中的不符。
- 如您正在调试一款支持列表中未包含的型号时,请先仔细阅读传感器的规格书,可以仿照上述代码流程进行开发。
主程序设计如下:
if __name__ == "__main__":
i2c_obj=I2C(I2C.I2C1,I2C.FAST_MODE)
opt = Opt3001(i2c_obj)
for i in range(20):
opt.set_measure_mode(1)
utime.sleep_ms(1000) # at least 800ms
print("measurement times:{}------------".format(i+1))
lux = opt.read()
print("The light intensity is {0} lux".format(lux))
效果验证
将示例代码下载进模组运行,运行期间,可以选择用手遮盖或者手电筒照射,可以观察到OPT3001光敏传感器的照度值变化