BH1750光照传感器

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

二、传感器特色:函数

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

三、测量程序步骤:ui

四、指令集合结构:.net

五、测量模式说明:3d

六、code

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

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

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

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

七、 Sensor_Light.c程序get

#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;
}

七、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

八、主函数程序:

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