简介
对前面几篇整合, 做个小小汇总试验, 使用BearPi E53_SC1扩展板主芯片: STM32L431RCT6串口: Usart1扩展板与主板连接: I2C : I2C1 (光照强度传感器:BH1750)LED: PB9
步骤
-
创建项目
参考 BearPi Std 板从入门到放弃 - 引气入体篇(1)(由零创建工程到点亮LED) -
初始化Usart1
参考 BearPi Std 板从入门到放弃 - 引气入体篇(4)(Usart 中断接收), 但不需要启用中断, 直接添加fputc函数可以使用printf打印信息到串口即可, 参考 BearPi Std 板从入门到放弃 - 引气入体篇(5)(printf打印到串口) -
I2C1 初始化
参考 BearPi Std 板从入门到放弃 - 后天篇(1)(I2C1 读取 光照强度) -
初始化 LED灯 PB8
方法如 步骤1, 推挽输出、不上拉下拉、标签名为E53_SC1_LED即可, 其电路原理图如下, LED_SW为输入, D1为LED灯
-
最终创建项目
STM32CubeMX勾选项目生成为按照功能的不同.c/.h, 参考 STM32CubeMX 一些配置 -
添加用户代码
main.c
typedef enum
{OFF,ON
}Smart_City_Status; #define LUMINOSITY_THRESHOLD 50 // 光照阈值, 小于此亮度则亮灯void BH1750Init(void)
{uint8_t temp = 0x11; // 连续 H分辨率模式2HAL_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
/* 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 为高电平示例(包含计算)
5. 本次扩展板BH1750电路图
综上:
1. ADDR 是 低电平
2. 写完读模式之后最大等待时间是180ms, 写完或读前需要延时180ms
3. 连续读模式 除非写断电, 否则会进行一次采集…
4. 亮度计算公式 = (((高8位)<<8) + (低八位))/1.2
Note:
Keil中Download Flash完需要复位才能执行最新的程序, 参考 BearPi Std 板从入门到放弃 - 丹道心得 (问题收集),烧写完直接复位即可
BearPi_Smart_City 完整工程代码