BH1750光照传感器

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

2、传感器特点:

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

3、测量程序步骤:

4、指令集合结构:

5、测量模式说明:

6、

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

  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<len; i++)
    {
        buf[i] = I2C2_Read_Byte();
	if(i<len-1)
	{
	  I2C2_Ack();
	}
	}
    I2C2_NAck();
    if(!I2C2_Stop()) return false;
    return true;
}

// 对传感器进行初始化
void BH1750_Init(void)
{
    BH1750_Write(BH1750_SlaveAddress, BH1750_ON); // 通电
    BH1750_Write(BH1750_SlaveAddress, RESOLUTION); // 设置分辨率
}

// 从传感器获取数据
float BH1750_ReadData(void)
{
    uint8_t buf[2];	
    BH1750_Read(BH1750_SlaveAddress, buf, 2);	
    return (float)(((uint16_t)buf[0]<<8) + buf[1]) / 1.2f * SCALE_INTERVAL;
}

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值