在上一篇中,我們介紹了IIC驅動OLED顯示屏。這一篇是IIC驅動BH1750FVI光強度傳感器。其實在之前的樹莓派系列中也寫過BH1750FVI光強度傳感器的文章。
這里是一個IIC總線上面掛載了兩個IIC從設備。
產品介紹
BH1750FVI 是一種用于兩線式串行總線接口的數字型光強度傳感器集成電路。這種集成電路可以根據收集的光線強度數據來調整液晶或者鍵盤背景燈的亮度。利用它的高分辨率可以探測較大范圍的光強度變化。(1lx-65535lx)
產品特點
- 支持 I2C BUS 接口(f/s Mode Support)。
- 接近視覺靈敏度的光譜靈敏度特性(峰值靈敏度波長典型值:560nm)。
- 輸出對應亮度的數字值。
- 對應廣泛的輸入光范圍(相當于 1-65535lx)。
- 通過降低功率功能,實現低電流化。
- 通過 50Hz/60Hz 除光噪音功能實現穩(wěn)定的測定7. 支持 1.8V 邏輯輸入接口。
- 無需其他外部件。
- 光源依賴性弱(白熾燈,熒光燈,鹵素燈,白光 LED,日光燈)。
- 有兩種可選的 I2C slave 地址。
- 可調的測量結果影響較大的因素為光入口大小。
- 使用這種功能能計算 1.1 lx 到 100000 lx 馬克斯/分鐘的范圍。
- 最小誤差變動在±20%。
- 受紅外線影響很小。
產品應用
移動電話,液晶電視,筆記本電腦,便攜式游戲機,數碼相機,數碼攝像機,汽車定位系統,液晶顯示器。
芯片框圖
描述:
?PD 接近人眼反應的光敏二極管。(Photo diode with approximately human eye response.)
?AMP 集成運算放大器:將 PD 電流轉換為 PD 電壓。
?ADC 模數轉換獲取 16 位數字數據。
?Logic + IC Interface(邏輯+ IC 界面)光強度計算和 I2C 總線接口,包括下列寄存器:數據寄存器→光強度數據寄存。初始值是:“0000_0000_0000_0000”。測量時間寄存器→時間測量數據寄存。初始值是:“0100_0101”。
?OSC 內部振蕩器(時鐘頻率典型值:320kHz)。該時鐘為內部邏輯時鐘。
從這個框圖也可以看出這個芯片的內部模塊比較簡單,實際使用也不復雜。
測量程序步驟
指令集合結構
從“寫指示”到“讀出測量結果”的測量時序實例
#define IIC_SCL P10 // 時鐘
#define IIC_SDA P11 // 數據
這個是IIC和單片機IO口的連接。
驅動代碼
#include "bh1750fvi.h"
#include "iic.h"
#define BH1750FVI_SlaveAddress 0x46 // 設備地址
#define BH1750FVI_DOWN 0x00 // 斷電指令
#define BH1750FVI_ON 0x01 // 通電指令
#define BH1750FVI_RESEET 0x07 // 復位
#define BH1750FVI_CON_H 0x10 // 連續(xù)分辨率模式, 1lx, 120ms
#define BH1750FVI_CON_H2 0x11 // 連續(xù)分辨率模式, 0.5lx, 120ms
#define BH1750FVI_CON_L 0x13 // 連續(xù)低分辨率模式,4lx, 16ms
#define BH1750FVI_ONE_H 0x20 // 一次高分辨率模式,1lx, 120ms
#define BH1750FVI_ONE_H2 0x21 // 一次高分辨率模式,0.5lx, 120ms
#define BH1750FVI_ONE_L 0x23 // 一次低分辨率模式,4lx, 16ms
// 往BH1750FVI寫數據
void BH1750FVI_Write_Reg(u8 reg)
{
IIC_Start();
IIC_Write_Byte(BH1750FVI_SlaveAddress);
IIC_Write_Byte(reg);
IIC_Stop();
}
// 讀取1字節(jié)數據
u8 BH1750FVI_Read_Reg(u8 reg)
{
u8 dat;
IIC_Start();
IIC_Write_Byte(BH1750FVI_SlaveAddress);
IIC_Write_Byte(reg);
IIC_Start();
IIC_Write_Byte(BH1750FVI_SlaveAddress + 1);
dat = IIC_Read_Byte();
IIC_Stop();
return dat;
}
u16 BH1750FVI_Read_all()
{
u8 i;
u8 BUF[8];
u16 dat;
IIC_Start();
IIC_Write_Byte(BH1750FVI_SlaveAddress + 1);
for(i = 0; i < 2; i++)
{
BUF[i] = IIC_Read_Byte();
if(i == 2){
IIC_Send_Ack(1);
}else{
IIC_Send_Ack(0);
}
}
IIC_Stop();
dat = BUF[0]< 8 + BUF[1];
return dat;
}
u16 BH1750FVI_Measure()
{
BH1750FVI_Write_Reg(BH1750FVI_ON);
BH1750FVI_Write_Reg(BH1750FVI_CON_H);
return BH1750FVI_Read_all();
}
void BH1750FVI_Init()
{
BH1750FVI_Write_Reg(BH1750FVI_DOWN);
BH1750FVI_Write_Reg(BH1750FVI_ON);
}