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
管腳定義:
管腳編號 | 管腳名稱 | 描述 |
---|---|---|
1 | VCC | 電源腳 |
2 | ADDR | ADDR = H(>= 0.7xVCC),slave 地址爲 “1011 100”; ADDR = L(=< 0.3xVCC),slave 地址爲 “0100 011”。電路結構爲 3 state buffer |
3 | GND | 地 |
4 | SDA | I2C 串行數據接口 |
5 | DVI | I2C 總線的參考電平;內部寄存器異步復位:DVI <= 0.4V, at least 1us。BH1750FVI is pulled down by 150K while DVI=L |
6 | SCL | I2C 串行時鐘接口 |
上電及復位操作:
- 異步復位: 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 Down | 0000 0000 | 掉電模式 |
Power On | 0000 0001 | 上電:等待測量命令 |
Reset | 0000 0111 | 復位數據寄存器。掉電模式下,Reset 命令無效 |
Continuously H-Resolution Mode(推薦) | 0001 0000 | 以 1lx 分辨率開始測量;測量時間約 120ms |
Continuously H-Resolution Mode 2 | 0001 0001 | 以 0.5lx 分辨率開始測量;測量時間約 120ms |
Continuously L-Resolution Mode | 0001 0011 | 以 4lx 分辨率開始測量;測量時間約 16ms |
One Time H-Resolution Mode(推薦) | 0010 0000 | 以 1lx 分辨率開始測量;測量時間約 120ms;測量結束後自動進入 Power Down Mode |
One Time H-Resolution Mode 2 | 0010 0001 | 以 0.5lx 分辨率開始測量;測量時間約 120ms;測量結束後自動進入 Power Down Mode |
One Time L-Resolution Mode | 0010 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
設計時需要注意的其他事項:
- 器件背部的 exposed central pad 不做電氣屬性連接,更不要焊接;
- 避免在強磁場中使用,否則可能出現故障;