BH1750光照传感器

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

2、传感器特点:

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

3、测量程序步骤:

BH1750光照传感器_第1张图片

4、指令集合结构:

BH1750光照传感器_第2张图片

5、测量模式说明:

BH1750光照传感器_第3张图片

6、

测量流程如下(连续H分辨率模式):

BH1750光照传感器_第4张图片

  1. 发送设备地址(写)并等待ACK,发送高分辨率测量指令,等待ACK,停止时序。
  2. 等待传感器第一次测量完成。
  3. 读取测量结果。发送设备地址(读),读取高字节和低字节数据,等待ACK,停止时序。

测量结果为2字节(高字节High Byte和低字节Low Byte)数据,计算公式为:

                                                  光照强度(单位lx)=(High Byte  + Low Byte)/ 1.2 * 测量精度

7、 Sensor_Light.c程序

#include "sensor_light.h"
#include "bsp_soft_i2c.h" 
#include "bsp_systick.h"

// 写传感器函数
bool BH1750_Write(uint8_t SlaveAddress, uint8_t REG_Address)
{
    if(!I2C2_Start())		return false;
    I2C2_Send_Byte(SlaveAddress);
    if(!I2C2_Wait_Ack()) { I2C2_Stop();	return false;	}
    I2C2_Send_Byte(REG_Address);
    if(!I2C2_Wait_Ack()) { I2C2_Stop();	return false;	}
    if(!I2C2_Stop()) return false;
    return true;
}

// 读传感器函数
bool BH1750_Read(uint8_t SlaveAddress, uint8_t* buf, uint8_t len)
{
    if(!I2C2_Start())	return false;
    I2C2_Send_Byte(SlaveAddress | 1);
    if(!I2C2_Wait_Ack()) { I2C2_Stop();	return false;	}
    for(uint16_t i=0; i

7、Sensor_Light.h程序

#ifndef _SENSOR_LIGHT_H_
#define _SENSOR_LIGHT_H_

#include "stm32f0xx.h"

#define	  BH1750_SlaveAddress   0x46 // 设备地址
#define   BS1750_DOWN           0x00 // 断电指令
#define   BH1750_ON   		0x01 // 通电指令
#define   BH1750_RSET     	0x07 // 重置指令
#define	  BH1750_CON_H  	0x10 // 连续高分辨率模式,1lx,120ms
#define	  BH1750_CON_H2  	0x11 // 连续高分辨率模式,0.5lx,120ms
#define	  BH1750_CON_L  	0x13 // 连续低分辨率模式,4lx,16ms
#define   BH1750_ONE_H  	0x20 // 一次高分辨率模式,1lx,120ms
#define   BH1750_ONE_H2		0x21 // 一次高分辨率模式,0.5lx,120ms
#define	  BH1750_ONE_L 		0x23 // 一次低分辨率模式,4lx,16ms

#define  RESOLUTION  BH1750_CON_H2 // 连续高分辨率模式,0.5lx

#if RESOLUTION == BH1750_CON_H || RESOLUTION == BH1750_ONE_H
    #define SCALE_INTERVAL 1
#elif RESOLUTION == BH1750_CON_H2 || RESOLUTION == BH1750_ONE_H2
    #define SCALE_INTERVAL 0.5f
#elif	RESOLUTION == BH1750_CON_L || RESOLUTION == BH1750_ONE_L
    #define SCALE_INTERVAL 4
#endif

void BH1750_Init(void);
float BH1750_ReadData(void);

#endif


8、主函数程序:

int main()
{
    SYSTICK_Init(1); // 滴答定时器初始化
    I2C2_Soft_Init();	// IIC初始化
    USART1_Init(); // 串口初始化
    BH1750_Init();
    SYSTICK_DelayMs(180);
	
    while(1)
    {
	printf("Light is : %flx\r\n",	BH1750_ReadData());
	SYSTICK_DelayMs(120);
    }
}

I2C通讯请参考:https://blog.csdn.net/qq_41422043/article/details/99688493

参考资料:https://wenku.baidu.com/view/57203d05856a561252d36ff6.html

你可能感兴趣的:(传感器开发)