0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32+BH1750光敏传感器获取光照强度

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-03-25 09:26 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、环境介绍

MCU:STM32F103ZET6

光敏传感器:BH1750数字传感器(IIC接口)

开发软件:Keil5

代码说明:使用IIC模拟时序驱动,方便移植到其他平台,采集的光照度比较灵敏. 合成的光照度返回值范围是 0~255。 0表示全黑 255表示很亮。

实测: 手机闪光灯照着的状态返回值是245左右,手捂着的状态返回值是10左右.

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

二、BH1750介绍

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

三、核心代码

BH1750说明: ADDR引脚接地,地址就是0x46

完整工程代码下载:https://download.csdn.net/download/xiaolong1126626497/18500653

3.1 iic.c

#include "iic.h"

/*
函数功能:IIC接口初始化
硬件连接:
SDA:PB7
SCL:PB6
*/
void IIC_Init(void)
{
	RCC->APB2ENR|=1<<3;//PB
	GPIOB->CRL&=0x00FFFFFF;
	GPIOB->CRL|=0x33000000;
	GPIOB->ODR|=0x3<<6;
}

/*
函数功能:IIC总线起始信号
*/
void IIC_Start(void)
{
		IIC_SDA_OUTMODE(); //初始化SDA为输出模式
		IIC_SDA_OUT=1; 		 //数据线拉高
		IIC_SCL=1;     		 //时钟线拉高
		DelayUs(4);        //电平保持时间
		IIC_SDA_OUT=0; 		 //数据线拉低
		DelayUs(4);        //电平保持时间
		IIC_SCL=0;     		 //时钟线拉低
}


/*
函数功能:IIC总线停止信号
*/
void IIC_Stop(void)
{
		IIC_SDA_OUTMODE(); //初始化SDA为输出模式
		IIC_SDA_OUT=0; 		 //数据线拉低
		IIC_SCL=0;     		 //时钟线拉低
		DelayUs(4);        //电平保持时间
		IIC_SCL=1;     		 //时钟线拉高
		DelayUs(4);        //电平保持时间
		IIC_SDA_OUT=1; 		 //数据线拉高
}

/*
函数功能:获取应答信号
返 回 值:1表示失败,0表示成功
*/
u8 IIC_GetACK(void)
{
		u8 cnt=0;
		IIC_SDA_INPUTMODE();//初始化SDA为输入模式
		IIC_SDA_OUT=1; 		  //数据线上拉
	  DelayUs(2);         //电平保持时间
		IIC_SCL=0;     		  //时钟线拉低,告诉从机,主机需要数据
		DelayUs(2);         //电平保持时间,等待从机发送数据
	  IIC_SCL=1;     		  //时钟线拉高,告诉从机,主机现在开始读取数据
		while(IIC_SDA_IN)   //等待从机应答信号
		{
				cnt++;
				if(cnt>250)return 1;
		}
		IIC_SCL=0;     		  //时钟线拉低,告诉从机,主机需要数据
		return 0;
}

/*
函数功能:主机向从机发送应答信号
函数形参:0表示应答,1表示非应答
*/
void IIC_SendACK(u8 stat)
{
		IIC_SDA_OUTMODE(); //初始化SDA为输出模式
		IIC_SCL=0;     		 //时钟线拉低,告诉从机,主机需要发送数据
		if(stat)IIC_SDA_OUT=1; //数据线拉高,发送非应答信号
		else IIC_SDA_OUT=0; 	 //数据线拉低,发送应答信号
		DelayUs(2);            //电平保持时间,等待时钟线稳定
		IIC_SCL=1;     		     //时钟线拉高,告诉从机,主机数据发送完毕
		DelayUs(2);            //电平保持时间,等待从机接收数据
		IIC_SCL=0;     		  	 //时钟线拉低,告诉从机,主机需要数据
}


/*
函数功能:IIC发送1个字节数据
函数形参:将要发送的数据
*/
void IIC_WriteOneByteData(u8 data)
{
		u8 i;
		IIC_SDA_OUTMODE(); //初始化SDA为输出模式
		IIC_SCL=0;     		 //时钟线拉低,告诉从机,主机需要发送数据
		for(i=0;i<8;i++)
		{
				if(data&0x80)IIC_SDA_OUT=1; //数据线拉高,发送1
				else IIC_SDA_OUT=0; 	 //数据线拉低,发送0
				IIC_SCL=1;     		     //时钟线拉高,告诉从机,主机数据发送完毕
				DelayUs(2);            //电平保持时间,等待从机接收数据
				IIC_SCL=0;     		 		 //时钟线拉低,告诉从机,主机需要发送数据
				DelayUs(2);            //电平保持时间,等待时钟线稳定
				data<<=1;              //先发高位
		}
}


/*
函数功能:IIC接收1个字节数据
返 回 值:收到的数据
*/
u8 IIC_ReadOneByteData(void)
{
		u8 i,data;
		IIC_SDA_INPUTMODE();//初始化SDA为输入模式
	  for(i=0;i<8;i++)
	  {
			 	IIC_SCL=0;     		  //时钟线拉低,告诉从机,主机需要数据
				DelayUs(2);         //电平保持时间,等待从机发送数据
				IIC_SCL=1;     		  //时钟线拉高,告诉从机,主机现在正在读取数据
				data<<=1;           
				if(IIC_SDA_IN)data|=0x01;
				DelayUs(2);         //电平保持时间,等待时钟线稳定
	  }
		IIC_SCL=0;     		  		//时钟线拉低,告诉从机,主机需要数据 (必须拉低,否则将会识别为停止信号)
		return data;
}


poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.2 iic.h

#ifndef _IIC_H
#define _IIC_H
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#define IIC_SDA_OUTMODE() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=0x30000000;}
#define IIC_SDA_INPUTMODE() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=0x80000000;}
#define IIC_SDA_OUT PBout(7)  //数据线输出
#define IIC_SDA_IN PBin(7)  //数据线输入
#define IIC_SCL PBout(6)  //时钟线

void IIC_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
u8 IIC_GetACK(void);
void IIC_SendACK(u8 stat);
void IIC_WriteOneByteData(u8 data);
u8 IIC_ReadOneByteData(void);
#endif

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.3 BH1750.h

#ifndef _BH1750_H
#define _BH1750_H
#include "delay.h"
#include "iic.h"
#include "usart.h"
u8 Read_BH1750_Data(void);
#endif
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.4 BH1750.c

#include "bh1750.h"
u8 Read_BH1750_Data()
{
    unsigned char t0;
    unsigned char t1;
    unsigned char t;
    u8 r_s=0;
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:1\r\n");
    IIC_WriteOneByteData(0x01);
    r_s=IIC_GetACK();//获取应答
     if(r_s)printf("error:2\r\n");
    IIC_Stop(); //停止信号 
    
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:3\r\n");
    IIC_WriteOneByteData(0x01);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:4\r\n");
    IIC_Stop(); //停止信号 
    
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:5\r\n");
    IIC_WriteOneByteData(0x10);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:6\r\n");
    IIC_Stop(); //停止信号 
    
    DelayMs(300); //等待
    
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x47);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:7\r\n");
    
    t0=IIC_ReadOneByteData(); //接收数据
    IIC_SendACK(0); //发送应答信号
    t1=IIC_ReadOneByteData(); //接收数据
    IIC_SendACK(1); //发送非应答信号
    IIC_Stop(); //停止信号
    
     t=(((t0<<8)|t1)/1.2);
     return t;  
}

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.5 main.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "at24c02.h"
#include "bh1750.h"

int main()
{
	u8 val;
	LED_Init();
	BEEP_Init();
	KeyInit();
  USARTx_Init(USART1,72,115200);
  IIC_Init();
  
	while(1)
	{
		val=KeyScan();
		if(val)
		{
            val=Read_BH1750_Data();
            printf("光照强度=%d\r\n",val);
//			 BEEP=!BEEP;
			 LED0=!LED0;
			 LED1=!LED1;
		}
	}
}

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.6 运行效果图

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2577

    文章

    55478

    浏览量

    793821
  • STM32
    +关注

    关注

    2313

    文章

    11189

    浏览量

    374571
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【RA-Eco-RA4M2开发板评测】+ 光照强度检测

    BH1750是用于I2C总线接口的数字环境光传感器IC。该集成电路适合于获取环境光数据,用于调整手机液晶屏和键盘背光功率,在高分辨率下,其检测范围可达1-655351x。 其之所以具有如此的精度
    发表于 04-22 00:18

    【飞凌嵌入式RV1126B开发板】+双通道传感器检测及数据曲线绘制

    有10K上拉电阻,使电位上拉至1.8V。 图1接口P17 对通道SARADC0_IN0进行检测的指令为: 为进行温度和光照强度的检测,可使用相应的模块来简化电路连接,该模块的电路如图2所示。 在使用时
    发表于 03-24 10:54

    昉·星光开发板方案:昉·星光开发板光敏传感器之光强度数据读取

    ,用于帮助开发板读取光敏传感器的模拟输出信息,从而火照光照强度数值。 在这个光敏传感器顶部,有一个光敏
    发表于 03-18 06:19

    昉·星光开发板火焰传感器探测火光

    类似,在这个火焰传感器顶部,有一个光敏电阻,由于光电效应,光照愈强,阻值就愈低,随着光照强度的升高,电阻值迅速降低。反之,输出低电平信号。随着电阻值的变化,其模拟输出口AO的电压信号也
    发表于 03-16 06:48

    在 VisionFive 2 上使用光敏传感器读取光强度数据

    sensor: 4. 总结 在这个演示中,我们学习了如何读取光敏传感器的AO信号。 通过光敏传感器获取当前环境光
    发表于 03-11 07:03

    在 VisionFive 2 上使用光敏传感器

    SBC 本身没有 ADC 模块,因此本演示主要解释 DO 输出的使用。未来,我们将与外部ADC模块合作,通过AO输出获得光的强度值。 在感光传感器的顶部,有一个光敏电阻。由于光电效应,光越强,电阻值越低
    发表于 03-11 06:23

    OPT4003-Q1:高性能数字环境光传感器的深度解析

    OPT4003-Q1:高性能数字环境光传感器的深度解析 在电子设备的设计中,环境光传感器扮演着至关重要的角色,它能感知周围环境的光照强度,为设备提供智能化的光照调节功能。今天我们要深入
    的头像 发表于 02-11 10:35 265次阅读

    海绵拉伸撕裂强度试验机中传感器的电子信号处理技术

    在海绵拉伸撕裂强度试验机中,传感器电子信号处理技术至关重要。 在海绵拉伸撕裂强度试验机的检测系统中,传感器是捕捉力学信号的“前端感知”,电
    的头像 发表于 09-05 09:40 693次阅读

    超强感光,即时检测!高精度光照传感器赋能纳祥科技迷你照度计方案

    覆盖,采样率达2次/秒,无需复杂调试即可瞬时检测,很好地平衡性能与能耗。方案概述本方案通过高精度光电传感器捕捉环境光照强度,经单片机实时校准处理,驱动LED屏直观
    的头像 发表于 09-02 15:41 636次阅读
    超强感光,即时检测!高精度<b class='flag-5'>光照</b><b class='flag-5'>传感器</b>赋能纳祥科技迷你照度计方案

    【RA-Eco-RA6M4开发板评测】用I2C实现光照强度的检测和显示

    这个项目我们利用瑞萨的RA6M4的I2C控制功能实现光照传感器BH1750光照测试,并进行屏幕显示。 为了方便进行光照强度的检测,所有的引
    发表于 08-26 22:05

    领麦微红外测温传感器:重塑3D光敏打印的温控革命

    需求。领麦微红外测温传感器凭借其快速响应、高精度、非接触式测温及算法定制能力,正成为新一代光敏3D打印机的“温控中枢”,推动行业向智能化、高效化方向迈进。一、毫秒
    的头像 发表于 08-13 15:03 1005次阅读
    领麦微红外测温<b class='flag-5'>传感器</b>:重塑3D<b class='flag-5'>光敏</b>打印的温控革命

    数字16位串行输出型环境光传感器IC BH1750FVI数据手册

    BH1750FVI数据手册
    发表于 08-09 16:04 0次下载

    二氧化碳温湿度光照传感器:四合一,在线监测气体

    二氧化碳温湿度光照传感器是一种多功能环境监测设备,集成了测量二氧化碳浓度(CO₂)、空气温度及光照强度(照度)四种关键环境参数的功能于一体。通过内置的多类型传感器元件,实现对环境条件
    的头像 发表于 07-15 17:21 908次阅读

    【沁恒CH585开发板免费试用体验】+光照传感器及其检测

    光照传感器在对环境的光线情况的检测中起着重要的作用,这里所采用的是数字式光照传感器BH1750,它具有集成度高和检测精度高的特点。 该
    发表于 07-06 00:08

    急急急在线等

    求一张stm32物联网智能家居环境监测系统总电路图,含DHT11,BH1750,MQ-2烟雾传感器,OLED显示屏,声光报警,ESP8266等
    发表于 04-28 23:20