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