音频与麦克风 · 蜂鸣/提示音 · 有源蜂鸣器模块 + OLED · SKU 待确认
有源蜂鸣器模块 STM32F103 接线与代码(OLED 显示)
给单片机装一个「一拉低就响」的小喇叭:有源蜂鸣器模块自带振荡器,I/O 拉低就响、拉高就停,不需要 PWM、不需要定时器。本页是 STM32F103C8T6 + 有源蜂鸣器模块(低电平触发,3.3V 供电实测可响)+ 0.96 OLED 的完整实机验证记录:PB1 每 500ms 在响/停之间切换,OLED 大字显示 STATUS: ON/OFF,每完成一次「响→停」Count +1。含接线表、有源/无源区别(最容易买错的地方)、完整可编译代码和 PlatformIO 工程下载。特别提醒:本项目程序不走串口,串口监视器没有输出是正常的,状态全在 OLED 上。
Quick Facts
- 模块:有源蜂鸣器模块(低电平触发:I/O 拉低=响、拉高=停)
- SKU:待确认
- 接线:I/O→PB1、VCC→3.3V、GND→GND,共 3 根线(3.3V 供电实测可正常发声)
- 显示:0.96 寸 OLED,SSD1306,地址 0x3C,SCL=PB8 / SDA=PB9(U8g2 软件 I2C)
- 动作:PB1 每 500ms 切换 LOW/HIGH,
millis()非阻塞 - 计数:每完成一次「响 → 停」Count +1(约每秒 +1)
- 串口:本项目程序无串口输出,属正常设计,状态全在 OLED
Verified
实机验证结果
本项目实测 下面的结果全部来自我们自己的实机测试,更新于 2026-08-26。
实测动作与 OLED 表现
| 测试动作 | OLED / 蜂鸣器表现 |
|---|---|
| 刚上电 | OLED 显示 14 BUZZER / STATUS: OFF / Count: 0,蜂鸣器静音 |
| 前 500ms | PB1 拉低,STATUS 变 ON,蜂鸣器响 |
| 后 500ms | PB1 拉高,STATUS 变 OFF,蜂鸣器停,Count +1 |
| 持续运行 | 每 1 秒完成一轮「响 → 停」,Count 约每秒 +1,可无限循环 |
| 打开串口监视器 | 无输出——本项目程序不使用串口,属正常,不代表没烧进去 |
完整演示视频(动画 + 实拍)
OLED 两种状态特写
实测环境
| 项目 | 本项目实际使用 |
|---|---|
| 主控 | STM32F103C8T6(BluePill) |
| 模块 | 有源蜂鸣器模块(低电平触发,本项目接 3.3V) |
| 显示 | 0.96 寸 OLED,SSD1306,128×64,地址 0x3C |
| 开发工具 | VS Code + PlatformIO |
| 框架 | Arduino / STM32duino |
| 烧录 | ST-Link(SWD 四线) |
| OLED 驱动 | U8g2 软件 I2C(SCL=PB8 / SDA=PB9) |
| 依赖库 | olikraus/U8g2 |
What it does
这个模块干什么
有源蜂鸣器模块就是一块「一拉低就自己响」的小喇叭板:板上自带振荡电路和驱动三极管,单片机只需要一个普通数字引脚输出高低电平。三脚丝印 GND / I/O / VCC,模块尺寸 29.5×13.4mm(产品图标注)。本模块为低电平触发:I/O 拉低=响、拉高=停;本项目实测 3.3V 供电即可正常发声。
三个要点
| 要点 | 意思 |
|---|---|
| 有源 = 自带振荡器,固定频率 | 通电(I/O 拉低)就用固定频率发声,程序不需要 PWM、不需要定时器,做提示音/报警音最简单直接 |
| 无源 = 要自己给方波,可调音调 | 无源蜂鸣器内部没有振荡电路,必须用 PWM 输出方波才响,能变调——但用本页这套接线和代码不会响 |
| 外观接近,最容易买错 | 有源/无源、低电平触发/高电平触发、3.3V/5V 版本外观非常像,下单前一定核对丝印和商品说明(本页模块为:有源 + 低电平触发) |
产品正反面(三脚丝印 GND / I/O / VCC)
关键参数(以模块为主)
| 参数 | 数值 / 说明 | 来源 |
|---|---|---|
| 类型 | 有源蜂鸣器模块(自带振荡器,固定频率,不能变调) | 资料参考 模块厂家资料 |
| 触发方式 | 低电平触发:I/O 拉低=响、拉高=停(本代码按此编写,反了不响) | 本项目实测 2026-08-26 |
| 供电电压 | 3.3V 实测可正常发声;5V 供电版本待确认 | 本项目实测(5V 待确认) |
| 引脚 | 3 脚:GND / I/O / VCC(以模块实际丝印为准) | 资料参考 产品图 |
| 模块尺寸 | 29.5 × 13.4 mm | 资料参考 产品图标注 |
| 发声频率 / 声压 | 待确认(有源蜂鸣器为固定频率,具体数值以厂家资料为准) | 待确认 |
| 与无源的区别 | 无源需外部 PWM 方波驱动、可调音调;有源给电平就响、频率固定 | 资料参考 公开通用原理 |
Wiring
接线
本项目实测 蜂鸣器 3 根 + OLED 4 根,共 7 根线,按下面接法实机跑通。
接线示意图(一眼看懂)
有源蜂鸣器模块(丝印 GND / I/O / VCC)
| 信号 | 模块丝印 | STM32F103C8T6 | 说明 |
|---|---|---|---|
| 电源 | VCC | 3.3V | 本项目实测 3.3V 可正常发声,接线前核对模块丝印 |
| 信号 | I/O | PB1 | 低电平=响,高电平=停 |
| 地 | GND | GND | 必须与 STM32 共地 |
OLED
| 信号 | OLED | STM32F103C8T6 |
|---|---|---|
| 电源 | VCC / VDD | 3.3V |
| 地 | GND | GND |
| 时钟 | SCL / SCK | PB8 |
| 数据 | SDA | PB9 |
烧录与串口
| 用途 | 连接 | 说明 |
|---|---|---|
| 烧录 | ST-Link → SWD 四线(3.3V / GND / SWDIO=PA13 / SWCLK=PA14) | 烧录用 |
| 串口 | 不需要接 | 本项目程序不使用串口,PA9/PA10 悬空即可,串口监视器无输出属正常 |
Fritzing 接线图
1. 低电平触发,别和高电平触发模块搞混。本模块 I/O 拉低才响,代码里的 LOW/HIGH 语义不要反过来;买到的若是高电平触发模块,接线一样但代码逻辑要反。
2. 先确认是有源还是无源。无源蜂鸣器用本页「给电平就响」的接法不会响,必须改用 PWM 驱动。
3. PA13/PA14 别占用,留给 ST-Link 调试;蜂鸣器、OLED、STM32 的 GND 必须接在一起。
Principle
工作原理
资料参考 这一节来自模块资料和常规工程实践,不是我们实测的结论,用来帮助理解。实测结果只在上面「实机验证结果」一节。
有源 vs 无源
| 环节 | 说明 |
|---|---|
| 有源蜂鸣器 | 内部自带振荡电路,通电(触发有效电平)即用固定频率发声,程序只需给高低电平,不需要 PWM |
| 无源蜂鸣器 | 内部没有振荡电路,必须用 PWM / 方波驱动才能发声,可调音调;外观与有源版非常接近,最容易买错 |
| 驱动三极管 | 模块上带三极管做电流放大,I/O 引脚只走小电流控制信号,不直接驱动蜂鸣器 |
| 低电平触发 | 本模块 I/O 拉低(LOW)触发发声、拉高(HIGH)停止,与「高电平触发」模块相反,选型时注意丝印 |
为什么「有源」省事
有源蜂鸣器把「振荡」这件事做进了器件里,单片机一根普通 GPIO 就能驱动,非常适合提示音、报警音、按键反馈。缺点是不能变调——频率固定;想奏乐、输出不同音调,要换无源蜂鸣器并用 PWM 方波,那是另一种接法和代码。
有源/无源工作原理、三极管驱动电路、触发极性:模块厂家资料与公开通用原理,由我们重新整理表述。资料参考
Program logic
程序逻辑
本项目实测 下面是对实际代码 src/main.cpp 逻辑的说明,不展开语法,只讲「程序是怎么想的」。
setup(): 初始化 PB1(输出, 默认 HIGH=停) + OLED(U8g2 软件 I2C, SCL=PB8 / SDA=PB9)
loop(): 用 millis() 计时,每 500ms
-> buzzerOn 取反
-> buzzerOn == true : PB1 拉低 -> 蜂鸣器响, OLED 大字显示 ON
-> buzzerOn == false: PB1 拉高 -> 蜂鸣器停, OLED 显示 OFF, Count +1
关键点
1. 低电平触发。程序初始把 PB1 置 HIGH(停),需要响时置 LOW——和「高电平触发」模块正好相反,别照抄反了。
2. millis() 非阻塞计时。不用 delay(500),主循环每圈都检查时间差,到 500ms 才翻转状态,期间可以继续刷新 OLED,以后加按键、加传感器也不冲突。
3. 「响 → 停」才算一次。程序在从响切回停的那一刻 Count +1,所以 Count 数的是「响了几轮」,约每秒 +1,不是响的总时长。
4. OLED 用 U8g2 软件 I2C。128×64 屏:标题 14 BUZZER + 分隔线 + STATUS: + 大字 ON/OFF + Count,每次状态变化立即刷新。
5. 全程不使用串口。程序没有 Serial 相关代码,串口监视器看不到任何输出,这是设计如此、属正常,运行状态全部以 OLED 显示为准。
BUZZER_INTERVAL 默认 500(毫秒),响 0.5 秒、停 0.5 秒;想更慢就加大,想更急促就调小。
Code
完整代码
本项目实测 下面是实际烧录进板子、拍摄素材时运行的那一份,一字未改。环境:VS Code + PlatformIO + Arduino(STM32duino)。
展开完整代码(src/main.cpp)
#include <Arduino.h>
#include <U8g2lib.h>
// ============================================================
// 14_蜂鸣器 OLED 实测程序
// 模块:有源蜂鸣器模块,低电平触发
//
// 接线:
// 蜂鸣器 SIG -> PB1
// VCC -> 3.3V
// GND -> GND
//
// OLED SCL -> PB8
// SDA -> PB9
//
// 功能:
// 1. 蜂鸣器每 500ms 响 / 停切换
// 2. OLED 实时显示 ON / OFF
// 3. 每完成一次“响 -> 停”,Count +1
// 4. 使用 millis(),不使用 delay()
// ============================================================
#define BUZZER_PIN PB1
// OLED:128x64 SSD1306,软件 I2C
// SCL = PB8,SDA = PB9
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(
U8G2_R0,
PB8, // SCL
PB9, // SDA
U8X8_PIN_NONE
);
// -------------------- 状态变量 --------------------
bool buzzerOn = false;
unsigned long previousMillis = 0;
const unsigned long BUZZER_INTERVAL = 500;
unsigned long buzzerCount = 0;
// ============================================================
// OLED 显示
// ============================================================
void updateOLED()
{
u8g2.clearBuffer();
// 标题
u8g2.setFont(u8g2_font_6x12_tf);
u8g2.drawStr(0, 12, "14 BUZZER");
// 分隔线
u8g2.drawHLine(0, 17, 128);
// 状态标题
u8g2.drawStr(0, 32, "STATUS:");
// 状态大字
u8g2.setFont(u8g2_font_logisoso18_tf);
if (buzzerOn)
{
u8g2.drawStr(55, 39, "ON");
}
else
{
u8g2.drawStr(55, 39, "OFF");
}
// 次数
u8g2.setFont(u8g2_font_6x12_tf);
char countText[24];
snprintf(
countText,
sizeof(countText),
"Count: %lu",
buzzerCount
);
u8g2.drawStr(0, 61, countText);
u8g2.sendBuffer();
}
// ============================================================
// 初始化
// ============================================================
void setup()
{
// 蜂鸣器
pinMode(BUZZER_PIN, OUTPUT);
// 低电平触发:
// HIGH = 停止
// LOW = 响
digitalWrite(BUZZER_PIN, HIGH);
buzzerOn = false;
// OLED
u8g2.begin();
updateOLED();
}
// ============================================================
// 主循环
// ============================================================
void loop()
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= BUZZER_INTERVAL)
{
previousMillis = currentMillis;
buzzerOn = !buzzerOn;
if (buzzerOn)
{
// LOW = 蜂鸣器响
digitalWrite(BUZZER_PIN, LOW);
}
else
{
// HIGH = 蜂鸣器停止
digitalWrite(BUZZER_PIN, HIGH);
// 完成一次响 -> 停
buzzerCount++;
}
updateOLED();
}
}
依赖库:olikraus/U8g2,用 PlatformIO 打开工程会按 platformio.ini 自动下载,不用手动安装。
Download
下载
解压后用 VS Code + PlatformIO 打开这个文件夹就能 Build,一般不需要改代码。
第一次使用
- 按上面接线表接好:蜂鸣器 VCC→3.3V、I/O→PB1、GND→GND;OLED VCC→3.3V、GND→GND、SCL→PB8、SDA→PB9(接之前核对模块丝印)
- 下载 ZIP,解压,用 VS Code + PlatformIO 打开这个文件夹
- 等 U8g2 依赖库自动装完,点 Build,看到 SUCCESS
- 接上 ST-Link,点 Upload,看到
** Verified OK **和[SUCCESS] - 上电看 OLED:STATUS 每 500ms 在 ON(响)/ OFF(停)之间切换,Count 约每秒 +1——不用开串口,串口本来就没有输出
** Verified OK ** → [SUCCESS](ST-Link 走 SWD)pio device list,找 ST-Link / CP2102 / CH340 对应的那个。本项目不需要看串口,运行状态全在 OLED 上。
Troubleshooting
常见问题排查
下面每一条都是这个模块真实会遇到的。标注「实测」的是我们自己踩过的。
蜂鸣器完全不响
按顺序查:① 是有源还是无源?无源模块用本页这种电平驱动不会响,要改用 PWM;② 是低电平触发还是高电平触发?本模块低电平=响,如果买到的是高电平触发版本,程序里的 LOW/HIGH 要反过来;③ VCC/GND 是否按丝印接对、是否共地;④ 信号线是否接在程序使用的引脚(示例为 PB1)。
串口监视器没有任何输出
本项目实测 正常现象。本项目程序不使用串口,只往 OLED 上画状态。只要烧录时终端出现 ** Verified OK ** 和 [SUCCESS]、板子上电后 OLED 有显示,就说明程序已经在跑,不需要也不应该去加串口代码。
OLED 黑屏 / 快闪
OLED 快闪一般意味着 I2C 探测失败:检查 SCL 是否接 PB8、SDA 是否接 PB9、VCC 是否 3.3V、GND 是否共地,杜邦线逐一按紧。蜂鸣器不依赖 OLED,就算 OLED 没接好,PB1 的电平切换照常运行。
OLED 显示正常但不想听声音 / 想改节奏
改 BUZZER_INTERVAL 一个数即可(默认 500ms)。想让蜂鸣器常响不切换,把 loop 里的取反逻辑注释掉、直接 digitalWrite(BUZZER_PIN, LOW) 即可(低电平触发)。
能响,但只有一种声音,想播放不同音调
做不到,这不是故障:有源蜂鸣器自带振荡器、频率固定,只能「响/停」不能变调。要奏乐、变音调,需要换无源蜂鸣器并用 PWM 输出不同频率方波(如 Arduino 的 tone()),那是另一种器件和代码。
5V 供电行不行?
本项目实测 我们只验证了 3.3V 供电正常发声;5V 版本/5V 供电表现待确认。不同厂家模块电路不同,请按你手上模块的丝印和商品说明供电,不要盲目升 5V。
烧录失败 / 识别不到芯片
确认 ST-Link 走 SWD 四线(3.3V / GND / SWDIO=PA13 / SWCLK=PA14),排线方向别反;PA13/PA14 不能被本项目占用;换 USB 口或重装 ST-Link 驱动后再试。本模块也可以用 Arduino IDE 刷 STM32 的引导加载方式,但我们没有验证过,不提供支持说明。
References
资料来源
本页信息来源声明
| 内容 | 来源 |
|---|---|
| 接线、代码、OLED 显示、计数逻辑、3.3V 供电可响、无串口输出 | 本项目实测 2026-08-26 实机测试 |
| 模块三脚丝印、尺寸 29.5×13.4mm | 资料参考 产品图标注 |
| 有源/无源工作原理、三极管驱动、低电平触发说明 | 资料参考 模块厂家资料与公开通用原理,由我们重新整理表述 |
| 发声频率 / 声压、5V 供电版本 | 待确认 |
| SKU | 待确认 |
本页所有「资料参考」内容均由我们重新整理表述,未直接复制原文。不同厂家 / 批次蜂鸣器模块可能存在引脚顺序、触发极性(低/高电平)或供电电压差异,参数以你手上模块的实际丝印和卖家说明为准。