学物联网,来万物简单IoT物联网!!
一、产品简介
BH1750 是罗姆(ROHM)半导体集团出品的数字光强传感器,也称作光敏传感器。广泛应用于移动手机、LCD电视、电脑PC、掌上游戏机、数码相机、数码摄像机、汽车导航、PDA、LCD显示屏幕等等。
二、技术参数
- I2C总线接口,支持快速或标准模式(F/S模式)
- 近似人眼的光谱反应能力
- 光照度到数字信号的转换器
- 宽范围和高分辨率(1-65535lx)
- 通过断电达到低电流
- 50Hz / 60Hz 光噪声抑制功能
- 1.8v逻辑输入接口
- 不需要任何外围电路
- 光源依赖性小。(例如,可用于白炽灯、荧光灯、卤素灯、白光 LED、太阳光)
- 可选择 2种 I2C 从地址
- 红外线影响很小
- WSOF6I 封装 2.6mm * 1.6mm
三、软件接口
注:获取值单位为勒克斯 (lux,法定符号lx)是照度(luminance)的单位。
BH1750(i2cObj) - 创建BH1750驱动对象
- 函数原型:
bh1750Obj = BH1750(i2cObj)
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
i2cObj | I2C | 是 | 传入I2C对象 |
- 返回值:
BH1750对象成功,返回BH1750对象;BH1750对象创建失败,抛出Exception - 示例代码:
from machine import I2C, Pin # 驱动库
import bh1750 # BH1750温湿度传感器驱动库
# 初始化I2C类型的设备
i2cObj = I2C(1, scl=Pin(22), sda=Pin(21), freq=400000)
print("BH1750 inited!")
bh1750Obj = bh1750.BH1750(i2cObj) # 初始化BH1750传感器对象
- 输出:
BH1750 inited!
getLuminance - 获取照度值
- 函数功能:
发起测量请求,等待测量完成后(24ms),获取照度值并返回 - 函数原型:
bh1750Obj.getLuminance()
- 参数说明:
无 - 返回值:
成功返回光强测量结果(数据类型:浮点型;单位:照度);失败抛出Exception - 示例:
from machine import I2C, Pin # 驱动库
import bh1750 # BH1750温湿度传感器驱动库
# 初始化I2C类型的设备
i2cObj = I2C(1, scl=Pin(22), sda=Pin(21), freq=400000)
print("BH1750 inited!")
bh1750Obj = bh1750.BH1750(i2cObj) # 初始化BH1750传感器对象
ret = bh1750Obj.getLuminance()
print("luminance is ", ret, "lx")
- 输出:
BH1750 inited!
luminance is 115lx
四、接口案例
- 代码:
# Python代码
import utime # 延时函数在utime库中
from machine import I2C, Pin # 驱动库
import bh1750 # BH1750温湿度传感器驱动库
if __name__ == '__main__':
# 初始化I2C类型的设备
i2cObj = I2C(1, scl=Pin(22), sda=Pin(21), freq=400000)
print("BH1750 inited!")
if i2cObj != 0:
raise Exception('can not open i2c')
# 初始化 BH1750 传感器
dbh1750Obj = bh1750.BH1750(i2cObj) # 初始化BH1750传感器对象
while True: # 无限循环
val = dbh1750Obj.getLuminance() # 获取光照度
print('luminance is %s lx' % val)
utime.sleep(1)
- 输出:
BH1750 inited!
...
luminance is 44.16667 lx
...
luminance is 30.0 lx
...
五、通信协议
主控芯片和 BH1750 传感器之间通信所用命令字如下表所示:
序号 | 命令字 | 功能说明 | 命令字宏定义 |
---|---|---|---|
1 | 0b0000_0000 | 关电 - Power Down | CMD_POWER_DOWN |
2 | 0b0000_0001 | 上电 - Power On | CMD_POWER_ON |
3 | 0b0000_0111 | 复位 - Reset | CMD_RESET |
4 | 0b0001_0000 | 连续测量、高分辨率模式 - Continuously H-Resolution Mode | CMD_CONT_H_MODE |
5 | 0b0001_0001 | 连续测量、高分辨率模式2 - Continuously H-Resolution Mode2 | CMD_CONT_H_MODE2 |
6 | 0b0001_0011 | 连续测量、低分辨率模式 - Continuously L-Resolution Mode | CMD_CONT_L_MODE |
7 | 0b0010_0000 | 一次测量、高分辨率模式 - One Time H-Resolution Mode | CMD_ONE_H_MODE |
9 | 0b0010_0001 | 一次测量、高分辨率模式2 - One Time H-Resolution Mode2 | CMD_ONE_H_MODE2 |
10 | 0b0010_0011 | 一次测量、低分辨率模式 - One Time L-Resolution Mode | CMD_ONE_L_MODE |
实际控制此传感器的流程可参考如下伪代码。
- 一次获取数据
通过 I2C 发送 CMD_ONE_H_MODE、CMD_ONE_H_MODE2、CMD_ONE_L_MODE
高分辨率等待 180ms,低分辨率等待 24ms MAX.,传感器完成测量
HIGH_BYTE, LOW_BYTE = 通过I2C发起读操作(2字节)
将两次读操作读到的字节组合成实际光照度(HIGH_BYTE << 8 | LOW_BYTE)
如果需要新测量值,则需要再发起测量命令,因此此时传感器状态已为 Power Down
- 连续获取数据
通过 I2C 发送 CMD_CONT_H_MODE、CMD_CONT_H_MODE2、CMD_CONT_L_MODE
高分辨率等待 180ms,低分辨率等待 24ms MAX.,传感器完成测量
HIGH_BYTE, LOW_BYTE = 通过I2C发起读操作(2字节)
将两次读操作读到的字节组合成实际光照度(HIGH_BYTE << 8 | LOW_BYTE)
如果需要新测量值,则继续发起读命令,高分辨率需要间隔 120ms,低分辨率需要间隔 16ms TYP.
六、工作原理
从如下方框图可以看到 BH1750 内部集成了PD(Photo-Diode)光电二极管,信号放大后通过ADC采样输入到I2C控制器种。通过数字接口IIC读取数据。
引脚分布如下,左侧依次为 VCC、ADDR、GND,其中ADDR为I2C地址选择引脚可以上拉或下拉选择不同地址。示例中我们采用下拉方式。右侧为SCL、DVI、SDA,其中SCL、SDA为I2C协议数据&时钟传输线。
参考文献及购买链接
[1] BH1750传感器介绍
[2] BH1750传感器购买链接