?
一、環境介紹
光敏傳感器:BH1750數字傳感器(IIC接口)
開發軟件:Keil5
代碼說明:使用IIC模擬時序驅動,方便移植到其他平臺,采集的光照度比較靈敏. 合成的光照度返回值范圍是 0~255。 0表示全黑 255表示很亮。
實測: 手機閃光燈照著的狀態返回值是245左右,手捂著的狀態返回值是10左右.


?


?
二、BH1750介紹


?


?


?
三、核心代碼
BH1750說明: ADDR引腳接地,地址就是0x46
完整工程代碼下載:https://download.csdn.net/download/xiaolong1126626497/18500653
3.1 iic.c
#include "iic.h"
/*
函數功能:IIC接口初始化
硬件連接:
SDA:PB7
SCL:PB6
*/
void IIC_Init(void)
{
RCC->APB2ENR|=1<<3;//PB
GPIOB->CRL&=0x00FFFFFF;
GPIOB->CRL|=0x33000000;
GPIOB->ODR|=0x3<<6;
}
/*
函數功能:IIC總線起始信號
*/
void IIC_Start(void)
{
IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
IIC_SDA_OUT=1; //數據線拉高
IIC_SCL=1; //時鐘線拉高
DelayUs(4); //電平保持時間
IIC_SDA_OUT=0; //數據線拉低
DelayUs(4); //電平保持時間
IIC_SCL=0; //時鐘線拉低
}
/*
函數功能:IIC總線停止信號
*/
void IIC_Stop(void)
{
IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
IIC_SDA_OUT=0; //數據線拉低
IIC_SCL=0; //時鐘線拉低
DelayUs(4); //電平保持時間
IIC_SCL=1; //時鐘線拉高
DelayUs(4); //電平保持時間
IIC_SDA_OUT=1; //數據線拉高
}
/*
函數功能:獲取應答信號
返 回 值:1表示失敗,0表示成功
*/
u8 IIC_GetACK(void)
{
u8 cnt=0;
IIC_SDA_INPUTMODE();//初始化SDA為輸入模式
IIC_SDA_OUT=1; //數據線上拉
DelayUs(2); //電平保持時間
IIC_SCL=0; //時鐘線拉低,告訴從機,主機需要數據
DelayUs(2); //電平保持時間,等待從機發送數據
IIC_SCL=1; //時鐘線拉高,告訴從機,主機現在開始讀取數據
while(IIC_SDA_IN) //等待從機應答信號
{
cnt++;
if(cnt>250)return 1;
}
IIC_SCL=0; //時鐘線拉低,告訴從機,主機需要數據
return 0;
}
/*
函數功能:主機向從機發送應答信號
函數形參:0表示應答,1表示非應答
*/
void IIC_SendACK(u8 stat)
{
IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
IIC_SCL=0; //時鐘線拉低,告訴從機,主機需要發送數據
if(stat)IIC_SDA_OUT=1; //數據線拉高,發送非應答信號
else IIC_SDA_OUT=0; //數據線拉低,發送應答信號
DelayUs(2); //電平保持時間,等待時鐘線穩定
IIC_SCL=1; //時鐘線拉高,告訴從機,主機數據發送完畢
DelayUs(2); //電平保持時間,等待從機接收數據
IIC_SCL=0; //時鐘線拉低,告訴從機,主機需要數據
}
/*
函數功能:IIC發送1個字節數據
函數形參:將要發送的數據
*/
void IIC_WriteOneByteData(u8 data)
{
u8 i;
IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
IIC_SCL=0; //時鐘線拉低,告訴從機,主機需要發送數據
for(i=0;i<8;i++)
{
if(data&0x80)IIC_SDA_OUT=1; //數據線拉高,發送1
else IIC_SDA_OUT=0; //數據線拉低,發送0
IIC_SCL=1; //時鐘線拉高,告訴從機,主機數據發送完畢
DelayUs(2); //電平保持時間,等待從機接收數據
IIC_SCL=0; //時鐘線拉低,告訴從機,主機需要發送數據
DelayUs(2); //電平保持時間,等待時鐘線穩定
data<<=1; //先發高位
}
}
/*
函數功能:IIC接收1個字節數據
返 回 值:收到的數據
*/
u8 IIC_ReadOneByteData(void)
{
u8 i,data;
IIC_SDA_INPUTMODE();//初始化SDA為輸入模式
for(i=0;i<8;i++)
{
IIC_SCL=0; //時鐘線拉低,告訴從機,主機需要數據
DelayUs(2); //電平保持時間,等待從機發送數據
IIC_SCL=1; //時鐘線拉高,告訴從機,主機現在正在讀取數據
data<<=1;
if(IIC_SDA_IN)data|=0x01;
DelayUs(2); //電平保持時間,等待時鐘線穩定
}
IIC_SCL=0; //時鐘線拉低,告訴從機,主機需要數據 (必須拉低,否則將會識別為停止信號)
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) //數據線輸出
#define IIC_SDA_IN PBin(7) //數據線輸入
#define IIC_SCL PBout(6) //時鐘線
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(); //發送起始信號
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//獲取應答
if(r_s)printf("error:1\r\n");
IIC_WriteOneByteData(0x01);
r_s=IIC_GetACK();//獲取應答
if(r_s)printf("error:2\r\n");
IIC_Stop(); //停止信號
IIC_Start(); //發送起始信號
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//獲取應答
if(r_s)printf("error:3\r\n");
IIC_WriteOneByteData(0x01);
r_s=IIC_GetACK();//獲取應答
if(r_s)printf("error:4\r\n");
IIC_Stop(); //停止信號
IIC_Start(); //發送起始信號
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//獲取應答
if(r_s)printf("error:5\r\n");
IIC_WriteOneByteData(0x10);
r_s=IIC_GetACK();//獲取應答
if(r_s)printf("error:6\r\n");
IIC_Stop(); //停止信號
DelayMs(300); //等待
IIC_Start(); //發送起始信號
IIC_WriteOneByteData(0x47);
r_s=IIC_GetACK();//獲取應答
if(r_s)printf("error:7\r\n");
t0=IIC_ReadOneByteData(); //接收數據
IIC_SendACK(0); //發送應答信號
t1=IIC_ReadOneByteData(); //接收數據
IIC_SendACK(1); //發送非應答信號
IIC_Stop(); //停止信號
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("光照強度=%d\r\n",val);
// BEEP=!BEEP;
LED0=!LED0;
LED1=!LED1;
}
}
}

3.6 運行效果圖

審核編輯:符乾江
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
傳感器
+關注
關注
2576文章
55041瀏覽量
791359 -
STM32
+關注
關注
2309文章
11162瀏覽量
373471
發布評論請先 登錄
相關推薦
熱點推薦
OPT4003-Q1:高性能數字環境光傳感器的深度解析
OPT4003-Q1:高性能數字環境光傳感器的深度解析 在電子設備的設計中,環境光傳感器扮演著至關重要的角色,它能感知周圍環境的光照強度,為設備提供智能化的光照調節功能。今天我們要深入
一文看懂常用傳感器:溫度、光照、氣體全覆蓋
在嵌入式開發中,傳感器是獲取外部世界信息的關鍵模塊。無論是智能家居、無人機還是工業控制,理解傳感器的類型、原理、接口和應用場景,都能讓你的系統設計更加高效。今天,我們就來做一張清晰的速查表,讓你快速
海綿拉伸撕裂強度試驗機中傳感器的電子信號處理技術
在海綿拉伸撕裂強度試驗機中,傳感器電子信號處理技術至關重要。 在海綿拉伸撕裂強度試驗機的檢測系統中,傳感器是捕捉力學信號的“前端感知器”,電
超強感光,即時檢測!高精度光照傳感器賦能納祥科技迷你照度計方案
覆蓋,采樣率達2次/秒,無需復雜調試即可瞬時檢測,很好地平衡性能與能耗。方案概述本方案通過高精度光電傳感器捕捉環境光照強度,經單片機實時校準處理,驅動LED屏直觀
【RA-Eco-RA6M4開發板評測】用I2C實現光照強度的檢測和顯示
這個項目我們利用瑞薩的RA6M4的I2C控制功能實現光照傳感器BH1750的光照測試,并進行屏幕顯示。
為了方便進行光照強度的檢測,所有的引
發表于 08-26 22:05
領麥微紅外測溫傳感器:重塑3D光敏打印的溫控革命
需求。領麥微紅外測溫傳感器憑借其快速響應、高精度、非接觸式測溫及算法定制能力,正成為新一代光敏3D打印機的“溫控中樞”,推動行業向智能化、高效化方向邁進。一、毫秒
凱米斯溫濕度照度一體傳感器:環境監測的智能哨兵
在氣象觀測、農業種植、工業自動化及環境監控領域,精準的環境參數采集是保障安全與效率的關鍵。凱米斯科技推出的溫濕度照度一體傳感器,以全數字化檢測技術為核心,集成了溫度、濕度和光照強度的高精度測量功能
二氧化碳溫濕度光照度傳感器:四合一,在線監測氣體
二氧化碳溫濕度光照度傳感器是一種多功能環境監測設備,集成了測量二氧化碳濃度(CO?)、空氣溫度及光照強度(照度)四種關鍵環境參數的功能于一體。通過內置的多類型傳感器元件,實現對環境條件
【沁恒CH585開發板免費試用體驗】+光照傳感器及其檢測
光照傳感器在對環境的光線情況的檢測中起著重要的作用,這里所采用的是數字式光照傳感器BH1750,它具有集成度高和檢測精度高的特點。
該
發表于 07-06 00:08
器件篇-霍爾傳感器基礎知識
霍爾傳感器主要分為線型霍爾傳感器和開關型霍爾傳感器。我們先來講解一下開關型霍爾傳感器。 1 初識霍爾開關霍爾開關是將磁感應強度轉換為電路可識
發表于 04-17 11:28
傳感器應用設計141例(完整版)
介紹了光敏、紅外、熱敏電阻器、鉑電阻、熱電偶、濕度、氣體、磁敏、超聲波、振動與加速度、電流、壓力、應變、風速、位置等傳感器的應用技巧,具有很強的實用性。
純分享貼,有需要可以直接下載附件獲
發表于 03-27 14:04
智能光照度傳感器:精準測量,優化光照環境
在當今科技日新月異的時代,智能設備已經滲透到我們生活的方方面面,從智能家居到工業自動化,再到現代農業,它們都在發揮著不可或缺的作用。而在這一系列的智能設備中,智能光照度傳感器以其獨特的功能和廣泛
STM32+BH1750光敏傳感器獲取光照強度
評論