前面我们学了光敏传感器(感光)、温度传感器(感温)、倾斜传感器(感姿态)——今天再给ESP32加上一项新感官:听觉。
智能语音助手、声控灯、噪声检测仪、拍手开关……这些设备的背后,都是声音传感器在工作。
今天这节课,我们就用声音传感器,让ESP32能“听”到声音!
第一步:找到课程,看看成品效果
打开逗脑IDE,点击顶部“文档”,在“课程” → “ESP32 + MicroPython”分类下,找到声音传感器。
打开课件,你会看到本节课的最终效果:打一个响指,终端立刻打印“有声音…”;安静时则只显示环境声音数值。
第二步:什么是声音传感器?
本节课使用的是声音传感器模块,它包含一个驻极体麦克风和一个比较器电路。
这个模块提供了两路信号输出,可以满足不同场景的需求:
| 引脚 | 信号类型 | 输出值 | 说明 |
|---|---|---|---|
| AO | 模拟输出 | 0~4095 | 环境声音越大,数值越大(数值越大=声音越大) |
| DO | 数字输出 | 0 或 1 | 声音超过阈值时输出1(可通过电位器调节灵敏度) |
第三步:动手接线
声音传感器模块有4个引脚:
| 传感器引脚 | 连接ESP32 | 说明 |
|---|---|---|
| VCC | 3.3V | 电源正极 |
| GND | GND | 电源地 |
| AO | GPIO33 | 模拟输出(接ADC引脚) |
| DO | GPIO15 | 数字输出(接中断引脚) |
第四步:中断+代码——既要“听”还要“随时响应”
本节课的代码同时使用了两种读取方式:
- 轮询方式:在
while循环中不断读取AO模拟值 - 中断方式:DO引脚触发中断,声音超过阈值时立刻响应
frommachineimportPin,ADCimporttime# 模拟量(AO):ADC读取声音强度sound_analog=ADC(Pin(33))sound_analog.atten(ADC.ATTN_11DB)# 量程3.3V# 中断回调函数defsound_func(*argc):print("有声音...")# 一检测到声音就打印# 数字量(DO):配置中断p15=Pin(15,Pin.IN)p15.irq(trigger=Pin.IRQ_RISING,handler=sound_func)# 主循环whileTrue:sound_value=sound_analog.read()# 0~4095,数值越大声音越大print(sound_value)time.sleep(0.1)第五步:保存运行,打响指测试!
按Ctrl + S保存,选择ESP32开发板设备,给文件命名(比如sound.py),点击保存。
点击运行按钮,终端开始不断打印声音数值。
试试看:
- 安静时:数值较小(如200~500),终端只打印数值
- 打一个响指:数值瞬间增大,同时终端弹出“有声音…”!
- 拍手、说话、敲桌子:同样会触发响应
声音传感器能做什么?
| 应用场景 | 原理 |
|---|---|
| 声控灯 | 拍手开关灯 |
| 噪声检测仪 | 实时监测环境音量 |
| 智能语音触发 | 检测到声音启动语音助手 |
| 婴儿哭声检测 | 检测哭声自动播放安抚音乐 |
| 敲门感应器 | 检测敲门声触发灯光/提醒 |
| 互动装置 | 声音控制LED灯光秀 |
模拟量 VS 数字量,怎么选?
| 模拟量(AO) | 数字量(DO) | |
|---|---|---|
| 输出 | 0~4095连续数值 | 0或1(超过阈值触发) |
| 特点 | 能知道“声音有多大” | 只知道“有没有声音” |
| 用途 | 音量显示、声谱分析 | 拍手开关、触发事件 |
| 代码 | adc.read()轮询 | 中断触发,响应快 |
本节课两种都用了:主循环打印模拟量,中断响应数字量——既能看到数值变化,又能快速响应声音事件。
全程回顾
| 步骤 | 操作 | 效果 |
|---|---|---|
| 找到课程 | 文档→课程→ESP32+MicroPython→声音传感器 | 了解声音传感器 |
| 认识原理 | 麦克风采集声音→模块输出AO/DO信号 | 理解两种输出方式 |
| 动手接线 | VCC→3.3V, GND→GND, AO→GPIO33, DO→GPIO15 | 硬件就位 |
| 打开代码 | 点击“打开”按钮 | 代码进入编辑器 |
| 保存运行 | Ctrl+S → 选择ESP32 → 运行 | 开始监听声音 |
| 打响指 | 打一个响指或拍手 | 终端打印“有声音…”! |
如果你对本节课感兴趣,去官网(www.dounao.cn)下载逗脑IDE,准备好相关配件,跟着课件走一遍。
有任何问题或建议,欢迎在评论区留言告诉我们。