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 不做電氣屬性連接配接,更不要焊接;
- 避免在強磁場中使用,否則可能出現故障;