STM32F1与STM32CubeIDE编程实例-BH1750环境光强度传感器驱动

BH1750环境光强度传感器驱动

1、BH1750介绍

BH1750是16位数字输出型,环境光强度传感器。主要应用有移动电话,液晶电视,笔记本电脑,便携式游戏机,数码相机,数码摄像机,汽车定位系统,液晶显示器。

在这里插入图片描述

BH1750具有如下特性:

  • I2C总线接口(f/s模式支持)
  • 光谱响应近似于人眼反应
  • 照度数字转换器
  • 宽范围和高分辨率。 ( 1 - 65535 lx )
  • 通过断电功能实现低电流
  • 50Hz / 60Hz 光噪声抑制功能
  • 1.8V 逻辑输入接口
  • 无需任何外部零件
  • 光源依赖性小。 (例如白炽灯、荧光灯、卤素灯、白光 LED、太阳灯)
  • 可以选择 2 种 I2C 从地址。
  • 光学窗口影响的可调测量结果(使用此功能可以检测最小 0.11 lx,最大 100000 lx。)
  • 小的测量变化 (+/- 20%)
  • 红外线的影响很小。

2、BH1750配置

关于STM32CubeIDE工程创建、配置请参考前面文章:

本次BH1750的配置如下:

在这里插入图片描述

3、BH1750驱动实现

BH1750的驱动非常简单,本次只实现读取BH1750的采样数据。其读取方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/\* Private macro -------------------------------------------------------------\*/
/\* USER CODE BEGIN PM \*/
#define BH1750\_ADDR (0x23)
#define BH1750\_MEM\_ADDR (0x23)
/\* USER CODE END PM \*/

/\* Private user code ---------------------------------------------------------\*/
/\* USER CODE BEGIN 0 \*/
static uint8\_t buffer[2] = { 0 };
float bh1750\_read(I2C_HandleTypeDef \*i2c) {
if (HAL\_I2C\_Mem\_Read(i2c, (BH1750_ADDR << 1), BH1750_MEM_ADDR, 1, buffer, 2,
1000) == HAL_OK) {
int32\_t data = buffer[0] << 8 | buffer[1];
return (float) data / 1.2;
}
printf("bh1750 read failed\r\n");
return -255.0;
}
/\* USER CODE END 0 \*/

最后实现BH1750环境光采样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
int main(void) {
/\* USER CODE BEGIN 1 \*/

/\* USER CODE END 1 \*/

/\* MCU Configuration--------------------------------------------------------\*/

/\* Reset of all peripherals, Initializes the Flash interface and the Systick. \*/
HAL\_Init();

/\* USER CODE BEGIN Init \*/

/\* USER CODE END Init \*/

/\* Configure the system clock \*/
SystemClock\_Config();

/\* USER CODE BEGIN SysInit \*/

/\* USER CODE END SysInit \*/

/\* Initialize all configured peripherals \*/
MX\_GPIO\_Init();
MX\_USART1\_UART\_Init();
MX\_I2C1\_Init();
/\* USER CODE BEGIN 2 \*/
// 判断BH1750设备是否就绪
if (!HAL\_I2C\_IsDeviceReady(&hi2c1, BH1750_ADDR, 2, 100)) {
printf("BH1750 not found\r\n");
while (1)
;
}
/\* USER CODE END 2 \*/

/\* Infinite loop \*/
/\* USER CODE BEGIN WHILE \*/
while (1) {
/\* USER CODE END WHILE \*/

/\* USER CODE BEGIN 3 \*/
float value = bh1750\_read(&hi2c1);
printf("bh1750 value = %.2f \r\n", value);
HAL\_Delay(200);
}
/\* USER CODE END 3 \*/
}


文章来源: https://iotsmart.blog.csdn.net/article/details/125868250