簡介
對前面幾篇整合, 做個小小匯總試驗, 使用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 完整工程代碼