BH1750( GY-302 )光照传感器

2023-05-16

文章目录

  • 一、产品简介
  • 二、IIC通信
  • 三、BH1750的使用
  • 四、程序源码


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

一、产品简介

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

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

物理电路图:
在这里插入图片描述
PCB原理图:
在这里插入图片描述

实物图:
在这里插入图片描述
可见,该模块有5个引脚,接下来再看看引脚介绍是啥模样

引脚定义:
在这里插入图片描述
模块指令:
在这里插入图片描述
使用步骤:
在这里插入图片描述

产品特点:

  • 支持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个部分,分为:

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

首先先来看时序图:
在这里插入图片描述
时序没看明白,别着急,听我一 一道来。

首先,请记住 : 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);
	}
  }		
}	

四、程序源码

该程序结合oled显示输出,有需要可 留言评论区私信即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BH1750( GY-302 )光照传感器 的相关文章

  • mvIMPACT 相机 SDK C++

    Overview 这是为想要使用mvIMPACT Acquire的c 43 43 接口的开发人员编写的文档 它基于C接口 xff0c 但是提供了一种更方便的面向对象的方法来处理设备驱动程序提供的属性和函数 SDK mvIMPACT xff0
  • 面试题:两个链表结构的数据相加,保存到新链表。

    使用STL span class token macro property span class token directive keyword include span span class token string lt iostrea
  • 软件建模基础

    摘录自某PPT 文章目录 软件建模基础0 软件质量属性0 1 如何评价代码质量0 2 软件质量属性 1 面向对象1 0 面向对象知识点1 1 面向对象四大特性1 1 xff08 封装 xff09 1 1 xff08 抽象 xff09 1 1
  • 如何扫描图像,查找表 和 用OpenCV进行时间测量

    英文版原文链接 xff1a How to scan images lookup tables and time measurement with OpenCV 文章目录 目标测试用例图像矩阵如何存储在内存之中 遍历方式一 xff1a 高效的
  • DDD开发

    内容来自某PPT 文章目录 DDD开发1 领域 限定上下文 实体 值对象1 1 领域 子域1 2 核心域 通用域 支撑域1 3 通用语言1 4 限界上下文 xff1a 定义领域边界的利器1 5 实体1 6 值对象1 7 实体 VS 值对象
  • 嵌入式软件开发工程师求职要求

    文章目录 他人感悟工作职责任职要求嵌入式软件开发涉及的知识点很多 xff0c 我仅简单说一下 xff1a 他人感悟 一线工程师告诉你嵌入式真实现状与发展前景 当我们谈论嵌入式时我们究竟在谈什么 工作职责 负责硬件平台bring up xff
  • kolla-ansible openstack登录 证书不可用

    根据官方文档配置kolla ansible之后 xff0c 创建openstack实例 xff0c 登录openstack出现证书不可用 xff0c 如图 问题排查 尝试过 更新openrc sh文件增加OS TOKEN环境变量 查看日志
  • 联发科2021笔试题:字符串中找到 出现次数 最多的单个字符

    I O描述 输入 xff1a span class token string 34 aaaaabbbbbBBBBBAAAAA 34 span 输出 xff1a A span class token punctuation span span
  • 对矩阵的 掩码运算

    英文链接 xff1a Mask operations on matrices 文章目录 测试用例代码基本函数二维滤波器函数 矩阵的掩码操作非常简单 其思想是我们根据掩码矩阵 也称为内核 重新计算图像中每个像素的值 此掩码保存的值将调整相邻像
  • 对图片的操作

    英文原文链接 xff1a Operations with images 文章目录 输入 输出图像的基本操作内存管理和引用计数基本操作可视化图像 输入 输出 从文件加载一个图像 Mat img span class token operato
  • 使用OpenCV相加(混合)两个图像

    使用OpenCV相加 混合 两个图像 xff1a Adding blending two images using OpenCV 文章目录 目标理论源码解释结果 目标 什么是线性混合 xff0c 为什么它有用 如何使用addWeighted
  • 改变图像的对比度和亮度

    英文链接 xff1a Changing the contrast and brightness of an image 文章目录 目标理论图像处理像素处理亮度和对比度调整 源码解释结果实例亮度和对比度调整图像灰度校正 xff08 Gamma
  • 离散傅里叶变换

    英文链接 xff1a Discrete Fourier Transform 目标 什么是傅里叶变换 xff0c 为什么要用它 在OpenCV中怎么做 使用诸如 copyMakeBorder merge dft getOptimalDFTSi
  • 使用XML和YAML文件的 文件输入和输出

    英文链接 xff1a File Input and Output using XML and YAML files 文章目录 目标源码解释结果 目标 如何打印和读取文本条目到文件 和 OpenCV使用YAML或XML文件 如何为OpenCV
  • 如何使用OpenCV的parallel_for_并行化你的代码

    英文链接 xff1a How to use the OpenCV parallel for to parallelize your code 文章目录 目的先决条件简单的示例 绘制曼德尔布罗特集 xff08 Mandelbrot set x
  • 摇杆滑块机构运动模型

    clc span class token punctuation span close all span class token punctuation span r1为杆1的长度 xff0c r2为杆2的长度 xff0c d为偏置距离 r
  • 广义逆矩阵A+:行列满秩法和奇异值分解法

    奇异值的物理意义是什么 xff1f 广义逆矩阵A 43 SVD 矩阵奇异值分解 原理与几何意义 SVD xff08 奇异值分解 xff09 小结 超定方程 最小二乘解 奇异值分解 xff08 SVD xff09 A span class t
  • MQ-2烟雾浓度传感器

    文章目录 一 模块简介二 工作原理三 程序设计 本实验将采集到的传感器数据利用ADC转换 xff0c 将转换后的电压值显示在串口调试助手上 一 模块简介 MQ 2烟雾传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡 SnO2 当烟雾
  • git基础操作

    在 Windows 系统中可以安装 Git for Windows 客户端 xff1a span class token string 39 把当前所在目录变成一个本地仓库 39 span span class token function
  • git分支操作

    span class token string 39 每次提交都要手动输入用户名和密码 xff0c 若想避免这些麻烦 xff0c 可以在系统中创建 SSH 公私钥 xff0c 并将公钥放到 GitHub 指定位置 如此操作即可生成 GitH

随机推荐

  • shape_match

    使用OpenCV的dnn模块实时目标检测 非极大值抑制 xff08 Non Maximum Suppression xff0c NMS xff09 NMS 非极大值抑制 span class token comment test cpp s
  • C#基础语法

    Console span class token punctuation span span class token function Write span span class token punctuation span span cl
  • C# 类&对象

    输入行 xff1a span class token comment 将从控制台输入的值转换成int类型 span span class token keyword int span num span class token operato
  • C# string字符串详解

    字符串常用成员 xff1a span class token keyword string span str span class token operator 61 span Console span class token punctu
  • C#数组详解

    span class token comment 在 C 中 xff0c 将方括号放在标识符后是不合法的语法 span span class token keyword int span span class token punctuati
  • C#继承和派生

    用户在程序中会遇到 this 和 base 关键字 xff0c this 关键字代表的是当前类的对象 xff0c 而 base 关键字代表的是父类中的对象 方法隐藏和重写方法有区别吗 xff1f span class token keywo
  • C#快速入门教程

    此C 快速入门教程仅记录本人所认为的重点以及方便查阅的知识点 xff1b 系统学习请参考C语言中文网 xff08 C 教程 xff1a C 入门经典教程 xff0c 值得收藏 xff09 C 语言是微软推出的一款面向对象的编程语言 xff0
  • 2020-08-16大疆嵌入式笔试编程题:求两个不重叠连续子串的最大和

    描述 从输入数组中找出两个连续子串 xff0c 并且使这 两个连续字串和 之间的和最大 输入 xff1a 1 1 2 2 3 3 4 4 5 5 输出 xff1a 13 即 2 2 3 3 4 和 5 的和 xff08 8 43 5 61
  • Linux下安装和配置ARM交叉编译器

    本篇为基于Linux Ubuntu20 04下配置安装ARM交叉编译器 xff0c arm linux gcc交叉编译器 云盘链接放置文章底部 xff0c 有需要可自提 1 第一步 在windows下载arm linux gcc压缩包 xf
  • C#集合

    文章目录 C 集合简介C ArrayList类 xff1a 动态数组C Queue类 xff1a 队列C Stack类 xff1a 堆栈C Hashtable类 xff1a 哈希表 xff08 散列表 xff09 C SortedList类
  • C#泛型

    文章目录 C 泛型简介C 可空类型 xff1a NullableC 泛型方法的定义及使用C 泛型类的定义及使用C 泛型集合定义及使用C IComparable IComparer接口 xff1a 比较两个对象的值 泛型是在 System C
  • C#文件操作

    在前面操作变量和常量时这些值都是存放到内存中的 xff0c 当程序运行结束后使用的数据全部被删除 若需要长久保存应用程序中的数据 xff0c 可以选用文件或数据库来存储 文件通常存放到计算机磁盘上的指定位置 xff0c 可以是记事本 Wor
  • C#委托和事件

    C 语言中的委托和事件是其一大特色 xff0c 委托和事件在 Windows 窗体应用程序 ASP NET 应用程序 WPF 应用程序等应用中是最为普遍的应用 通过定义委托和事件可以方便方法重用 xff0c 并提高程序的编写效率 C 中的委
  • C#异常与调试

    在 C 语言中 xff0c 异常也称为运行时异常 xff0c 它是在程序运行过程中出现的错误 对于异常的处理需要程序员积累经验 xff0c 在可能出现异常的位置加入异常处理语句 C Exception xff1a 异常类 NET Frame
  • C#进程与线程

    在操作系统中 xff0c 每运行一个程序都会开启一个进程 xff0c 一个进程由多个线程构成 线程是程序执行流中最小的单元 在应用程序中分为单线程程序和多线程程序 单线程程序是指在一个进程空间中只有一个线程在执行 xff1b 多线程程序是指
  • WPF入门

    文章目录 WPF概述WPF简介WPF 开发环境搭建XAML语言介绍 WPF常用控件WPF常用控件分类及介绍WPF文本类型控件WPF内容控件 WPF概述 WPF简介 Windows Presentation Foundation 新一代图形用
  • 2020-08-20网易互娱一面

    1 a b两数组均升序排列 将b数组所有成员融合到a数组里面 xff08 a数组足够大 xff09 维持两个指针 xff0c 从后往前比较 2 最小生成树 3 判断栈的输出顺序 其他 线程进程 TCP UDP Linux命令
  • 2020-08-20商汤科技笔试A卷

    文章目录 1 查找 Good 字符串2 最长上升子序列 xff0c leetcode原题 3 求删除区间的最小个数 xff0c 可以使得删除后剩下的区间彼此不重叠 1 查找 Good 字符串 题目描述 给定一个字符串 xff0c 在字符串中
  • 使用一组坐标信息拟合圆(matlab)

    详细原理参考MATLAB圆拟合 圆拟合 function span class token punctuation span xc span class token punctuation span yc span class token
  • BH1750( GY-302 )光照传感器

    文章目录 一 产品简介二 IIC通信三 BH1750的使用四 程序源码 这里我先简单的介绍一下BH1750光照传感器模块的基本信息 不多废话 xff0c 我将着重讲解它的使用部分 xff0c 相信对于屏幕前的你也是更关心它是怎么使用的 xf