音频与麦克风 · 蜂鸣/提示音 · 有源蜂鸣器模块 + 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。

500 ms响 / 停切换周期(非阻塞)
低电平触发LOW = 响,HIGH = 停
Count +1每完成一次「响 → 停」计一次
3.3V 供电实测可正常发声,不需要额外电源

实测动作与 OLED 表现

测试动作OLED / 蜂鸣器表现
刚上电OLED 显示 14 BUZZER / STATUS: OFF / Count: 0,蜂鸣器静音
前 500msPB1 拉低,STATUS 变 ON,蜂鸣器响
后 500msPB1 拉高,STATUS 变 OFF,蜂鸣器停,Count +1
持续运行每 1 秒完成一轮「响 → 停」,Count 约每秒 +1,可无限循环
打开串口监视器无输出——本项目程序不使用串口,属正常,不代表没烧进去
有源蜂鸣器实拍接线全景:模块 + 面包板 + STM32F103C8T6 + OLED 显示 STATUS ON
实拍接线全景:模块、面包板、STM32F103C8T6、OLED 同框,此刻 STATUS 显示 ON(蜂鸣器响)

完整演示视频(动画 + 实拍)

有源蜂鸣器 + OLED 成片(约 28 秒,720P,动画 + 实拍合成):从接线、原理到实测验证

OLED 两种状态特写

OLED 实拍特写:STATUS 显示 ON,蜂鸣器响
PB1 拉低:STATUS 显示 ON,蜂鸣器响
OLED 实拍特写:STATUS 显示 OFF,蜂鸣器停,Count +1
PB1 拉高:STATUS 显示 OFF,蜂鸣器停,Count +1

实测环境

项目本项目实际使用
主控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
未验证的环境不当成支持。本项目没有在 Arduino IDE、Keil、STM32CubeIDE 下编译或验证过,所以不提供这些环境的支持说明。

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)

有源蜂鸣器模块正面产品图:GND / I/O / VCC 三脚,标注 29.5×13.4mm
模块正面产品图:三脚 GND / I/O / VCC,尺寸 29.5×13.4mm(产品图标注)
有源蜂鸣器模块背面产品图:黑色蜂鸣器本体 + 三根排针
模块背面产品图:蜂鸣器本体 + 排针

关键参数(以模块为主)

参数数值 / 说明来源
类型有源蜂鸣器模块(自带振荡器,固定频率,不能变调)资料参考 模块厂家资料
触发方式低电平触发: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 根线,按下面接法实机跑通。

接线示意图(一眼看懂)

3.3V 电源 GND 地 I/O → PB1 SCL → PB8 SDA → PB9 有源蜂鸣器模块 低电平触发 · 3.3V 实测 VCC I/O GND STM32F103C8T6 BluePill 3.3V PB1 PB8 (SCL) PB9 (SDA) GND 0.96 OLED SSD1306 · 0x3C VCC SCL SDA GND 蜂鸣器只接 3 根线(黄色为信号);OLED 走 I2C:SCL→PB8、SDA→PB9;两者与 STM32 共 3.3V、共 GND
接线示意:红色 3.3V、黑色 GND 供电;黄色蜂鸣器 I/O→PB1;绿色 SCL→PB8、蓝色 SDA→PB9,线不交叉

有源蜂鸣器模块(丝印 GND / I/O / VCC)

信号模块丝印STM32F103C8T6说明
电源VCC3.3V本项目实测 3.3V 可正常发声,接线前核对模块丝印
信号I/OPB1低电平=响,高电平=停
地GNDGND必须与 STM32 共地

OLED

信号OLEDSTM32F103C8T6
电源VCC / VDD3.3V
地GNDGND
时钟SCL / SCKPB8
数据SDAPB9

烧录与串口

用途连接说明
烧录ST-Link → SWD 四线(3.3V / GND / SWDIO=PA13 / SWCLK=PA14)烧录用
串口不需要接本项目程序不使用串口,PA9/PA10 悬空即可,串口监视器无输出属正常

Fritzing 接线图

有源蜂鸣器 Fritzing 接线图:蜂鸣器模块 + BluePill + OLED 面包板接线
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,一般不需要改代码。

PlatformIO 工程 ZIP 含 platformio.ini、src/main.cpp、README.md。已去掉本机构建路径,解压后 VS Code 打开即可 Build。
下载 ZIP

第一次使用

  1. 按上面接线表接好:蜂鸣器 VCC→3.3V、I/O→PB1、GND→GND;OLED VCC→3.3V、GND→GND、SCL→PB8、SDA→PB9(接之前核对模块丝印)
  2. 下载 ZIP,解压,用 VS Code + PlatformIO 打开这个文件夹
  3. 等 U8g2 依赖库自动装完,点 Build,看到 SUCCESS
  4. 接上 ST-Link,点 Upload,看到 ** Verified OK ** 和 [SUCCESS]
  5. 上电看 OLED:STATUS 每 500ms 在 ON(响)/ OFF(停)之间切换,Count 约每秒 +1——不用开串口,串口本来就没有输出
有源蜂鸣器烧录成功截图:VS Code + PlatformIO 终端 Verified OK / SUCCESS
烧录成功截图:PlatformIO 终端 ** Verified OK ** → [SUCCESS](ST-Link 走 SWD)
不要照抄 COM 号。截图里出现的串口号是我们这台电脑的,你的电脑多半不一样。查当前串口:pio device list,找 ST-Link / CP2102 / CH340 对应的那个。本项目不需要看串口,运行状态全在 OLED 上。
这块板子不能用网页烧录器。网页烧录(WebSerial)主要面向 ESP32 / ESP8266 这类自带 USB 串口下载的芯片。STM32F103C8T6 本项目用的是 ST-Link + SWD,浏览器接触不到 SWD 接口。

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待确认

本页所有「资料参考」内容均由我们重新整理表述,未直接复制原文。不同厂家 / 批次蜂鸣器模块可能存在引脚顺序、触发极性(低/高电平)或供电电压差异,参数以你手上模块的实际丝印和卖家说明为准。