加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

STM32傳感器外設集-光照傳感器(BH1750)

05/10 10:00
7580
服務支持:
技術交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術大咖們分享疑惑和經(jīng)驗、收獲成長和認同、領取優(yōu)惠和紅包等。

虛擬商品不可退

當前內(nèi)容為數(shù)字版權作品,購買后不支持退換且無法轉移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論
放大
實物圖
相關方案
  • 方案介紹
    • 資源獲取
    • 參考
  • 相關文件
  • 推薦器件
  • 相關推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

介紹

BH1750是一款數(shù)字式環(huán)境光傳感器,能夠準確地測量環(huán)境光的亮度。BH1750采用數(shù)字式輸出,具有高精度、快速響應、低功耗的特點,廣泛應用于照明自動控制、智能設備、電子識別等領域。BH1750能簡化光控設計,接口方便,采用I2C總線通信協(xié)議,支持多種測量模式,并可通過設置來調(diào)整測量靈敏度。BH1750工作溫度范圍廣,適用于各種環(huán)境。除此之外,BH1750還有很多其他的特性,如可控制的精度、可選的地址引腳、多種輸出范圍等。在物聯(lián)網(wǎng)、智能家居等領域,BH1750正在發(fā)揮越來越重要的作用。

原理圖

資源獲取

歡迎關注微信公眾號--星之援工作室 發(fā)送關鍵字(BH1750)

main.c

/**
  * @brief  主函數(shù)
  * @param  無  
  * @retval 無
  */
int main(void)
{
	

	/* 初始化系統(tǒng)時鐘*/
	SysTick_Init();
  delay_init();//初始化延時函數(shù)
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	
	USART_Config();//初始化串口1
	printf("rn***  bh1750傳感器實驗***rn");
	bh1750_Init();//初始化bh1750
	
	while(1)
	{	
		light=getValue();
		UsartPrintf(DEBUG_USARTx,"光照:%d",light);	//打印串口數(shù)據(jù)	,再加一個光照強度%d    light	
			
		Delay_ms(2000);
	}

	
}

BH1750.h

#ifndef __BH1750_I2C_H
#define __BH1750_I2C_H

#include "stm32f10x.h"
/************************************
*	連接   VCC-->3.3V      GND-->GND
*	 ADDR----->GND
*    SCL ----->pb6
*    sda ----->pb5
*************************************/
 
 
//IO方向設置
//#include "SysTick.h"
#include "time.h"
#include "./usart/bsp_usart.h"
#define BH1750_SDA_IN()  {GPIOB->CRL&=0XFF0FFFFF;GPIOB->CRL|=(u32)8<<20;}
#define BH1750_SDA_OUT() {GPIOB->CRL&=0XFF0FFFFF;GPIOB->CRL|=(u32)3<<20;}
 
//IO操作函數(shù)	 
#define BH1750_IIC_SCL    PBout(6) //SCL
#define BH1750_IIC_SDA    PBout(5) //SDA	 
#define BH1750_READ_SDA   PBin(5)  //輸入SDA 
 
#define	  BH1750_SlaveAddress   0x46 //定義器件在IIC總線中的從地址,根據(jù)ALT  ADDRESS地址引腳不同修改
                                     //ALT  ADDRESS引腳接地時地址為0x46,接電源時地址為0xB8
 
 
 
extern float lux;
 
void bh1750_iic_init(void);
void bh1750_iic_start(void);
void bh1750_iic_stop(void);
void bh1750_send_ack(char ack);
char bh1750_recv_ack(void);
void bh1750_send_byte(char dat);
char bh1750_recv_byte(unsigned char ack);
 
void bh1750_iic_init(void);
void Single_Write_bh1750(unsigned char Reg_Address);
void bh1750_Init(void);
void bh1750_ReadOneTime(void);
void bh1750_ReadContinuous1(void);
u8 getValue(void);

#endif /* __BH1750_I2C_H */


BH1750.c

#include "BH1750.h"
#include "sys.h"
#include "delay.h"
u8 BUF[8];
u16 temp2=0;
float lux=0;
void bh1750_iic_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );	//使能GPIOB時鐘
	   
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽輸出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6); 	//PB6,PB7 輸出高
 
}
 
/****向BH1750單次寫命令****/
void Single_Write_bh1750(unsigned char Reg_Address)
{
	bh1750_iic_start();
	bh1750_send_byte(0x46);  //發(fā)送器件地址0100 0110   最后一位0,表示寫
	//IIC_Wait_Ack();
	bh1750_send_byte(Reg_Address);  
	//IIC_Wait_Ack();
	bh1750_iic_stop();
}
 
/****BH1750初始化****/
void bh1750_Init(void)
{
	
//	TIM4_PWM_Init(899,0);
	bh1750_iic_init();
	TIM_SetCompare3(TIM3,0);	
}
 
//光照強度數(shù)據(jù)接收和處理
u8 getValue(void)
{
	unsigned char value=0;
	Single_Write_bh1750(0x01);
	Single_Write_bh1750(0x10);
	delay_ms(200);
	bh1750_ReadContinuous1();
	temp2=BUF[0];
	temp2=(temp2<<8)+BUF[1];
	lux=(float)temp2/1.2;    //lux是float型	
	if((lux>0)&&(lux<50))
		value=10;
	else if(lux<75)
		value=20;
	else if(lux<100)
		value=40;
	else if(lux<125)
		value=50;
	else if(lux<150)
		value=60;
	else if(lux<175)
		value=70;
	else if(lux<200)
		value=80;
	else if(lux<250)
		value=90;
	else if(lux<280)
		value=110;
	else if(lux<300)
		value=120;
	else if(lux<320)
		value=130;
	else if(lux<340)
		value=140;
	else if(lux<360)
		value=150;
	else if(lux<380)
		value=160;
	else if(lux<400)
		value=170;
	else if(lux<410)
		value=180;
	else if(lux<450)
		value=190;	
	else if(lux<800)
		value=240;
	//printf("光照強度:%f   value:%drn",lux,value);
	TIM_SetCompare3(TIM3,value);
	return value;
	
	//Delay_ms(1000);
}
/****從BH1750單次讀Lux****/
/****
模式選擇:H-Resolution Mode,分辨率1lux
單次讀Opecode:0010 0000 ,即0x20
器件地址:0100011,ADDR接GND
****/
void bh1750_ReadOneTime(void)
{
	
 
	bh1750_iic_start();
	bh1750_send_byte(0x46);  //發(fā)送器件地址0100 0110   最后一位0,表示寫
	bh1750_recv_ack();
	bh1750_send_byte(0x20);   //發(fā)送One time H-Resolution Mode的Opecode 0010 0000,分辨率為1lux
	bh1750_recv_ack();
	bh1750_iic_stop();
	delay_ms(200);
	bh1750_iic_start();
	bh1750_send_byte(0x47);  //
	bh1750_recv_ack();
	BUF[0]=bh1750_recv_byte(1);
	//IIC_Ack();        //主機應答
	//temp1=temp<<8;
	BUF[1]=bh1750_recv_byte(0);
	//IIC_NAck();        //主機不應答	
	bh1750_iic_stop();
	
	
// 	temp2=BUF[0];
// 	temp2=(temp2<<8)+BUF[1];
// 	lux=(float)temp2/1.2;    //lux是float型
	
	//return lux;
	//Delay_ms(200);
}
 
/****從BH1750連續(xù)讀Lux****/
/****
模式選擇:H-Resolution Mode,分辨率1lux
連續(xù)讀Opecode:0001 0000
器件地址:0100011,ADDR接GND
****/
void  bh1750_ReadContinuous1(void)
{
//	u16 temp=0,temp1=0;
	bh1750_iic_start();
  bh1750_send_byte(0x46);  //發(fā)送器件地址0100 0110   最后一位0,表示寫
	bh1750_recv_ack();
	bh1750_send_byte(0x10);  //發(fā)送Continuous H-Resolution Mode的Opecode 0001 0000,分辨率為1lux
	bh1750_recv_ack();
	bh1750_iic_stop();
	delay_ms(200);
	bh1750_iic_start();
  bh1750_send_byte(0x47);  
	bh1750_recv_ack();
	
	
 	BUF[0]=bh1750_recv_byte(1);
	BUF[1]=bh1750_recv_byte(0);	
	
	
	//temp=bh1750_recv_byte(1);
	//temp1=bh1750_recv_byte(0);
 
 
	bh1750_iic_stop();
	
	//temp2=temp1+(temp<<8);
	//lux=(float)temp2/1.2;    //lux是float型
 
 
}
 
void Conversion(void)
{
	temp2=BUF[0];
	temp2=(temp2<<8)+BUF[1];
	lux=(float)temp2/1.2;    //lux是float型
	
}
 
 
 
/**************************************
起始信號
**************************************/
void bh1750_iic_start(void)
{
		BH1750_SDA_OUT()       //設置SDA線為輸出
	//在開始數(shù)據(jù)傳輸前,先讓SDA和SCL都拉高
		BH1750_IIC_SDA=1;    //發(fā)送起始條件的數(shù)據(jù)信號,釋放總線
	  delay_us(2);
		BH1750_IIC_SCL=1;    
 
		delay_us(5);   //Tsu;STA:起始條件的建立時間大于4.7us。
	
		BH1750_IIC_SDA=0;    //SDA由高變?yōu)榈捅硎鹃_始信號
		delay_us(4);   //起始條件的保持時間大于4us
		BH1750_IIC_SCL=0;    //鉗住IIC總線,準備發(fā)送或者接收數(shù)據(jù)
		delay_us(2);
}
 
/**************************************
停止信號
**************************************/
void bh1750_iic_stop(void)
{
	BH1750_SDA_OUT()       //設置SDA線為輸出
	
	//IIC_SCL=0;    //此句是調(diào)試BH1750時加,2018.03.03
	
	BH1750_IIC_SDA=0;   //發(fā)送停止信號的數(shù)據(jù)信號
	delay_us(2);
	BH1750_IIC_SCL=1;   //發(fā)送停止信號的時鐘信號
	delay_us(5);  //停止信號的建立時間大于4us
	BH1750_IIC_SDA=1;   //發(fā)送停止信號
	delay_us(4);    //;
}
 
/**************************************
發(fā)送應答信號
入口參數(shù):ack (0:ACK 1:NAK)
**************************************/
void bh1750_send_ack(char ack)
{
	BH1750_IIC_SCL=0;
	BH1750_SDA_OUT();
	BH1750_IIC_SDA=ack;   //主器件應答
	delay_us(2);
	BH1750_IIC_SCL=1;
	delay_us(4);        //SCL高電平周期大于4us
	BH1750_IIC_SCL=0;         //清時鐘線,鉗住IIC總線以便繼續(xù)接收
	delay_us(2);
 
}
 
/**************************************
接收應答信號
**************************************/
char bh1750_recv_ack(void)
{
	u8 ucErrorTime=0;
	BH1750_SDA_IN();     //SDA設置成輸入
	BH1750_IIC_SDA=1;
	delay_us(2);
	BH1750_IIC_SCL=1;
	delay_us(2);
	while(BH1750_READ_SDA)
	{
		ucErrorTime++;
		if(ucErrorTime>=250)
		{
			bh1750_iic_stop();
			return 1;		
		}
	}
	BH1750_IIC_SCL=0;
	return 0;
}
 
/**************************************
向IIC總線發(fā)送一個字節(jié)數(shù)據(jù)
**************************************/
void bh1750_send_byte(char dat)
{
	u8 i;
	BH1750_SDA_OUT();  
 
	for(i=0;i<8;i++)
	{
		if((dat<<i)&0x80)  BH1750_IIC_SDA=1;   //判斷發(fā)送位
		else BH1750_IIC_SDA=0;
 
		delay_us(2);
		BH1750_IIC_SCL=1;     //拉高SCL,通知被控器開始接收數(shù)據(jù)位
		delay_us(4);   //保證SCL高電平周期大于4us
		BH1750_IIC_SCL=0;    //拉低SCL,允許SDA傳輸下一位數(shù)據(jù)。因為只有在SCL=0時才允許SDA的狀態(tài)發(fā)生變化
	  delay_us(2);
   }
	 //以下四句是調(diào)試BH1750時添加的,2018.03.03
	 //特別注意;用方法三時,以下四句不可去掉,去掉后得到的數(shù)有問題
	 //用方法二時,以下四句需注釋掉,否則也會有問題,至于原因暫時還不清楚。
// 	 IIC_SDA=0;
// 	 Delay_us(2);
// 	 IIC_SCL=1;
// 	 Delay_us(2);
	 
	 BH1750_IIC_SCL=0;      //拉低SCL,為下次數(shù)據(jù)傳輸做好準備
	 delay_us(2);
}
 
/**************************************
從IIC總線接收一個字節(jié)數(shù)據(jù)
用來接收從器件傳來的數(shù)據(jù),ack為1時,發(fā)送Ack(產(chǎn)生應答);ack為0時,發(fā)送NAck(不產(chǎn)生應答)
**************************************/
char bh1750_recv_byte(unsigned char ack)
{
	unsigned char i,receive=0;
	BH1750_SDA_IN();    
	for(i=0;i<8;i++)
	{
		BH1750_IIC_SCL=0;    //置SCL為低,準備接收數(shù)據(jù)位
		delay_us(5);  //時鐘低電平周期大于4.7us
		BH1750_IIC_SCL=1;   //置SCL為高,使SDA上數(shù)據(jù)有效
		delay_us(2);
		receive=receive<<1;
		if(BH1750_READ_SDA) receive=receive+1;    //讀取SDA,把接收的數(shù)據(jù)位放入receve中,若此處寫成IIC_SDA==1,會失敗,思考原因?	
		delay_us(2);
  }
	if(!ack) 
		bh1750_send_ack(1);   //發(fā)送NAck
	else 
		bh1750_send_ack(0);    //發(fā)送Ack
	//IIC_SCL=0;      //在此處有何用處???(猜測:為下次數(shù)據(jù)傳輸做好準備, //鉗住IIC總線,準備發(fā)送或者接收數(shù)據(jù))
	//Delay_us(2);
	return receive;
}



/*************************************END OF FILE******************************/

參考

BH1750( GY-302 )光照傳感器icon-default.png?t=N7T8https://blog.csdn.net/Dustinthewine/article/details/127540711?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170212703316800186517198%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170212703316800186517198&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-127540711-null-null.142^v96^pc_search_result_base7&utm_term=bh1750&spm=1018.2226.3001.4187

聯(lián)系方式 微信號:13648103287

  • 聯(lián)系方式.docx

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
ACS711ELCTR-12AB-T 1 Allegro MicroSystems LLC Hall Effect Sensor, Rectangular, Surface Mount, ROHS COMPLIANT, MS-012AA, SOIC-8

ECAD模型

下載ECAD模型
$2.39 查看
AD590MH 1 Rochester Electronics LLC ANALOG TEMP SENSOR-CURRENT, 0.5Cel, ROUND, THROUGH HOLE MOUNT, METAL CAN, TO-52, 3 PIN
$108.23 查看
26PCDFG2G 1 Honeywell Sensing and Control Peizoresistive Sensor

ECAD模型

下載ECAD模型
$75.81 查看

相關推薦

電子產(chǎn)業(yè)圖譜

方案定制,程序設計方案、單片機程序設計與講解、APP定制開發(fā)。本公眾號致力于向讀者傳遞關于程序設計和開發(fā)的相關知識,并分享一些關于軟件開發(fā)的最佳實踐。如果您有什么問題或建議,請隨時聯(lián)系我們。我們將竭誠為您服務