?
一、環(huán)境介紹
光敏傳感器:BH1750數(shù)字傳感器(IIC接口)
開(kāi)發(fā)軟件:Keil5
代碼說(shuō)明:使用IIC模擬時(shí)序驅(qū)動(dòng),方便移植到其他平臺(tái),采集的光照度比較靈敏. 合成的光照度返回值范圍是 0~255。 0表示全黑 255表示很亮。
實(shí)測(cè): 手機(jī)閃光燈照著的狀態(tài)返回值是245左右,手捂著的狀態(tài)返回值是10左右.


?


?
二、BH1750介紹


?


?


?
三、核心代碼
BH1750說(shuō)明: ADDR引腳接地,地址就是0x46
完整工程代碼下載:https://download.csdn.net/download/xiaolong1126626497/18500653
3.1 iic.c
#include "iic.h"
/*
函數(shù)功能:IIC接口初始化
硬件連接:
SDA:PB7
SCL:PB6
*/
void IIC_Init(void)
{
RCC->APB2ENR|=1<<3;//PB
GPIOB->CRL&=0x00FFFFFF;
GPIOB->CRL|=0x33000000;
GPIOB->ODR|=0x3<<6;
}
/*
函數(shù)功能:IIC總線(xiàn)起始信號(hào)
*/
void IIC_Start(void)
{
IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
IIC_SDA_OUT=1; //數(shù)據(jù)線(xiàn)拉高
IIC_SCL=1; //時(shí)鐘線(xiàn)拉高
DelayUs(4); //電平保持時(shí)間
IIC_SDA_OUT=0; //數(shù)據(jù)線(xiàn)拉低
DelayUs(4); //電平保持時(shí)間
IIC_SCL=0; //時(shí)鐘線(xiàn)拉低
}
/*
函數(shù)功能:IIC總線(xiàn)停止信號(hào)
*/
void IIC_Stop(void)
{
IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
IIC_SDA_OUT=0; //數(shù)據(jù)線(xiàn)拉低
IIC_SCL=0; //時(shí)鐘線(xiàn)拉低
DelayUs(4); //電平保持時(shí)間
IIC_SCL=1; //時(shí)鐘線(xiàn)拉高
DelayUs(4); //電平保持時(shí)間
IIC_SDA_OUT=1; //數(shù)據(jù)線(xiàn)拉高
}
/*
函數(shù)功能:獲取應(yīng)答信號(hào)
返 回 值:1表示失敗,0表示成功
*/
u8 IIC_GetACK(void)
{
u8 cnt=0;
IIC_SDA_INPUTMODE();//初始化SDA為輸入模式
IIC_SDA_OUT=1; //數(shù)據(jù)線(xiàn)上拉
DelayUs(2); //電平保持時(shí)間
IIC_SCL=0; //時(shí)鐘線(xiàn)拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
DelayUs(2); //電平保持時(shí)間,等待從機(jī)發(fā)送數(shù)據(jù)
IIC_SCL=1; //時(shí)鐘線(xiàn)拉高,告訴從機(jī),主機(jī)現(xiàn)在開(kāi)始讀取數(shù)據(jù)
while(IIC_SDA_IN) //等待從機(jī)應(yīng)答信號(hào)
{
cnt++;
if(cnt>250)return 1;
}
IIC_SCL=0; //時(shí)鐘線(xiàn)拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
return 0;
}
/*
函數(shù)功能:主機(jī)向從機(jī)發(fā)送應(yīng)答信號(hào)
函數(shù)形參:0表示應(yīng)答,1表示非應(yīng)答
*/
void IIC_SendACK(u8 stat)
{
IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
IIC_SCL=0; //時(shí)鐘線(xiàn)拉低,告訴從機(jī),主機(jī)需要發(fā)送數(shù)據(jù)
if(stat)IIC_SDA_OUT=1; //數(shù)據(jù)線(xiàn)拉高,發(fā)送非應(yīng)答信號(hào)
else IIC_SDA_OUT=0; //數(shù)據(jù)線(xiàn)拉低,發(fā)送應(yīng)答信號(hào)
DelayUs(2); //電平保持時(shí)間,等待時(shí)鐘線(xiàn)穩(wěn)定
IIC_SCL=1; //時(shí)鐘線(xiàn)拉高,告訴從機(jī),主機(jī)數(shù)據(jù)發(fā)送完畢
DelayUs(2); //電平保持時(shí)間,等待從機(jī)接收數(shù)據(jù)
IIC_SCL=0; //時(shí)鐘線(xiàn)拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
}
/*
函數(shù)功能:IIC發(fā)送1個(gè)字節(jié)數(shù)據(jù)
函數(shù)形參:將要發(fā)送的數(shù)據(jù)
*/
void IIC_WriteOneByteData(u8 data)
{
u8 i;
IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
IIC_SCL=0; //時(shí)鐘線(xiàn)拉低,告訴從機(jī),主機(jī)需要發(fā)送數(shù)據(jù)
for(i=0;i<8;i++)
{
if(data&0x80)IIC_SDA_OUT=1; //數(shù)據(jù)線(xiàn)拉高,發(fā)送1
else IIC_SDA_OUT=0; //數(shù)據(jù)線(xiàn)拉低,發(fā)送0
IIC_SCL=1; //時(shí)鐘線(xiàn)拉高,告訴從機(jī),主機(jī)數(shù)據(jù)發(fā)送完畢
DelayUs(2); //電平保持時(shí)間,等待從機(jī)接收數(shù)據(jù)
IIC_SCL=0; //時(shí)鐘線(xiàn)拉低,告訴從機(jī),主機(jī)需要發(fā)送數(shù)據(jù)
DelayUs(2); //電平保持時(shí)間,等待時(shí)鐘線(xiàn)穩(wěn)定
data<<=1; //先發(fā)高位
}
}
/*
函數(shù)功能:IIC接收1個(gè)字節(jié)數(shù)據(jù)
返 回 值:收到的數(shù)據(jù)
*/
u8 IIC_ReadOneByteData(void)
{
u8 i,data;
IIC_SDA_INPUTMODE();//初始化SDA為輸入模式
for(i=0;i<8;i++)
{
IIC_SCL=0; //時(shí)鐘線(xiàn)拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
DelayUs(2); //電平保持時(shí)間,等待從機(jī)發(fā)送數(shù)據(jù)
IIC_SCL=1; //時(shí)鐘線(xiàn)拉高,告訴從機(jī),主機(jī)現(xiàn)在正在讀取數(shù)據(jù)
data<<=1;
if(IIC_SDA_IN)data|=0x01;
DelayUs(2); //電平保持時(shí)間,等待時(shí)鐘線(xiàn)穩(wěn)定
}
IIC_SCL=0; //時(shí)鐘線(xiàn)拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù) (必須拉低,否則將會(huì)識(shí)別為停止信號(hào))
return data;
}

3.2 iic.h
#ifndef _IIC_H
#define _IIC_H
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#define IIC_SDA_OUTMODE() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=0x30000000;}
#define IIC_SDA_INPUTMODE() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=0x80000000;}
#define IIC_SDA_OUT PBout(7) //數(shù)據(jù)線(xiàn)輸出
#define IIC_SDA_IN PBin(7) //數(shù)據(jù)線(xiàn)輸入
#define IIC_SCL PBout(6) //時(shí)鐘線(xiàn)
void IIC_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
u8 IIC_GetACK(void);
void IIC_SendACK(u8 stat);
void IIC_WriteOneByteData(u8 data);
u8 IIC_ReadOneByteData(void);
#endif

3.3 BH1750.h
#ifndef _BH1750_H
#define _BH1750_H
#include "delay.h"
#include "iic.h"
#include "usart.h"
u8 Read_BH1750_Data(void);
#endif

3.4 BH1750.c
#include "bh1750.h"
u8 Read_BH1750_Data()
{
unsigned char t0;
unsigned char t1;
unsigned char t;
u8 r_s=0;
IIC_Start(); //發(fā)送起始信號(hào)
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:1\r\n");
IIC_WriteOneByteData(0x01);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:2\r\n");
IIC_Stop(); //停止信號(hào)
IIC_Start(); //發(fā)送起始信號(hào)
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:3\r\n");
IIC_WriteOneByteData(0x01);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:4\r\n");
IIC_Stop(); //停止信號(hào)
IIC_Start(); //發(fā)送起始信號(hào)
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:5\r\n");
IIC_WriteOneByteData(0x10);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:6\r\n");
IIC_Stop(); //停止信號(hào)
DelayMs(300); //等待
IIC_Start(); //發(fā)送起始信號(hào)
IIC_WriteOneByteData(0x47);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:7\r\n");
t0=IIC_ReadOneByteData(); //接收數(shù)據(jù)
IIC_SendACK(0); //發(fā)送應(yīng)答信號(hào)
t1=IIC_ReadOneByteData(); //接收數(shù)據(jù)
IIC_SendACK(1); //發(fā)送非應(yīng)答信號(hào)
IIC_Stop(); //停止信號(hào)
t=(((t0<<8)|t1)/1.2);
return t;
}

3.5 main.c
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "at24c02.h"
#include "bh1750.h"
int main()
{
u8 val;
LED_Init();
BEEP_Init();
KeyInit();
USARTx_Init(USART1,72,115200);
IIC_Init();
while(1)
{
val=KeyScan();
if(val)
{
val=Read_BH1750_Data();
printf("光照強(qiáng)度=%d\r\n",val);
// BEEP=!BEEP;
LED0=!LED0;
LED1=!LED1;
}
}
}

3.6 運(yùn)行效果圖


-
傳感器
+關(guān)注
關(guān)注
2573文章
53900瀏覽量
780922 -
STM32
+關(guān)注
關(guān)注
2301文章
11081瀏覽量
369759
發(fā)布評(píng)論請(qǐng)先 登錄
【RA-Eco-RA6M4開(kāi)發(fā)板評(píng)測(cè)】用I2C實(shí)現(xiàn)光照強(qiáng)度的檢測(cè)和顯示
數(shù)字16位串行輸出型環(huán)境光傳感器IC BH1750FVI數(shù)據(jù)手冊(cè)
【沁恒CH585開(kāi)發(fā)板免費(fèi)試用體驗(yàn)】+光照傳感器及其檢測(cè)
DLP NIRScan Nano光照強(qiáng)度如何計(jì)算?
壁掛光照傳感器技術(shù)規(guī)格與安裝指南

光照傳感器的工作原理與應(yīng)用場(chǎng)景
基于物聯(lián)網(wǎng)技術(shù)設(shè)計(jì)的陳列館監(jiān)控系統(tǒng)

光敏電阻與其他傳感器的聯(lián)合應(yīng)用
光敏電阻在環(huán)境監(jiān)測(cè)中的應(yīng)用
光敏電阻和電壓傳感器的區(qū)別
光敏電阻與光電傳感器的區(qū)別
如何選擇合適的光敏電阻
【CW32模塊使用】BH1750光照強(qiáng)度傳感器

【RA-Eco-RA4E2-64PIN-V1.0開(kāi)發(fā)板試用】04、I2C驅(qū)動(dòng)BH1750光照傳感器并在串口打印輸出
外設(shè)移植 Ai-WB2+BH1750 光照強(qiáng)度傳感器

評(píng)論