【硬件】【传感器 BH1750FVI】

Ambient Light Sensor / 环境光传感器: BH1750FVI

简介: 环境光传感器

  • 厂商: ROHM
  • 立创商城采购链接
  • 测量精度: 0.96 ~ 1.2 ~ 1.44
  • 分辨率: 1 - 65535 lx
  • 工作电压: 2.4 - 3.6V,Typ. = 3.0V
  • 工作温度: -40℃ ~ +85℃

功能框图:

其中,Logic + I2C Interface 包含两类寄存器:

  • 数据寄存器: 测量的环境光数据(即,内部 ADC 转换出的数据,为 16bit),初始值为 “0000 0000 0000 0000”
  • 测量时间寄存器: 测量时间,初始值为 “0100 0101”

OSC 为内部电路提供时钟,典型值为 320KHz


管脚定义:

管脚编号管脚名称描述
1VCC电源脚
2ADDRADDR = H(>= 0.7xVCC),slave 地址为 “1011 100”; ADDR = L(=< 0.3xVCC),slave 地址为 “0100 011”。电路结构为 3 state buffer
3GND
4SDAI2C 串行数据接口
5DVII2C 总线的参考电平;内部寄存器异步复位:DVI <= 0.4V, at least 1us。BH1750FVI is pulled down by 150K while DVI=L
6SCLI2C 串行时钟接口

上电及复位操作:

  • 异步复位: DVI 需要在 VCC 供电后维持超过 1us 的低电平,以保证内部逻辑正确进入 Power Down Mode
  • 复位命令: 即 “0000 0111”,用来清除先前采集的数据。该命令在 Power Down Mode 下无效。

应用电路设计:

设计中,需要保证 DVI 与 VCC 之间的时序关系,一般有两种方案可以实现:

1)MCU 控制 DVI 信号:

2)VCC 与 DVI 之间嵌入 RC 电路实现:

推荐 R = 1K,C = 1uF。 当 VCC 关掉时,由于 RC 的存在,DVI 的电压会比 VCC 高,但是在我们推荐的 RC 参数下,并不会对芯片造成损坏。该参数在电路板上实测 Reset Section 约在 1ms,远满足需求。


软件 workflow:

指令名称指令代码指令描述
Power Down0000 0000掉电模式
Power On0000 0001上电:等待测量命令
Reset0000 0111复位数据寄存器。掉电模式下,Reset 命令无效
Continuously H-Resolution Mode(推荐)0001 0000以 1lx 分辨率开始测量;测量时间约 120ms
Continuously H-Resolution Mode 20001 0001以 0.5lx 分辨率开始测量;测量时间约 120ms
Continuously L-Resolution Mode0001 0011以 4lx 分辨率开始测量;测量时间约 16ms
One Time H-Resolution Mode(推荐)0010 0000以 1lx 分辨率开始测量;测量时间约 120ms;测量结束后自动进入 Power Down Mode
One Time H-Resolution Mode 20010 0001以 0.5lx 分辨率开始测量;测量时间约 120ms;测量结束后自动进入 Power Down Mode
One Time L-Resolution Mode0010 0011以 4lx 分辨率开始测量;测量时间约 16ms;测量结束后自动进入 Power Down Mode
Change Measurement time(High bit)01000 MT[7,6,5]调整测量时间,见如下描述
Change Measurement time(Low bit)011 MT[4,3,2,1,0]调整测量时间,见如下描述

调整测量时间:

即,调整传感器灵敏度,用于抵消光学窗口(optical window)带来的影响。
具体通过调整测量时间来实现。MTreg 的调整范围为: “0001 1111/31” ~ “1111 1110/254”,默认值 “0100 0101/69”

比如,光学窗口的透过率为 50%,测量结果则变为之前的一半。通过调整测量时间为 2 倍,可将测量结果弥补到光学窗口透过率为 100% 的值。举个例子,将默认测量值 “0100 0101” 调整为 2 倍 “1000 1010”:

240ms 后,测量数据将被存入 Data Register。


“指令写入及测量值”示例

假定,ADDR = L,slave 地址为 “0100 011”

例如读取到的 High Byte 为 “1000 0011” 和 Low Byte 为 “1001 0000”,则:
(215 + 29 + 28 + 27 + 24 )/ 1.2 = 28067(lx)


代码测试:

写操作:

static esp_err_t i2c_master_write_slave(i2c_port_t i2c_num, uint8_t *sub_reg)
{
	int ret;
	
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (SENSOR_ADDR | WRITE_BIT), ACK_CHECK_EN);
	i2c_master_write_byte(cmd, sub_reg, ACK_CHECK_EN);
    i2c_master_stop(cmd);
    ret = i2c_master_cmd_begin(i2c_num, cmd, 1000 / portTICK_RATE_MS);
    i2c_cmd_link_delete(cmd);
	
    return ret;
}

读操作(数据包含两个字节):

static esp_err_t i2c_master_read_slave(i2c_port_t i2c_num, uint8_t *data_rd_h, uint8_t *data_rd_l)
{
    int ret;
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, SENSOR_ADDR  | READ_BIT, ACK_CHECK_EN);
    i2c_master_read_byte(cmd, data_rd_h, ACK_VAL);
    i2c_master_read_byte(cmd, data_rd_l, NACK_VAL);
    i2c_master_stop(cmd);
    ret = i2c_master_cmd_begin(i2c_num, cmd, 1000 / portTICK_RATE_MS);
    i2c_cmd_link_delete(cmd);
    return ret;
}

配置 BH1750 为 Continuously H-Resolution Mode :

i2c_master_write_slave( I2C_EXAMPLE_MASTER_NUM, BH_POWER_ON);
i2c_master_write_slave( I2C_EXAMPLE_MASTER_NUM, BH_CTN_HIGH_RESOLUTION_MODE);

获取光强数据并计算为 lx:

ret = i2c_master_read_slave(I2C_EXAMPLE_MASTER_NUM, &bh1750_dat[1], &bh1750_dat[0]); 
raw_data = ((bh1750_dat[1] << 8 | bh1750_dat[0]) / BH_1750_MEASUREMENT_ACCURACY);

用手遮挡或手电筒照射,测试结果如下:

默认:BH1750 raw data is: 472.500000
...
手遮挡:BH1750 raw data is: 2.500000
...
手电筒照射:BH1750 raw data is: 13231.666992



设计时需要注意的其他事项:

  1. 器件背部的 exposed central pad 不做电气属性连接,更不要焊接;
  2. 避免在强磁场中使用,否则可能出现故障;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值