模块熟悉

第 17 课:蜂鸣器——发出声音

套件里最省心的输出模块,但"有源"这两个字容易理解反

我是吴老师。这是「模块熟悉」单元里最轻松的一节。

前面几节课,你学的都是""——读光、读温度、读距离,每一样都要动点脑子:要标定、要换算、要看时序。

这节课反过来,是"让它动"。而且这个模块特别省心——接上电,它就响。

代码也就五六行,跟第 6 课点灯差不多。

但我还是给它排了一整节课,因为这里面有个坑,而且这个坑很阴。

坑不在电路上,不在代码里——在那个模块的名字里

看视频时注意的三件事

先看视频,视频里我把它拆开讲了。

视频教程蜂鸣器:有源与无源的区别、接线、让它响下载 ↗

第一,注意接线只有三根。

VCCI/OGND跟 LED 模块是一模一样的结构:一个电源、一个地、一个信号。第 6 课那张接线表你可以直接翻出来对着看。

第二,注意"高电平触发"是什么意思。

就是从 I/O 那根线给一个高电平,它就响;给低电平,它就停。

什么叫"给高电平"? 就是你写 digitalWrite(5, HIGH),那根引脚上变成 3.3V。

是不是听着特别耳熟? 对,这跟点灯是同一件事。第 6 课你写 HIGH 灯亮、写 LOW 灯灭;这里写 HIGH 它响、写 LOW 它停。一模一样的两个动作。

第三,注意视频里会出现"有源"和"无源"两个词。

这两个词是这节课的全部难点,下一节我专门讲。你先记住一件事:我们套件里的,是有源的那种。

一、"源"指的是振荡源,不是电源

这是全课最容易理解反的地方,我把它放在最前面说清楚。

看到"有源",很多人的第一反应是"哦,需要接电源的"。然后看到"无源",就想"那这个不用接电源吧"。

全错。

有源蜂鸣器自带振荡源只能发一个音,无源蜂鸣器需要外部给频率才能变调

这里的"源",指的是"振荡源"——也就是"负责产生音调的那个东西"。

  • 有源 = 它自带音源。你一给它电,它内部的电路自己就开始振动,就响了。
  • 无源 = 它没有音源。你得用信号告诉它"振动多快",它才响。

"电源"和"音源"是两件事,别看混了。

两个都得接电源。 无源蜂鸣器不接电源照样不响——它只是需要电源之外,再额外告诉它频率

记这个窍门:有源 = 自带音源(自己会响),无源 = 没有音源(要你给它)。跟"要不要接电"一点关系都没有。

那"音源"具体是干什么的?它决定声音的高低。

声音的高低,取决于振动快不快——振动越快,音调越高。有源蜂鸣器内部的电路只按一个固定速度振动,所以它只有一个音

二、坏消息:它只有一个音调

直接说结论:套件里这颗,做不出曲子。

我知道你看到蜂鸣器,第一个念头大概是"能不能让它弹《小星星》"。很遗憾,不能。

原因就是刚才说的:有源蜂鸣器内部的振荡电路是固定死的,你给它的只有"通电 / 断电"两种命令。你没法告诉它"这一声要高一点"。

它只会"嘀——"。

你唯一能控制的,是"响多久、停多久"。

你能控制 你不能控制
什么时候响、响多久、停多久 音调高低
(每隔半秒嘀一声) (想让它唱"哆来咪")

所以别对着它试半天"是不是我代码写错了"。 不是你写错了,是这颗元件就这个本事。

想弹曲子怎么办? 单买一个无源蜂鸣器,几块钱。它没有内部音源,音调完全由你给的频率决定——你给 262 Hz 就发"哆",给 294 Hz 就发"来"。到那时候再回来玩《小星星》。

这也是个有用的经验:拿到一个元件,先搞清楚它的能力边界在哪,再想用它做什么。这跟第 16 课那句"先看手册参数,再决定它能干什么"是同一个道理。

三、好消息:它跟 LED 用法一模一样

坏消息说完了,说好消息——这个模块简单到不像话。

因为它跟 LED 模块的用法完全一样:

digitalWrite 写 HIGH 时引脚输出 3.3 伏,LED 点亮;写 LOW 时输出 0 伏,LED 熄灭

代码 引脚电压 LED 蜂鸣器
digitalWrite(x, HIGH) 3.3V
digitalWrite(x, LOW) 0V

看到没有?右边那两列是同步的。

第 6 课我撂过一句话:"学会点灯,你就学会了一半的输出设备。"

这句话在这儿兑现了。

你在第 6 课学的 pinMode(5, OUTPUT)digitalWritedelay——一个字都不用改,换个引脚号就能让蜂鸣器响。 你甚至不用重新理解任何原理。

这就是输出设备的通用套路:主控给一个电平,模块自己去做该做的事。LED 把电变成光,蜂鸣器把电变成声音,后面第 18 课的舵机把电变成角度——它们收到的命令长得一模一样。

四、动手:三步,每步都听得见

接线(接之前先断电):

蜂鸣器 接到
VCC 3.3V
GND GND
I/O GPIO5

GPIO3 上还留着第 6 课的 LED,GPIO4 上留着第 9 课的按钮。蜂鸣器我们用 GPIO5,三个模块可以一直插着,互不打架。

引脚选 GPIO3~GPIO7 这一带就行,别用 GPIO2GPIO8GPIO9(第 4 课那张表)。

第一步:先让它一直响

跟点灯一样,先从最丑的版本开始。

C++
void setup() {
  pinMode(5, OUTPUT);
}

void loop() {
  digitalWrite(5, HIGH);   // 一直响
}

烧进去。

听到声音了吗?

听到了就成了。 你刚刚用那几行字,让一个物理设备发出了声音。

没响?按第 5 课那个顺序查:电 → 信号 → 代码。

  1. 先量 VCC 上有没有 3.3V
  2. 再量 I/O 那根线通不通(顺便量一下它现在是不是 3.3V——程序正在输出高电平)
  3. 最后才怀疑代码

九成的"没反应"都在前两步。你已经不是第一次遇到"没反应"了,别再靠猜。

第二步:让它"嘀、嘀、嘀"

一直响太吵了。加上"停"和"等",就变成了报警器那种节奏:

C++
void loop() {
  digitalWrite(5, HIGH);
  delay(200);              // 响 0.2 秒
  digitalWrite(5, LOW);
  delay(800);              // 停 0.8 秒
}

这段代码,跟第 6 课让灯闪的那段,是不是一模一样? 只差一个引脚号。

现在自己改数值玩:

  • delay(200) 改成 delay(50)嘀嘀嘀嘀嘀,听着就急了
  • 两个都改成 delay(500)变成了老式闹钟那种"嘀、嘀、嘀"
  • 改成 delay(1000)delay(1000)慢悠悠的,像倒车提示音

这就是"调参数"——第 6 课讲过,逻辑不动、只改数值看效果。那是写程序里最常见的一件事。

用万用表量一下 I/O:响的那一瞬间是 3.3V,停的时候是 0V。

看见了吗?声音背后就是一个电压在跳。 万用表反应没那么快,你可能只看到数字在 3.3 和 0 之间闪——这个"闪",就是声音的形状。

第三步:跟按钮结合起来——按下就响

这一步是复习第 9 课,不是新东西。

把第 9 课那个闭环里的 LED 换成蜂鸣器,别的一个字都不改:

C++
void setup() {
  pinMode(4, INPUT_PULLUP);   // 按钮(第 9 课那个)
  pinMode(5, OUTPUT);         // 蜂鸣器
}

void loop() {
  int btn = digitalRead(4);   // 第 1 步:读

  if (btn == LOW) {           // 第 2 步:判断
    digitalWrite(5, HIGH);    // 第 3 步:响
  } else {
    digitalWrite(5, LOW);     // 不按就停
  }
}

按下去就响,松开就停。 一个门铃,五秒钟就做出来了。

注意 if (btn == LOW) 这句:它假设你的按钮是"按下为低"。这是第 9 课你用万用表量出来的结论——如果你当时量出来是"按下为高",那这里就写 HIGH

别照抄,用你自己量过的那个值。 这就是"先测,再猜"。

而且你看——这已经是一个完整的闭环了

环节 用了什么
传感器 按钮(读 GPIO4
判断 if (btn == LOW)
执行器 蜂鸣器(写 GPIO5

第 9 课学的那个骨架,这节课换了个零件又走了一遍。 后面第 28 课倒车雷达、第 30 课坐姿提醒器,都是这个骨架 + 一个传感器而已。

自测

单选题"无源蜂鸣器"里的"无源",指的是什么?
单选题套件里的蜂鸣器能弹出《小星星》吗?
单选题关于蜂鸣器和 LED 的用法,下面哪句话是对的?
问答题"按下按钮就响"这个实验,为什么说它是一个完整的闭环?请按三个环节说明。
拓展无源蜂鸣器是怎么弹出《小星星》的?音符和频率之间是什么关系?

这个问题课上不讲,留给你自己找答案——**问 AI 是最好的办法**。

提示:搜"音名 频率 对照表 262Hz"、"Arduino tone 函数 简谱"。想一想:如果"哆"是 262 Hz、"来"是 294 Hz,那《小星星》头两句(哆哆嗖嗖啦啦嗖)要怎么写成代码?顺便想想:为什么这个套件里配的是有源的那种?

拓展手机能放音乐,蜂鸣器只能"嘀"一声,差别在哪?

这个问题课上不讲,留给你自己找答案——**问 AI 是最好的办法**。

提示:搜"蜂鸣器 扬声器 区别 音质"。想一想:蜂鸣器靠一块金属片振动,手机喇叭靠什么?如果振动的材料不一样,能发出来的声音会有什么不同?

本节你要动手做的事

  • [ ] 接好三根线VCC3.3VGNDGNDI/OGPIO5接之前先断电
  • [ ] 先让它一直响,跑通最丑的版本——别一上来就写复杂代码
  • [ ] 改成"嘀嘀嘀",然后自己改 delay 的数值,听出快慢的变化
  • [ ] 用万用表量 I/O:响的时候是不是 3.3V?停的时候是不是 0V?这一步别跳过
  • [ ] 跟按钮结合:按下就响,松开就停——按钮的那个判断条件用你自己量出来的值
  • [ ] 想清楚一件事:为什么它只有一个音? 想明白了,你以后就不会在它身上浪费时间了

这节课你做的东西很小:三根线、五六行代码、一声"嘀"。

但有两件事值得你带走。

第一件,你已经能一眼看穿"有源/无源"这种命名陷阱了。 一个名字有歧义,很多成年人接错了还在那儿改代码。你没有——你去看了它的内部结构,搞清楚了"源"到底指什么。

第二件,第 6 课那句话在这儿兑现了。 你学点灯的时候,可能觉得"不就是让一个灯亮吗"。现在你知道了:同一个 digitalWrite,换一个模块就从光变成了声音。

后面还有舵机(角度)、OLED(画面)——它们收到的命令,本质上还是这一套。

下一节我们学舵机。那是个"能转到指定角度"的电机,做云台、做小门、做机械臂都靠它。它比蜂鸣器麻烦一点——启动电流大,得单独给它 5V 供电,还得共地(第 4 课那个词,还记得吧)。