国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32外設(shè)系列—BH1750

這篇具有很好參考價值的文章主要介紹了STM32外設(shè)系列—BH1750。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


?? 文章作者:二土電子

?? 關(guān)注文末公眾號獲取其他資料和工程文件!

?? 期待大家一起學習交流!


一、BH1750簡介

BH1750是一款數(shù)字型光照強度傳感器,能夠獲取周圍環(huán)境的光照強度。其測量范圍在0~65535 lx。lx勒克斯,是光照強度的單位。BH1750可用于調(diào)節(jié)手機屏幕和鍵盤的背光功率,或者用于智能燈光控制,比如,隨著外界光照強度的變化調(diào)節(jié)燈光亮度。

bh1750,STM32開發(fā)筆記—外設(shè)系列,stm32,單片機,嵌入式硬件

BH1750有以下特點

  • I2C總線接口
  • 接近視覺靈敏度的光譜靈敏度特性
  • 輸出對應亮度的數(shù)字值
  • 高分辨率(0~65535 lx)
  • 通過降低功率功能,實現(xiàn)低電流化
  • 50Hz / 60Hz光噪聲抑制功能
  • 可以選擇兩種類型的I2C從屬地址
  • 最小誤差變動在±20%
  • 受紅外線影響很小

二、BH1750原理圖

bh1750,STM32開發(fā)筆記—外設(shè)系列,stm32,單片機,嵌入式硬件

  • PD —— 接近人眼反應的光敏二極管
  • AMP —— 集成運算放大器(將 PD 電流轉(zhuǎn)換為 PD 電壓)
  • ADC —— 模數(shù)轉(zhuǎn)換獲取 16 位數(shù)字數(shù)據(jù)
  • Logic + IC Interface(邏輯+ IC 界面)
  • OSC —— 內(nèi)部振蕩器(該時鐘為內(nèi)部邏輯時鐘,時鐘頻率典型值:320kHz)

PD二極管通過光伏效應將輸入光信號轉(zhuǎn)換成電信號,經(jīng)運放電路放大后,電壓經(jīng)ADC采集,再經(jīng)邏輯電路轉(zhuǎn)換成16位二進制數(shù),存儲在內(nèi)部的寄存器中(進入光窗的光越強,光電流越大,電壓就越大,所以光強可以通過電壓的大小判斷,但是應該注意的是,雖然電壓和光強一一對應,但它們不是成正比關(guān)系,所以該芯片內(nèi)部是對數(shù)據(jù)進行了線性處理,這就是為什么直接使用集成IC而不是光電二極管的原因)。BH1750引出了時鐘線和數(shù)據(jù)線,單片機可以通過I2C協(xié)議與BH1750進行通訊,可選擇BH1750的工作模式,提取BH1750寄存器中的照度數(shù)據(jù)。

三、BH1750數(shù)據(jù)手冊

3.1 指令集

BH1750的數(shù)據(jù)手冊中給出了一些指令

bh1750,STM32開發(fā)筆記—外設(shè)系列,stm32,單片機,嵌入式硬件

其中的H分辨率模式和L分辨率模式等,是BH1750的測量模式,數(shù)據(jù)手冊中也給出了說明

bh1750,STM32開發(fā)筆記—外設(shè)系列,stm32,單片機,嵌入式硬件

我們通常使用H分辨率模式,H 分辨率模式下足夠長的測量時間(積分時間)能夠抑制一些噪聲(包括 50Hz/60Hz)。同時,H 分辨率模式的分辨率在 1lx 下,適用于黑暗場合下(少于 10 lx)。

3.2 IIC通信讀/寫

上面介紹,BH1750有兩種從屬地址,由 ADDR 端口的電平?jīng)Q定。

  • ADDR=“H”( ADDR ≧ 0.7VCC ) →“1011100”
  • ADDR=“L”( ADDR ≦ 0.3VCC ) →“0100011”

關(guān)于IIC通信的詳細內(nèi)容,這里就不再介紹了,可以去本系列的OLED篇查看。BH1750數(shù)據(jù)手冊中給出了一種配置連續(xù)高分辨率模式的方法

bh1750,STM32開發(fā)筆記—外設(shè)系列,stm32,單片機,嵌入式硬件

BH1750數(shù)據(jù)讀取格式如下

bh1750,STM32開發(fā)筆記—外設(shè)系列,stm32,單片機,嵌入式硬件

光照強度(單位lx)=(High Byte + Low Byte)/ 1.2 * 測量精度

四、BH1750程序設(shè)計

4.1 IIC程序

相比于之前的OLED的IIC程序,增加了主設(shè)備發(fā)送應答信號(Ack),非應答信號(NAck),讀取一個字節(jié)數(shù)據(jù)程序。修改了等待應答信號程序,增加了返回值。

/*
 *==============================================================================
 *函數(shù)名稱:IIC_Delay
 *函數(shù)功能:IIC延時
 *輸入?yún)?shù):無
 *返回值:無
 *備  注:數(shù)據(jù)手冊提供
 *==============================================================================
 */
void IIC_Delay (void)
{
	u8 t = 10;
	while (t--);
}
/*
 *==============================================================================
 *函數(shù)名稱:I2C_Start
 *函數(shù)功能:IIC起始信號
 *輸入?yún)?shù):無
 *返回值:無
 *備  注:數(shù)據(jù)手冊提供
 *==============================================================================
 */
void I2C_Start (void)
{
	BH1750_SDA_Set();
	BH1750_SCL_Set();
	IIC_Delay();
	BH1750_SDA_Clr();
	IIC_Delay();
	BH1750_SCL_Clr();
	IIC_Delay();
}
/*
 *==============================================================================
 *函數(shù)名稱:I2C_Stop
 *函數(shù)功能:IIC終止信號
 *輸入?yún)?shù):無
 *返回值:無
 *備  注:數(shù)據(jù)手冊提供
 *==============================================================================
 */
void I2C_Stop (void)
{
	BH1750_SDA_Clr();
	BH1750_SCL_Set();
	IIC_Delay();
	BH1750_SDA_Set();
}
/*
 *==============================================================================
 *函數(shù)名稱:IIC_Ack
 *函數(shù)功能:CPU產(chǎn)生一個ACK信號
 *輸入?yún)?shù):無
 *返回值:無
 *備  注:無
 *==============================================================================
 */
void IIC_Ack (void)
{
	BH1750_SDA_Clr();
	IIC_Delay();
	BH1750_SCL_Set();
	IIC_Delay();
	BH1750_SCL_Clr();
	IIC_Delay();
	BH1750_SDA_Set();
}
/*
 *==============================================================================
 *函數(shù)名稱:IIC_NAck
 *函數(shù)功能:CPU產(chǎn)生一個NACK信號
 *輸入?yún)?shù):無
 *返回值:無
 *備  注:無
 *==============================================================================
 */
void IIC_NAck (void)
{
	BH1750_SDA_Set();
	IIC_Delay();
	BH1750_SCL_Set();
	IIC_Delay();
	BH1750_SCL_Clr();
	IIC_Delay();	
}
/*
 *==============================================================================
 *函數(shù)名稱:I2C_WaitAck
 *函數(shù)功能:IIC等待應答
 *輸入?yún)?shù):無
 *返回值:0:未收到應答信號;1:收到應答信號
 *備  注:無
 *==============================================================================
 */
u8 I2C_WaitAck (void)
{
	u8 re;

	BH1750_SDA_Set();
	IIC_Delay();
	BH1750_SCL_Set();
	IIC_Delay();
	if (BH1750_SDA_DATA())
	{
		re = 1;
	}
	else
	{
		re = 0;
	}
	
	BH1750_SCL_Clr();
	IIC_Delay();
	
	return re;
}
/*
 *==============================================================================
 *函數(shù)名稱:Send_Byte
 *函數(shù)功能:寫入一個字節(jié)
 *輸入?yún)?shù):dat:需要寫入的數(shù)據(jù)
 *返回值:無
 *備  注:數(shù)據(jù)手冊提供
 *==============================================================================
 */
void Send_Byte (u8 dat)
{
	u8 i;

	for (i = 0;i < 8;i ++)
	{
		// 發(fā)送數(shù)據(jù)時,從高位依次寫入
		if (dat & 0x80)
		{
			BH1750_SDA_Set();
		}
		else
		{
			BH1750_SDA_Clr();
		}
		IIC_Delay();
		BH1750_SCL_Set();
		IIC_Delay();
		BH1750_SCL_Clr();
		
		// dat左移1位
		dat <<= 1;
	}
}
/*
 *==============================================================================
 *函數(shù)名稱:IIC_Read_Byte
 *函數(shù)功能:IIC讀取一個字節(jié)數(shù)據(jù)
 *輸入?yún)?shù):無
 *返回值:無
 *備  注:讀取到的一個字節(jié)數(shù)據(jù)
 *==============================================================================
 */
u8 IIC_Read_Byte (void)
{
	u8 i;
	u8 value;
	
	// 高位在前
	value = 0;
	
	// 循環(huán)讀取8bit數(shù)據(jù)
	for (i = 0; i < 8; i ++)
	{
		value <<= 1;   // 循環(huán)左移一位
		
		BH1750_SCL_Set();
		IIC_Delay();
		
		// 如果是“1”
		if (BH1750_SDA_DATA())
		{
			value ++;
		}
		
		BH1750_SCL_Clr();
		IIC_Delay();
	}
	
	return value;
}
//BH1750寫一個字節(jié)
//返回值	成功:0		失?。悍? 
/*
 *==============================================================================
 *函數(shù)名稱:BH1750_Byte_Write
 *函數(shù)功能:BH1750寫一個字節(jié)
 *輸入?yún)?shù):data:要寫入的數(shù)據(jù)
 *返回值:0:寫入成功;1/2:寫入失敗
 *備  注:無
 *==============================================================================
 */
u8 BH1750_Byte_Write (u8 data)
{
	I2C_Start();
	
	// 發(fā)送從設(shè)備地址,0:寫
	Send_Byte (BH1750_Addr | 0);
	
	// 收到應答信號
	if(I2C_WaitAck() == 1)
	{
		return 1;
	}
	//發(fā)送控制命令
	Send_Byte(data);
	
	// 收到應答信號
	if(I2C_WaitAck() == 1)
	{
		return 2;
	}
	
	I2C_Stop();
	
	return 0;
}

4.2 BH1750初始化程序

初始化包括兩部分,一部分是初始化IIC引腳,另一部分是初始化BH1750。也就是給BH1750上電,并復位。

/*
 *==============================================================================
 *函數(shù)名稱:Drv_Bh1750_Init
 *函數(shù)功能:初始化BH1750
 *輸入?yún)?shù):無
 *返回值:無
 *備  注:無
 *==============================================================================
 */
void Drv_Bh1750_Init (void)
{
	// 結(jié)構(gòu)體定義
 	GPIO_InitTypeDef  GPIO_InitStructure;
	
	// 開啟時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	// 初始化GPIO結(jié)構(gòu)體
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;	 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // 推挽式輸出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
	// 全部拉高,IIC處于空閑狀態(tài)
 	GPIO_SetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7);
	
	// BH1750上電
	BH1750_Byte_Write(POWER_ON);
	
	// 復位BH1750
	BH1750_Byte_Write(MODULE_RESET);
}

4.3 讀取BH1750測量結(jié)果

BH1750返回兩字節(jié)的測量結(jié)果數(shù)據(jù)

/*
 *==============================================================================
 *函數(shù)名稱:Drv_Bh1750_Read_Measure
 *函數(shù)功能:讀取BH1750測量數(shù)據(jù)
 *輸入?yún)?shù):無
 *返回值:0:讀取失敗;其他:光照強度
 *備  注:無
 *==============================================================================
 */
u16 Drv_Bh1750_Read_Measure (void)
{
	u16 receData = 0;
	
	I2C_Start();
	
	// 發(fā)送從設(shè)備地址,1:讀
	Send_Byte(BH1750_Addr | 1);
	
	if(I2C_WaitAck() == 1)
	{
		return 0;
	}
	
	// 讀取高八位
	receData = IIC_Read_Byte();
	IIC_Ack();
	
	// 讀取低八位
	receData = (receData << 8) + IIC_Read_Byte();
	IIC_NAck();
	I2C_Stop();
	
	return receData;   // 返回讀取到的數(shù)據(jù)
}

4.4 獲取光照強度

/*
 *==============================================================================
 *函數(shù)名稱:Med_Bh1750_GetLightIntensity
 *函數(shù)功能:獲取光照強度
 *輸入?yún)?shù):無
 *返回值:光照強度
 *備  注:分辨率	光照強度(單位lx)=(High Byte  + Low Byte)/ 1.2 * 測量精度
 *==============================================================================
 */
float Med_Bh1750_GetLightIntensity (void)
{
	return (float)(Drv_Bh1750_Read_Measure() / 1.1f * Resolurtion);   //返回測量光照強度
}

4.5 相關(guān)宏定義

// BH1750的地址(ADDR=“H”)
#define BH1750_Addr   0x46

// BH1750指令
#define POWER_OFF					0x00
#define POWER_ON					0x01
#define MODULE_RESET			0x07
#define	CONTINUE_H_MODE		0x10
#define CONTINUE_H_MODE2	0x11
#define CONTINUE_L_MODE		0x13
#define ONE_TIME_H_MODE		0x20
#define ONE_TIME_H_MODE2	0x21
#define ONE_TIME_L_MODE		0x23

//測量模式
#define Measure_Mode   CONTINUE_H_MODE

//分辨率	光照強度(單位lx)=(High Byte  + Low Byte)/ 1.2 * 測量精度
#if ((Measure_Mode == CONTINUE_H_MODE2)|(Measure_Mode == ONE_TIME_H_MODE2))
	#define Resolurtion		0.5
#elif ((Measure_Mode == CONTINUE_H_MODE)|(Measure_Mode == ONE_TIME_H_MODE))
	#define Resolurtion		1
#elif ((Measure_Mode == CONTINUE_L_MODE)|(Measure_Mode == ONE_TIME_L_MODE))
	#define Resolurtion		4
#endif

// SCL
#define BH1750_SCL_Clr()   GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define BH1750_SCL_Set()   GPIO_SetBits(GPIOB,GPIO_Pin_6)
// SDA
#define BH1750_SDA_Clr()   GPIO_ResetBits(GPIOB,GPIO_Pin_7)
#define BH1750_SDA_Set()   GPIO_SetBits(GPIOB,GPIO_Pin_7)

// 讀取SDA電平
#define BH1750_SDA_DATA()   GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)

五、應用實例

使用串口打印光照強度,main函數(shù)如下

float gLingtIntensity = 0;

int main(void)
{
	Med_Mcu_Iint();   // 系統(tǒng)初始化
	
	while(1)
  {
		gLingtIntensity = Med_Bh1750_GetLightIntensity();   // 獲取光照強度
		printf ("Light:%.1f lx",gLingtIntensity);   // 串口打印光照強度
		
		delay_ms(500);   //延時500ms = 0.5s
	}
}

六、拓展應用

利用BH1750獲取到的周圍環(huán)境光強可用于許多方面,這里舉幾個例子,比如設(shè)計一個教室燈光控制系統(tǒng),根據(jù)實際環(huán)境光強來調(diào)節(jié)燈光亮度,使室內(nèi)環(huán)境光強保持在一個穩(wěn)定的值。另外,比如做顏色識別時,周圍環(huán)境的光照強度不同,識別的效果也不同??梢岳肂H1750實時監(jiān)測周圍環(huán)境光照強度變化,不同的光照強度下,切換不同的顏色閾值,可以改善顏色識別的效果。這里簡單介紹一下實現(xiàn)思路。

6.1 實時調(diào)節(jié)LED亮度

可以用PWM來控制LED的亮度。根據(jù)周圍環(huán)境的光照強度的變化,實時調(diào)節(jié)PWM的占空比,達到LED亮度根據(jù)周圍環(huán)境光照強度變化而變化的效果。但是需要注意光照強度與占空比的換算關(guān)系。

6.2 實時調(diào)整顏色閾值

比如使用Open MV做顏色是別時,在不同光照強度下,同一種顏色的顏色閾值不同,可以根據(jù)不同的光照強度,匹配不同的顏色閾值。文章來源地址http://www.zghlxwxcb.cn/news/detail-528668.html

到了這里,關(guān)于STM32外設(shè)系列—BH1750的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • STM32使用HAL庫BH1750光照度傳感器

    STM32使用HAL庫BH1750光照度傳感器

    單片機:STM32F103C8T6 光照度傳感器:BH1750 IDE:KEIL+STM32CUBEMX 1、STM32CUBEMX 1、頭文件 2、C文件 3、主函數(shù)操作BH1750

    2024年02月14日
    瀏覽(23)
  • STM32F103ZET6+IIC+BH1750光照強度傳感

    STM32F103ZET6+IIC+BH1750光照強度傳感

    為了加深對IIC協(xié)議的理解和應用,接下來,使用STM32驅(qū)動BH1750光照強度傳感器 準備IIC協(xié)議 其實IIC協(xié)議還是之前的驅(qū)動溫濕度傳感的那個,只是把GPIO引腳口改了一下,同理,之后遇到使用IIC協(xié)議驅(qū)動的傳感器,都可以用這個定義的IIC協(xié)議。 1、聲明GPIO和IIC初始化 2、IIC數(shù)據(jù)線的

    2023年04月11日
    瀏覽(20)
  • 第12章 STM32+BH1750光照傳感器+OLED模塊顯示環(huán)境光照強度

    第12章 STM32+BH1750光照傳感器+OLED模塊顯示環(huán)境光照強度

    今天給大家介紹一塊嵌入式畢設(shè)中也經(jīng)常用到的一款傳感器——BH1750光照傳感器,如下圖。 (該傳感器的購買鏈接和代碼我已放在資料里,想要資料的同學,評論區(qū)留下郵箱即可) 相比光敏傳感器,它可以直接輸出環(huán)境光照強度的數(shù)值(范圍是0~65535lx),非常適合懶人黨,

    2024年02月04日
    瀏覽(124)
  • BH1750簡單介紹

    bh1750是16位數(shù)字輸出型,環(huán)境光強度傳感器集成電路。主要應用有移動電話,液晶電視,筆記本電腦,便攜式游戲機,數(shù)碼相機,數(shù)碼攝像機,汽車定位系統(tǒng),液晶顯示器。 目錄 1.bh1750中文資料??? 2.bh1750引腳說明 3.bh1750傳感器工作原理 BH1750 FVI是一種用于兩線式串行總線接

    2023年04月08日
    瀏覽(14)
  • BH1750( GY-302 )光照傳感器

    BH1750( GY-302 )光照傳感器

    這里我先簡單的介紹一下BH1750光照傳感器模塊的基本信息(不多廢話),我將著重講解它的使用部分,相信對于屏幕前的你也是更關(guān)心它是怎么使用的,OK,gogogo?。?! 芯片: BH1750FVI 是一種用于兩線式串行總線接口的數(shù)字型光強度傳感器集成電路。這種集成電路可以根據(jù)收集的

    2024年02月03日
    瀏覽(14)
  • BH1750 傳感器實戰(zhàn)教學 —— 硬件設(shè)計篇

    BH1750 傳感器實戰(zhàn)教學 —— 硬件設(shè)計篇

    前面剛寫了一篇 《BH1750 光照傳感器文檔詳解 及 驅(qū)動設(shè)計》,今天來寫一篇簡單的傳感器實戰(zhàn)教學。 文章如下:BH1750 光照傳感器文檔詳解 及 驅(qū)動設(shè)計 那有些朋友就疑惑了,在上一篇文章其實我們基本都測試成功了,驅(qū)動也寫了,還有必要在寫一篇嗎? 如果是用 STM32 做的

    2024年01月17日
    瀏覽(24)
  • BH1750(GY-302)的使用,(光照傳感器)

    BH1750(GY-302)的使用,(光照傳感器)

    BH1750(GY-302)的使用,(光照傳感器) 提示:文章寫完后,目錄可以 自動生成,如何生成可參考右邊的幫助文檔 直接在網(wǎng)上購買BH1750 傳感器模塊 本課題使用 STM32F103-mini 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 BH1750FVI是一款數(shù)字型光強度傳感器集成芯片。某寶上

    2024年02月06日
    瀏覽(20)
  • STM32外設(shè)系列—OLED

    STM32外設(shè)系列—OLED

    ?? 文章作者:二土電子 ?? 關(guān)注文末公眾號獲取其他資料和工程文件! ?? 期待大家一起學習交流! OLED是開發(fā)時常用的顯示器件,這里介紹的是0.96寸的四針腳OLED,IIC控制。 供電電壓在3V~5V,用3.3V即可。 I2C通信接口由從地址位DC、I2C總線數(shù)據(jù)信號SDA(輸出SDAOUT/D2輸出,SD

    2024年02月13日
    瀏覽(17)
  • STM32外設(shè)系列—紅外遙控

    STM32外設(shè)系列—紅外遙控

    ?? 文章作者:二土電子 ?? 關(guān)注文末公眾號獲取其他資料和工程文件! ?? 期待大家一起學習交流! 紅外遙控,顧名思義,就是利用紅外線實現(xiàn)遙控。這里就不單獨對紅外線做介紹了,紅外線的波長再可見光范圍外,所以人眼是看不到的。紅外遙控的原理就是利用紅外線進

    2024年02月14日
    瀏覽(21)
  • STM32外設(shè)系列—DHT11

    STM32外設(shè)系列—DHT11

    ?? 文章作者:二土電子 ?? 關(guān)注文末公眾號獲取其他資料和工程文件! ?? 期待大家一起學習交流! 更新記錄 日期 更新內(nèi)容 2023.10.27 2023.10.27 添加了DHT11復位程序、DHT11連接檢測程序、DHT11初始化程序,修改了DHT11接收一個字節(jié)程序邏輯,更新了接收溫濕度數(shù)據(jù)并校準的程序

    2024年02月15日
    瀏覽(14)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包