栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

BH1750的一些使用心得(STM32,内置工程)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

BH1750的一些使用心得(STM32,内置工程)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 

目录

前言

一、BH1750是什么?

二、如何使用BH1750

 2.1 BH1750的通信方式

 2.2 BH1750的指令集

2.3 BH1750的时序图

三、 BH1750代码详解

3.1 硬件IIC配置

3.2 BH1750的读和写

 3.3 主函数

四、演示

工程:


前言

写这篇文章的原因是自己写毕设的时候用到了这个模块,故分享一下BH1750的使用经验,记录一下自己的代码,这里是萌新一枚,还请各位大佬多多包涵。


一、BH1750是什么?

        一个光照传感器,使用IIC进行通信的数字传感器,主要功能为测量光照强度;

二、如何使用BH1750

        使用任何陌生的元器件,第一步都应该是掏出他的数据手册。

        

图一 BH1750数据手册

        看到这个数据手册,有的同学可能会说,“极光啊,我的英语是一窍不通啊”。没关系,我也是我英语老学渣了,大学英语全都是60分飘过,全靠老师饶我一条狗命。我都能弄懂数据手册,你们也一定可以。

        首先在看数据手册时,我们需要认识到一点,我们是要去了解关键信息去的,我们是要了解怎么让他动起来,而不是去做阅读理解。什么是关键信息?一、通信方式,二、指令集,三、时序图。如果你要搞硬件,你可能还需要看它的电气特性和封装之类的,如果你只是买个模块来玩,这看这三个就足够了。

 2.1 BH1750的通信方式

        这在数据手册上的第一句话就已经说明了:

图二 BH1750的通信方式

        这是通过I2C来进行通信,I2C我就不过多介绍了,CSDN上很多人都有讲,我个人是通过火哥的视频来学的,在这里附上火哥的B站视频链接。

        特别注意,I2C非常重要,想往单片机嵌入式方面发展的,要好好学。

【单片机】野火STM32F103教学视频 (配套霸道/指南者/MINI)【全】(刘火良老师出品) (无字幕)_哔哩哔哩_bilibili

 2.2 BH1750的指令集

        指令集这种东西通常来说是以表格的形式存在于数据手册之中,而且伴随着二进制和十六进制的数值。BH1750的指令集如下所示:

图3 BH1750指令集


        第一列为功能,第二列为具体的数值,第三列为功能的补充说明。举例:第四行写的是自动测量高分辨率模式,想要实现这个功能,你需要往传感器中发送0x10。这样,每大约120ms,传感器会得到一个数据,这个数据的精度为1lx,你通过IIC读取这个数据即可。

2.3 BH1750的时序图

        

                                                                图4 BH1750时序图

        其实学过I2C的人能够很轻易的看出这是啥了,这其实就是一个IIC。

        序号1:是往BH1750中写入,首先发送一个起始信号,通过IIC的总线发送BH1750的地址,同时在地址的后面表明我们是要写入BH1750,具体做法就是在7位的地址后面凑一个0,如果你要声明自己是要读出就往后面凑个1,然后等待一个应答信号。再然后,发送指令0x10,就是我们上面提到过的连续采集高分辨率模式,等待一个应答信号,收到应答后,再发送一个结束信号。完成BH1750的写入工作。

          序号2:等待最多180ms,这段时间,BH1750正在采集数据,并将数据存入到寄存器之中。

         序号3:将寄存器中的数据取出。同样发送一个起始信号,通过IIC的总线发送BH1750的地址,同时在地址的后面表明我们是要读BH1750,在7位的地址后面凑一个1,等待一个应答信号,接收数据的高八位,再发送一个应答信号,表示我们还没有接收完,再接收高八位,发送非应答,同时发送结束信号,完成接收。这样我们就得到了传感器发送来的数据了。

三、 BH1750代码详解

        下面就是代码部分,我自认是写注释比较勤快的,这部分就不做过多的赘述了,如果还是看不懂的可以私信问或者评论区里留言。

3.1 硬件IIC配置

        我个人偏好硬件IIC,可以不用写时序。不会硬件的可以往上翻一翻,我有发一个视频链接里面有讲硬件IIC,火哥讲的课还是很不错的。



static void I2C_GPIO_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure; 

	
	BH1750_I2C_APBxClock_FUN ( BH1750_I2C_CLK, ENABLE );
	BH1750_I2C_GPIO_APBxClock_FUN ( BH1750_I2C_GPIO_CLK, ENABLE );
	
    
  
  GPIO_InitStructure.GPIO_Pin = BH1750_I2C_SCL_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;	       // 开漏输出
  GPIO_Init(BH1750_I2C_SCL_PORT, &GPIO_InitStructure);
	
  GPIO_InitStructure.GPIO_Pin = BH1750_I2C_SDA_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;	       // 开漏输出
	
  GPIO_Init(BH1750_I2C_SDA_PORT, &GPIO_InitStructure);	
}




static void I2C_Mode_Configu(void)
{
  I2C_InitTypeDef  I2C_InitStructure; 

  
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
	
	
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
	
	
  I2C_InitStructure.I2C_OwnAddress1 =I2Cx_OWN_ADDRESS7;
	
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;
	 
	
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
	
	
  I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
  
	
  I2C_Init(BH1750_I2Cx, &I2C_InitStructure);
  
	
  I2C_Cmd(BH1750_I2Cx, ENABLE);   
}



void BH1750_I2C_Init(void)
{
	I2C_GPIO_Config(); 
 
  I2C_Mode_Configu();
}

3.2 BH1750的读和写
void IIC_BH1750_Write(uint8_t command)
{
	
	while(I2C_GetFlagStatus(BH1750_I2Cx, I2C_FLAG_BUSY));
	
	
	I2C_GenerateSTART(BH1750_I2Cx, ENABLE);
	
	while(!I2C_CheckEvent(BH1750_I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
	
	
	I2C_Send7bitAddress(BH1750_I2Cx, BH1750_ADDRESS, I2C_Direction_Transmitter);
	
	while(!I2C_CheckEvent(BH1750_I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
	
	I2C_SendData(BH1750_I2Cx, command);
	
	while(!I2C_CheckEvent(BH1750_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
	
	I2C_GenerateSTOP(BH1750_I2Cx, ENABLE);
}


uint32_t IIC_BH1750_Read(void)
{	
	uint32_t Data=0;
	
	
	while(I2C_GetFlagStatus(BH1750_I2Cx, I2C_FLAG_BUSY));
	
	
	I2C_GenerateSTART(BH1750_I2Cx, ENABLE);
	
	while(!I2C_CheckEvent(BH1750_I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
	
	
	I2C_Send7bitAddress(BH1750_I2Cx, BH1750_ADDRESS, I2C_Direction_Receiver);
	
	while(!I2C_CheckEvent(BH1750_I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
	
	
	while(I2C_CheckEvent(BH1750_I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)==0);
	
	Data=I2C_ReceiveData(BH1750_I2Cx);
	
	Data=Data<<8;
	
	I2C_AcknowledgeConfig(BH1750_I2Cx, DISABLE);
	
	I2C_GenerateSTOP(BH1750_I2Cx, ENABLE);
	
	while(I2C_CheckEvent(BH1750_I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)==0);
	
	Data|=I2C_ReceiveData(BH1750_I2Cx);
	
	
	I2C_AcknowledgeConfig(BH1750_I2Cx, ENABLE);
	
	
	return Data;
}

 3.3 主函数
  
#include "stm32f10x.h"
#include "./led/bsp_led.h"
#include "./usart/bsp_usart.h"
#include "./i2c/bsp_i2c_ee.h"
#include "bsp_i2c_bh1750.h"
#include 



void delayms(uint16_t time)
{
	uint16_t i;
	while(time--)
	{
		i=12000;
		while(i--);
	}
}


uint16_t BH1750_Read(void)
{
	uint16_t temp;
	
	
	temp=IIC_BH1750_Read();
	
    
	temp=(uint32_t)(temp/1.2);
	
	return temp;
}


int main(void)
{ 
	uint16_t Data;
  LED_GPIO_Config();
  
  LED_BLUE;
  
	USART_Config();
	
	printf("rn 这是一个BH1750测试例程 rn");

	
	BH1750_I2C_Init();

	printf("rn 作者:极光 rn");	
	
	
	IIC_BH1750_Write(0x01);
	
	IIC_BH1750_Write(0x10);
  
  while (1)
  {   
		Data=BH1750_Read();
		printf("rn 光照强度为 %d lx rn",Data);
		
		delayms(2000);
			
  }
}


四、演示

 图五 效果演示

工程:

        链接:https://pan.baidu.com/s/1MlDgRXKAwiJ23hmZAYvrzA?pwd=1111 
        提取码:1111 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/932152.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号