STM32HAL 快速入門(七):GPIO 輸入之光敏傳感器控制蜂鳴器
前言
大家好,這里是 Hello_Embed。上一篇我們用 GPIO 輸入模式實現了按鍵控制 LED,本篇將進階到 “光敏傳感器控制蜂鳴器”—— 通過讀取光敏傳感器的信號,實現 “環境變暗時 LED 點亮、蜂鳴器報警” 的聯動效果,進一步熟悉 GPIO 輸入與輸出的結合應用。下一篇我們會引入 “中斷” 的概念,讓 GPIO 響應更高效。
一、核心組件與原理
本次實戰涉及光敏傳感器模塊、有源蜂鳴器模塊,以及 STM32 的 GPIO 引腳,先了解各組件的工作原理。
1. 光敏傳感器模塊
- 使用說明:
- 電路圖:
- 核心芯片 LM393(比較器):
- 當 “+” 引腳電壓 > “-” 引腳電壓時,DO 端輸出高電平,模塊自帶 LED 熄滅;
- 當 “+” 引腳電壓 < “-” 引腳電壓時,DO 端輸出低電平,模塊自帶 LED 點亮。
- 光照與電壓的關系:
- 光照增強 → 光敏電阻阻值減小 → “+” 引腳電壓降低 → DO 輸出高電平(模塊 LED 滅);
- 光照減弱 → 光敏電阻阻值增大 → “+” 引腳電壓升高 → DO 輸出低電平(模塊 LED 亮)。
2. 有源蜂鳴器模塊
- 實物圖:
- 原理圖:
- 控制邏輯:通過 2 號 I/O 引腳控制,當 I/O 為低電平時,蜂鳴器發聲;高電平時,蜂鳴器不發聲。
二、硬件連接
按以下方式連接電路(與韋東山課程保持一致):
- 光敏傳感器:
- AO 腳(模擬輸出,本篇暫不用)接 PA3;
- DO 腳(數字輸出)接 PB11;
- 剩余兩腳分別接 GND 和 VCC。
- 蜂鳴器:
- I/O 控制腳接 PA8;
- 剩余兩腳分別接 GND 和 VCC。
- 系統板 LED:沿用 PC13(已配置為輸出)。
實物連接圖:
三、CubeMX 配置
- 引腳功能配置:
- PB11:GPIO_Input(讀取光敏傳感器 DO 信號);
- PA8:GPIO_Output(控制蜂鳴器);
- PC13:GPIO_Output(控制系統板 LED)。
- 生成工程(確保時鐘、調試模式等基礎配置正確)。
四、代碼實現:封裝函數與邏輯控制
為使代碼更清晰,我們封裝三個函數分別處理 “判斷環境亮度”“控制蜂鳴器”“控制 LED”,再在主循環中調用。
1. 函數封裝(在/* USER CODE BEGIN PV */
區域)
/* USER CODE BEGIN PV */
// 判斷環境是否變暗(光敏傳感器DO輸出高電平表示光照強,低電平表示光照弱)
static int Dark(void)
{// PB11為低電平時,返回1(暗);高電平時,返回0(亮)return (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11) == GPIO_PIN_RESET);
}// 控制蜂鳴器(on=1時發聲,on=0時不發聲)
static void BeepControl(int on)
{if (on)HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); // 低電平發聲elseHAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); // 高電平不發聲
}// 控制LED(on=1時點亮,on=0時熄滅)
static void LedControl(int on)
{if (on)HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // 低電平點亮elseHAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 高電平熄滅
}
/* USER CODE END PV */
2. 主循環邏輯(在while(1)
中)
while (1)
{/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if (Dark()) // 環境變暗{BeepControl(1); // 蜂鳴器發聲LedControl(1); // LED點亮}else // 環境變亮{BeepControl(0); // 蜂鳴器不發聲LedControl(0); // LED熄滅}/* USER CODE END 3 */
}
五、實驗結果
- 未遮擋光敏傳感器(光照強):
光敏傳感器模塊雙燈亮(DO 輸出低電平),PC13 LED 熄滅,蜂鳴器不發聲。 - 遮擋光敏傳感器(光照弱):
光敏傳感器模塊一燈滅(DO 輸出高電平),PC13 LED 點亮,蜂鳴器鳴叫。
結尾
本文通過 “光敏傳感器控制蜂鳴器和 LED”,進一步練習了 GPIO 輸入信號的讀取與輸出控制的結合,核心是通過封裝函數使邏輯更清晰。但這種 “循環查詢” 的方式效率較低 —— 如果需要同時處理多個任務,持續查詢某一引腳會占用大量 CPU 資源。
下一篇筆記,我們將學習 “GPIO 中斷”,讓引腳狀態變化時主動通知 CPU 處理,大幅提升響應效率。Hello_Embed 繼續帶你探索更高效的 GPIO 應用方式,敬請期待~