BH1750( GY-302 )光照传感器

这篇具有很好参考价值的文章主要介绍了BH1750( GY-302 )光照传感器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


这里我先简单的介绍一下BH1750光照传感器模块的基本信息(不多废话),我将着重讲解它的使用部分,相信对于屏幕前的你也是更关心它是怎么使用的,OK,gogogo!!!

一、产品简介

芯片: BH1750FVI 是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。

工作原理: BH1750的内部由光敏二极管、运算放大器、ADC采集、晶振等组成。PD二极管通过光生伏特效应将输入光信号转换成电信号,经运算放大电路放大后,由ADC采集电压,然后通过逻辑电路转换成16位二进制数存储在内部的寄存器中(光照越强,光电流越大,电压就越大)。

物理电路图:
bh1750,STM32,单片机,stm32,嵌入式硬件,arm,c语言
PCB原理图:
bh1750,STM32,单片机,stm32,嵌入式硬件,arm,c语言

实物图:
bh1750,STM32,单片机,stm32,嵌入式硬件,arm,c语言
可见,该模块有5个引脚,接下来再看看引脚介绍是啥模样

引脚定义:
bh1750,STM32,单片机,stm32,嵌入式硬件,arm,c语言
模块指令:
bh1750,STM32,单片机,stm32,嵌入式硬件,arm,c语言
使用步骤:
bh1750,STM32,单片机,stm32,嵌入式硬件,arm,c语言

产品特点:

  • 支持I2CBUS接口
  • 接近视觉灵敏度的光谱灵敏度特性
  • 输出对应亮度的数字值
  • 对应广泛的输入光范围。(相当于1-65535lx)
  • 通过降低功率功能,实现低电流化。
  • 通过50Hz/60Hz除光噪音功能实现稳定的测定。
  • 支持1.8v逻辑输入接口。
  • 无需其他外部件。
  • 光源依赖性弱。
  • 有两种可选的I2Cslave地址。
  • 可调的测量结果影响较大的因素为光入口大小。
  • 使用这种功能计算1.1lx到100000lx马克斯/分钟的范围。
  • 最小误差变动在±20%。
  • 受红外线影响很小。

二、IIC通信

IIC是一种串行通信总线,IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。可以理解为 其通过SDA和CLK俩根线完成通信传输,

由于该模块是通过IIC协议进行通信的,所以接下来我再来介绍介绍IIC的相关驱动。

IIC驱动部分都是通用的,其各个模块是根据自身的设备地址及其配置、命令等寄存器操作不同来完成各自的通信。

IIC 驱动部分我划分为了6个部分,分为:

  • 开始信号
  • 停止信号
  • 发送应答信号
  • 接收应答信号
  • 发送一个字节
  • 接收一个字节

首先先来看时序图:
bh1750,STM32,单片机,stm32,嵌入式硬件,arm,c语言
时序没看明白,别着急,听我一 一道来。

首先,请记住 : SDA和CLK只有“0和1”俩种状态;其次,主机在发送信号时CLK引脚要定义输出模式,在接收信号时CLK引脚要定义输入模式。

1. 开始信号:
对于开始信号,你可以这样理解,SDA是在CLK置高电平的情况下 由高电平->低电平,这就是开始信号,只不过为了通信稳定,一般在跳变中途延时5us。

接下来看看程序是怎么设计的:

void IIC_Start(void)
{
	SDA_OUT();     //sda线输出模式
	IIC_SDA=1;	  	  
	IIC_SCL=1;
	delay_us(5);
 	IIC_SDA=0;   //产生下降沿
	delay_us(5);
	IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
}	

2. 停止信号:
同开始信号,SDA在CLK为高电平时 由低电平->高电平,完成停止信号。

void IIC_Stop(void)
{
	SDA_OUT(); //sda线输出
	IIC_SDA=0;  //产生上升沿
 	delay_us(5);
	IIC_SCL=1; 
	IIC_SDA=1; //发送I2C总线结束信号
	delay_us(5);							   	
}

3. 发送应答信号:
在SDA为低电平时 CLK由高电平->低电平 ,完成应答;
在SDA为高电平时 CLK由高电平->低电平 ,拒绝应答;

所以在程序中 需设置一个变量进行判断是否接受应答:

void SendACK(int ack)    
{
  GPIO_InitTypeDef GPIO_InitStruct;   
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;    //定义输出模式
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_Pin = sda;
  GPIO_Init(bh1750_PORT, &GPIO_InitStruct);  
	
	if(ack == 1)   //写应答信号
		SDA=1; 
	else if(ack == 0)
		SDA=0; 
	else
		return;			
  SCL=1;     //拉高时钟线
  delay_us(5);                 //延时
  SCL=0;      //拉低时钟线
  delay_us(5);                //延时
}

4. 接收应答信号:
在CLK由低电平->高电平->低电平 期间SDA保持低电平

u8 IIC_waitAck()
{
	u8 ack =0;
	IIC_setSDAMode_In();
	IIC_SCL_OUT(0);             //准备时序
	delay_us(5);
	
	IIC_SCL_OUT(1);
	delay_us(5);
	
	if(IIC_SDA_IN)
	{
				ack =1;
	}
	else
	{
				ack =0;	
	}
	IIC_SCL_OUT(0);              //拉低,表示应答完成
	delay_us(5);
	return  ack;
}

5. 发送一个字节:
CLK每完成一次 高电平->低电平 跳变,主机发送1bit,1字节发送完成后且需要接收从机发回来的应答信号。

void SendByte(uchar dat)
{
  uchar i;
  for (i=0; i<8; i++)         //8位计数器
  {
		if( 0X80 & dat )
      GPIO_SetBits(bh1750_PORT,sda);
    else
      GPIO_ResetBits(bh1750_PORT,sda);
		dat <<= 1;
    SCL=1;               //拉高时钟线
    delay_us(5);             //延时
    SCL=0;                //拉低时钟线
    delay_us(5);            //延时
  }
  RecvACK();
}

6. 接收一个字节:
类似于发送一字节,只是引脚定义不同,具体如下:

u8 IIC_readByte()
{
  u8 data = 0;
	IIC_setSDAMode_In();
	IIC_SCL_OUT(0);                  //先拉低,为读取数据做准备
	delay_us(5);
	for(int i=0;i<8;i++)
	{
			IIC_SCL_OUT(1);         // SCL为高期间才可以读取数据
			delay_us(5);
		if(IIC_SDA_IN)
		{
				data|=(0x01<<(7-i));	
		}else{
			data &= ~(0x1<<(7-i));
		}	
		IIC_SCL_OUT(0);
		delay_us(5);
	}
	return data;
}

三、BH1750的使用

1. 写信号
首先需要对模块进行写操作,然后再初始化, 写操作的过程为:起始信号 -->发送设备地址+写信号 -->发送内部寄存器地址 --> 发送停止信号。

void Single_Write_BH1750(uchar REG_Address)
{
  BH1750_Start();                  //起始信号
  BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号
  BH1750_SendByte(REG_Address);    //内部寄存器地址
  BH1750_Stop();                   //发送停止信号
}

2. 初始化
对模块进行初始化,初始化SDA和CLK引脚 初步设置为推挽输出,然后对模块进行上电,根据指令表可知 上电指定为0x01,上电后需要延迟180ms左右让模块进行缓冲。

void Init_BH1750()
{
  GPIO_InitTypeDef GPIO_InitStruct;
	 /*开启GPIOB的外设时钟*/ 
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); 
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_Pin = sda | scl ;
  GPIO_Init(bh1750_PORT,&GPIO_InitStruct); 
	
  Single_Write_BH1750(0x01);  
	delay_ms(180);            //延时180ms
}

3. 读寄存器内部数据
读数据操作的过程为:起始信号 -->发送设备地址+读信号 -->定义数组存储数据(最后一个数据需要拒绝应答) --> 发送停止信号。

void mread(void)
{   
	uchar i;	
    BH1750_Start();                          //起始信号
    BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
	
	for (i=0; i<3; i++)                      //连续读取3个地址数据,存储中BUF
  {
      BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
      if (i == 3)
    {
      BH1750_SendACK(1);                //最后一个数据需要回NOACK
    }
    else
    {		
      BH1750_SendACK(0);                //回应ACK
    }
  }
  BH1750_Stop();                          //停止信号
  delay_ms(5);
}

4. 对数据进行操作、转存

float read_BH1750(void)
{
    int dis_data;                       //变量	
	float temp1;
	float temp2;
	Single_Write_BH1750(0x01);   // power on
    Single_Write_BH1750(0x10);   // H- resolution mode
    delay_ms(180);            //延时180ms
	mread();       //连续读出数据,存储在BUF中
    dis_data=BUF[0];
    dis_data=(dis_data<<8)+BUF[1]; //合成数据 
	temp1=dis_data/1.2;
	temp2=10*dis_data/1.2;	
	temp2=(int)temp2%10;
	OLED_ShowString(87,2,".",12); 
	OLED_ShowNum(94,2,temp2,1,12);	
	return temp1;
}

5. 主函数里调用BH17502并显示在oled上

int main(void)
{ 
    float light;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	delay_init();	    	 //延时函数初始化	  
	uart_init(9600);	 	//串口初始化为9600
	LED_Init();				//初始化与LED连接的硬件接口
    Init_BH1750();       //初始化BH1750
	OLED_Init();     //初始化OLED
	OLED_Clear();     //清屏
	
  while(1)
  {
     light=read_BH1750();  //读取BH1750的光强数据
     OLED_ShowString(0,2,"light:",12);  //显示光照强度
	 OLED_ShowNum(48,2,light,6,12);	
	 OLED_ShowString(110,2,"lx",12);
	 if(light<100)
	{
		LED1=0;
		OLED_ShowString(38,5,"LED-ON ",12);
	}
	else
	{
		LED1=1;
		OLED_ShowString(38,5,"LED-OFF",12);
	}
  }		
}	

四、程序源码

链接:https://pan.baidu.com/s/1AX8y8Y5A4e70Qz81prmlyg
提取码:qzbf

疑难解答或技术交流加下方wx联系即可👇👇👇文章来源地址https://www.toymoban.com/news/detail-779387.html

到了这里,关于BH1750( GY-302 )光照传感器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第12章 STM32+BH1750光照传感器+OLED模块显示环境光照强度

    今天给大家介绍一块嵌入式毕设中也经常用到的一款传感器——BH1750光照传感器,如下图。 (该传感器的购买链接和代码我已放在资料里,想要资料的同学,评论区留下邮箱即可) 相比光敏传感器,它可以直接输出环境光照强度的数值(范围是0~65535lx),非常适合懒人党,

    2024年02月04日
    浏览(54)
  • STM32外设芯片驱动学习记录 —— (一) BH1750光照传感器驱动开发

    一、芯片介绍 二、Datasheet解读 1.硬件说明 2.寄存器说明 3.通信过程 三、驱动代码编写 1.软件I2C驱动 2. BH1750芯片驱动函数 总结             BH1750是16位数字输出型,环境光强度传感器集成电路,使用I2C接口通信,工作电压:VCC(2.4~3.6V),I2C电平(1.65~VCC),用于各类消费类LCD屏

    2024年02月02日
    浏览(87)
  • STM32F103ZET6+IIC+BH1750光照强度传感

    为了加深对IIC协议的理解和应用,接下来,使用STM32驱动BH1750光照强度传感器 准备IIC协议 其实IIC协议还是之前的驱动温湿度传感的那个,只是把GPIO引脚口改了一下,同理,之后遇到使用IIC协议驱动的传感器,都可以用这个定义的IIC协议。 1、声明GPIO和IIC初始化 2、IIC数据线的

    2023年04月11日
    浏览(49)
  • BH1750 传感器实战教学 —— 硬件设计篇

    前面刚写了一篇 《BH1750 光照传感器文档详解 及 驱动设计》,今天来写一篇简单的传感器实战教学。 文章如下:BH1750 光照传感器文档详解 及 驱动设计 那有些朋友就疑惑了,在上一篇文章其实我们基本都测试成功了,驱动也写了,还有必要在写一篇吗? 如果是用 STM32 做的

    2024年01月17日
    浏览(41)
  • STM32外设系列—BH1750

    🎀 文章作者:二土电子 🌸 关注文末公众号获取其他资料和工程文件! 🐸 期待大家一起学习交流! BH1750是一款数字型光照强度传感器,能够获取周围环境的光照强度。其测量范围在0~65535 lx。 lx勒克斯,是光照强度的单位。 BH1750可用于调节手机屏幕和键盘的背光功率,或

    2024年02月12日
    浏览(41)
  • STM32案例学习 GY-39环境监测传感器模块

    野火STM32F1系列开发板 正点STM32F1系列开发板 STM32F103ZET6核心板 GY-39环境监测传感器模块 GY-39 是一款低成本,气压,温湿度,光强度传感器模块。工作电压 3-5v,功耗小,安装方便。 其工作原理是,MCU 收集各种传感器数据,统一处理,直接输出计算后的结果。此模块,有两种方

    2024年02月12日
    浏览(54)
  • GY56 红外激光测距传感器 (内附STM32、MSP432代码)

    GY-56 是一款低成本数字红外测距传感器模块。 工作电压 3-5v,功耗小,体积小,安装方便。 其工作原理是,红外 LED 发光,照射到被测物体后,返回光经过 MCU 接收,MCU 计算出时间差,得到距离。直接输出距离值。此模块,有两种方式读取数据,即串口 UART(TTL 电平)+IIC(

    2024年02月22日
    浏览(45)
  • STM32HAL库驱动DHT11和BH1750

    stm32f103c8t6 DHT11(温湿度传感器) BH1750(光照度传感器) OLED micro USB数据传输线 sys-Debug-Serial Wrie RCC-HSE-Crystal/Cerarnic Resonator PC13-GPIO_Out TIM1-Clock Source-Internal Clock Parameter Settings 为后面DHT11的延时us起作用 TIM2-Clock Source-Internal Clock Parameter Settings NVIC Settings-TIM2 global interrupt Enabled 打开I2C

    2024年02月01日
    浏览(66)
  • Stm32_标准库_8_ADC_光敏传感器_测量具体光照强度

    ADC简介 测量方式 采用二分法比较数据 IO通道 ADC基本结构及配置路线 获取数字变量需要用到用到光敏电阻的AO口,AO端口接在PA0引脚即可 测得的模拟数据与实际光照强度之间的关系为 代码: 完整朴素代码: 效果: 此代码的不足之处在于每次写入数字都会提前占据固定位置,

    2024年02月04日
    浏览(46)
  • STM32教学——JQ8900语音模块+光照传感器+4G模块数据上传阿里云物联网

    原理图 PCB 实物图 选用EC200U模块,集成4g和GPS以及蓝牙功能 通过串口2与4G模块串口连接,串口传输数据指令。 这个时候4g模块已经成功启动,下一步注册进阿里云物联网平台 然后就是上发数据给阿里云平台 上发了之后阿里云就可以收到这些数据 根据厂家提供的手册资料,可

    2024年03月14日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包