Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >STM32+BH1750光敏传感器获取光照强度

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

作者头像
DS小龙哥
发布于 2022-01-17 07:33:59
发布于 2022-01-17 07:33:59
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

一、环境介绍

MCU: STM32F103ZET6

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

开发软件: Keil5

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

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

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

二、BH1750介绍

三、核心代码

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

3.1 iic.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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;
}

3.2 iic.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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

3.3 BH1750.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef _BH1750_H
#define _BH1750_H
#include "delay.h"
#include "iic.h"
#include "usart.h"
u8 Read_BH1750_Data(void);
#endif

3.4 BH1750.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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;  
}

3.5 main.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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;
		}
	}
}

3.6 运行效果图

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/05/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
STM32入门开发: 介绍IIC总线、读写AT24C02(EEPROM)(采用模拟时序)
IIC总线: STM32本身支持IIC硬件时序的,本文采用的是模拟时序,下篇文章就介绍配置STM32的IIC硬件时序读写AT24C02和AT24C08。
DS小龙哥
2022/01/12
2K0
STM32入门开发: 介绍IIC总线、读写AT24C02(EEPROM)(采用模拟时序)
从IIC实测波形入手,搞懂IIC通信
玩单片机的朋友都知道IIC通信这个工具,但好多人只是会用,内部的原理不求甚解,或是想要了解其原理,但却对抽象的时序描述一头雾水。本文将从实测的IIC波形入手,带你看到真实的IIC样子,进而去理解IIC的通信原理。
xxpcb
2020/08/04
4.5K0
三大通信协议(二):IIC通信协议
主设备和从设备进行数据传输时遵循以下协议格式。 数据通过一条SDA数据线在主设备和从设备之间传输0和1的串行数据。串行数据序列的结构可以分为,开始条件,地址位,读写位,应答位,数据位,停止条件,具体如下所示;
全栈程序员站长
2022/08/22
1.9K0
三大通信协议(二):IIC通信协议
IIC通信协议详解
IIC:两线式串行总线,它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。
全栈程序员站长
2022/06/29
2.9K0
IIC通信协议详解
IIC通信协议,搞懂这篇就够了
I2C(IIC)属于两线式串行总线,由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线,属于一主多从(一个主设备(Master),多个从设备(Slave))的总线结构,总线上的每个设备都有一个特定的设备地址,以区分同一I2C总线上的其他设备。
混说Linux
2022/07/14
6.9K0
IIC通信协议,搞懂这篇就够了
STM32通信模拟 I2C
I²C(Inter-Integrated Circuit),常读作“I方C”,它是一种多主从架构串行通信总线。在1980年由飞利浦公司设计,用于让主板、嵌入式系统或手机连接低速周边设备。如今在嵌入式领域是非常常见通信协议,常用于MPU/MCU与外部设备连接通信、数据传输。
韦东山
2022/05/09
1.1K0
STM32通信模拟 I2C
STM32控制max30102读取血氧心率数据(keil5工程)
MAX30102是一款由Maxim Integrated推出的低功耗、高精度的心率和血氧饱和度检测传感器模块,适用于可穿戴设备如智能手环、智能手表等健康管理类电子产品。
DS小龙哥
2024/05/24
1K0
STM32控制max30102读取血氧心率数据(keil5工程)
STM32+MPU6050设计便携式Mini桌面时钟(自动调整时间显示方向)
完整项目源码下载地址: https://download.csdn.net/download/xiaolong1126626497/18657534
DS小龙哥
2022/01/17
1.1K0
STM32+MPU6050设计便携式Mini桌面时钟(自动调整时间显示方向)
BH1750光照传感器超详细攻略(从原理到代码讲解,看完你就懂了)
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说BH1750光照传感器超详细攻略(从原理到代码讲解,看完你就懂了),希望能够帮助大家进步!!!
Java架构师必看
2022/08/09
1.9K0
BH1750光照传感器超详细攻略(从原理到代码讲解,看完你就懂了)
STM32快速读写AT24C16 代码 模拟I2C
本帖只适用AT24C16及以下的芯片,AT24C32及以上的芯片读写方式不一样,故不适用!!!
知否知否应是绿肥红瘦
2025/02/19
1650
STM32快速读写AT24C16 代码 模拟I2C
4.8 51单片机-PCF8591(ADC/DAC)转换芯片
通过原理图得到的重要信息: PCF8591芯片地址线全部接GND。也就是当前模块的地址固定为: 1001000
DS小龙哥
2022/01/10
3.7K0
4.8 51单片机-PCF8591(ADC/DAC)转换芯片
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
IIC总线: STM32本身支持IIC硬件时序的,上篇文章已经介绍了采用IIC模拟时序读写AT24C02,这篇文章介绍STM32的硬件IIC配置方法,并读写AT24C08。
DS小龙哥
2022/01/12
2.2K0
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
【SG90模拟舵机控制及PCA9685模块的使用】[通俗易懂]
网上不乏对此种舵机的介绍,比如下面这篇文章: 浅谈用单片机控制SG90舵机(原理+编程)
全栈程序员站长
2022/11/03
2.8K0
MPU9250传感器
MPU9250 内部包括 3 轴陀螺仪、3 轴加速度计和 3 轴磁力计,这3个功能输出都是 16 位的数字量; 可以通过常用的数据总线( IIC) 接口和单片机进行数据交互,传输速率 400 kHz /s。陀螺仪的角速度测量范围±2000(° /s),具有良好的动态响应特性。加速度计的测量范围最大为±16g( g 为重力加速度),静态测量精度高。磁力计采用高灵度霍尔型传感器进行数据采集,磁感应强度测量范围为±4800μT,可用于对偏航角的辅助测量。 MPU9250 自带的数字运动处理器DMP硬件加速引擎,可以整合九轴传感器数据,向应用端输出完整的 9 轴融合演算数据。 有了 DMP,我们可以使用运动处理库非常方便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度。
全栈程序员站长
2022/07/23
1.8K0
MPU9250传感器
STM32 BMP280模块 获取气压温度高度传感器数据
BMP280是博世最新推出的数字气压传感器,具有卓越的性能和低廉的价格,相对精度为±0.12 hPa(相当于±1米),传感器功耗仅有2.7μA,包括压力和温度测量功能。
CoderEnd
2023/05/07
9400
STM32 BMP280模块 获取气压温度高度传感器数据
开发者成长激励计划-基于TencentOS Tiny 的智慧路灯
从github上下载官方的Tencent OS Tiny 例程。CH32V-RISC-V物联网操作系统TencentOS-Tiny案例实践指南。
秦玉安
2022/08/02
7081
51单片机IIC通信协议
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135301.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/05
3170
MSP430F5529LP IIC与OLED的HELLOWRLD
简单理解下什么是IIC I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场
Pulsar-V
2018/04/18
1.3K1
MSP430F5529LP IIC与OLED的HELLOWRLD
基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP
(安装包下载:https://download.csdn.net/download/xiaolong1126626497/19732120)
DS小龙哥
2022/01/21
1.6K0
基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP
4.6 51单片机-EEPROM存储芯片(AT24C02)
实验板上的EEPROM型号是AT24C02N,通信接口是IIC,接在单片机的P2.1(SCL)和P2.2(SDA) 口上。
DS小龙哥
2022/01/10
2.7K0
4.6 51单片机-EEPROM存储芯片(AT24C02)
推荐阅读
相关推荐
STM32入门开发: 介绍IIC总线、读写AT24C02(EEPROM)(采用模拟时序)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验