简介
对前面几篇整合, 做个小小汇总试验, 使用BearPi E53_SC1扩展板
主芯片: STM32L431RCT6
串口: Usart1
扩展板与主板连接:
I2C : I2C1 (光照强度传感器:BH1750)
LED: PB9
步骤
-
创建项目
-
初始化Usart1
参考 BearPi Std 板从入门到放弃 - 引气入体篇(4)(Usart 中断接收), 但不需要启用中断, 直接添加fputc函数可以使用printf打印信息到串口即可, 参考 BearPi Std 板从入门到放弃 - 引气入体篇(5)(printf打印到串口)
-
I2C1 初始化
-
初始化 LED灯 PB8
方法如 步骤1, 推挽输出、不上拉下拉、标签名为E53_SC1_LED即可, 其电路原理图如下, LED_SW为输入, D1为LED灯
-
最终创建项目
STM32CubeMX勾选项目生成为按照功能的不同.c/.h, 参考 STM32CubeMX 一些配置
-
添加用户代码
main.c
c
typedef enum
{
OFF,
ON
}Smart_City_Status;
#define LUMINOSITY_THRESHOLD 50 // 光照阈值, 小于此亮度则亮灯
void BH1750Init(void)
{
uint8_t temp = 0x11; // 连续 H分辨率模式2
HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDRESS, &temp, 1, 0xff);
HAL_Delay(180); // 数据手册内部写完最长等待180ms才能读
}
float ReadBH1750(void)
{
float lux = 0.0;
uint8_t temp[2];
HAL_I2C_Master_Receive(&hi2c1, BH1750_READ, temp, 2, 0xff);
lux = (float) ( ((temp[0]<<8) + temp[1]) / 1.2 );
return lux;
}
void Smart_City_Light_Set(Smart_City_Status status)
{
if (ON == status)
{
HAL_GPIO_WritePin(E53_SC1_LED_GPIO_Port, E53_SC1_LED_Pin, GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(E53_SC1_LED_GPIO_Port, E53_SC1_LED_Pin, GPIO_PIN_RESET);
}
}
int main(void )
{
float lux = 0.0;
...
BH1750Init(); // BH1750 初始化
while (1)
{
HAL_Delay(1000); // 1s 延时
lux = ReadBH1750(); // 读取光照强度值
Smart_City_Light_Set(lux <= LUMINOSITY_THRESHOLD ? ON : OFF); // Smart_City_Light_Set(lux >= LUMINOSITY_THRESHOLD);
printf("current Lux: %f\r\n", lux);
}
...
}
usart.h
c
/* USER CODE BEGIN Header */
#include "stdio.h"
/* USER CODE END Header */
/* USER CODE BEGIN 0 */
int fputc(int ch, FILE *f)
{
uint8_t temp[1] = {ch};
HAL_UART_Transmit(&huart1, temp, 1, 2);
return HAL_OK;
}
/* USER CODE END 0 */
前言后讲
BH1750介绍
1.BH1750 测量步骤
如图所示
(1) 在电路连接正常情况下, 可以直接发送测量指令
(2) 一次测量方式后会自动断电
(3) 连续测试则需要下发指令进行断电
2.BH1750 指令
3.BH1750 测量模式说明
4.BH1750 各种测量时序示例
(1)ADDR 为低电平示例(包含计算)
(2)ADDR 为高电平示例(包含计算)
- 本次扩展板BH1750电路图
综上:
-
ADDR 是 低电平
-
写完读模式之后最大等待时间是180ms, 写完或读前需要延时180ms
-
连续读模式 除非写断电, 否则会进行一次采集...
-
亮度计算公式 = (((高8位)<<8) + (低八位))/1.2
Note:
Keil中Download Flash完需要复位才能执行最新的程序, 参考 BearPi Std 板从入门到放弃 - 丹道心得 (问题收集),烧写完直接复位即可