QuecPython已支持多种环境光传感器

环境光传感器

环境光传感器包含光照强度传感器、颜色传感器、紫外线传感器和兼具多种功能的传感器。它可以提供多种环境光相关的数据,包括光照强度、颜色信息和紫外线辐射等,为系统提供丰富的环境感知能力。以下是一些典型应用场景。

  • 智能亮度调节:环境光传感器可以测量周围环境的光照强度,并根据测量结果自动调节显示屏、背光灯或照明设备的亮度。这可以实现室内和室外显示设备的舒适视觉体验,并节省能源。

  • 智能农业系统:在农业领域,光照强度传感器可以用于监测环境的光照水平。根据测量数据,触发自动调光系统或实现节能措施。

  • 健康监测设备:紫外线传感器可以测量环境中的紫外线辐射强度。应用在穿戴设备上,可在户外环境中对紫外线辐射水平进行实时监测,并提醒用户采取适当的防护措施。

支持列表

Quecpython目前已支持的环境光传感器型号表:

型号 类型 总线 规格书 代码链接
OPT3001 光照度传感器 I2C 规格书 代码链接
BH1750 光照度传感器 I2C 规格书 代码链接
GL5516 光敏电阻 ADC 规格书 代码链接
GL5528 光敏电阻 ADC 规格书 代码链接

硬件介绍

本章节主要基于 LTE OPEN-EVB_V1.1和EC600U TE-A和OPT3001传感器模块,演示如何调试一款光照传感器。

详见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光敏传感器的照度值变化