一、BH1750FVI是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路能够根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率能够探测较大范围的光强度变化。html
二、传感器特色:函数
三、测量程序步骤:ui
四、指令集合结构:.net
五、测量模式说明:3d
六、code
测量流程以下(连续H分辨率模式):htm
测量结果为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