声光律动灯——基于 ESP32 的 RGB 音量可视化装置
把环境中的声音大小,实时变成一根会跳动的 RGB 光柱。
整个装置使用 ESP32 作为主控,通过声音传感器采集周围环境的音量变化,再驱动 WS2812 RGB 灯带进行显示。
声音越小,亮起的 LED 越少;
声音越大,光柱就会从下往上不断升高。
配合颜色渐变和缓慢回落效果以后,整体看起来有点类似以前音响设备上的 VU 音量表,只不过这次把它做成了一整根 RGB 灯带。
一、作品效果
整个装置的工作逻辑很简单:
声音传感器 → ESP32 → RGB 灯带
声音传感器负责实时检测周围环境中的声音变化。
ESP32 对采集到的模拟量进行处理,再根据当前声音强度计算应该点亮多少颗 LED。
最终形成一个从下向上变化的 RGB 音量柱。
例如:
- 环境比较安静时,只亮底部少量 LED;
- 正常说话时,光柱会上升到中间区域;
- 声音突然增大时,灯光会快速向上冲;
- 声音减弱以后,灯光不会立刻消失,而是稍微保持一下,再逐渐下降。
这样比简单地按照音量直接开灯、关灯,看起来会自然很多。
二、主要硬件
这次使用的硬件并不复杂,主要包括:
1. ESP32 主控
ESP32 作为整个系统的核心。
主要负责:
- 读取声音传感器模拟量;
- 对声音数据进行采样;
- 过滤环境底噪;
- 计算当前声音强度;
- 控制 RGB 灯带显示;
- 完成灯光保持、下降和渐变等效果。
ESP32 本身 ADC 和运算能力对于这种小项目完全够用,同时后续也很方便继续增加 Wi-Fi、蓝牙或者其他互动功能。
2. 声音传感器
声音传感器负责采集环境中的声音强弱变化。
传感器输出模拟信号,ESP32 通过 ADC 接口进行读取。
程序并不是简单读取某一个瞬间的电压值,而是在一个很短的时间窗口内连续采样,通过声音波动范围判断当前的声音强度。
这样可以减少单次采样抖动带来的影响。
3. WS2812 RGB 灯带
显示部分使用可编程 RGB 灯带。
WS2812 的优点是每一颗 LED 都可以独立控制:
- 是否点亮;
- 亮度;
- 红色分量;
- 绿色分量;
- 蓝色分量。
因此非常适合制作这种动态音量显示效果。
三、灯光效果设计
最开始做的时候,其实只是简单地:
声音大 → 多亮几颗灯。
后来发现这样虽然能用,但视觉效果比较生硬。
所以又增加了几个细节。
1. 快速上升
当声音突然变大时,灯柱会快速向上增长。
这样声音和灯光之间的响应会比较直接。
比如拍手、说话或者播放音乐时,光柱可以马上跟着变化。
2. 延迟下降
如果声音刚刚变小,灯柱不会立即掉下来。
程序会让当前位置短暂保持一会儿,再逐渐下降。
这样可以避免灯光不停高速抖动。
视觉效果也会更接近真正的音频电平表。
3. 渐隐效果
灯柱下降时,不是直接关闭 LED。
而是让灯光逐渐变暗。
这样整个动画会柔和很多。
尤其是在声音连续变化的时候,会产生比较明显的“拖尾”效果。
4. RGB 颜色渐变
灯带没有全部使用同一种颜色,而是根据高度设置不同的颜色区域。
大致可以设计成:
蓝色 → 绿色 → 黄色 → 橙色 → 红色
声音较小时主要在蓝绿区域;
声音逐渐增大后进入黄色和橙色;
音量很大时顶部进入红色区域。
这样不仅更加好看,也能一眼看出当前声音的大致强度。
四、底噪处理
实际测试的时候还有一个比较明显的问题:
即使房间里没有人说话,声音传感器本身也会存在一定的底噪和电压波动。
如果直接把所有 ADC 数据映射到 LED 数量,就会出现:
环境明明很安静,底部却一直有几颗灯乱跳。
所以程序中增加了一个底噪阈值。
低于阈值的声音波动直接认为是环境噪声,不参与灯光显示。
只有声音超过一定强度以后,光柱才开始明显上升。
经过这个处理以后,安静状态下的灯光表现会稳定很多。
五、声音采样方式
程序采用一个短时间采样窗口。
ESP32 在这个窗口中连续读取声音传感器的数据,并记录:
最大采样值和最小采样值。
然后计算:
声音幅度 = 最大值 - 最小值
相比直接使用某一次 ADC 采样值,这种方式更适合检测声音这种快速变化的信号。
随后再把得到的声音幅度映射为:
需要点亮的 LED 数量。
整个过程可以简单理解成:
麦克风检测声音
↓
ESP32 连续采样
↓
计算声音幅度
↓
过滤底噪
↓
映射灯带长度
↓
RGB 灯带实时显示
六、程序逻辑
整个程序的核心流程大致如下:
- 初始化 ESP32 ADC;
- 初始化 WS2812 RGB 灯带;
- 连续读取声音传感器;
- 在短时间窗口内计算最大值和最小值;
- 得到当前声音幅度;
- 判断是否超过底噪阈值;
- 将声音强度映射为 LED 数量;
- 声音增强时快速增加灯柱高度;
- 声音减弱时短暂保持;
- 灯柱逐渐向下回落;
- 每颗 LED 根据当前位置显示不同的 RGB 渐变颜色。
核心思路并不复杂,但几个动画细节加上以后,最终效果比最初简单的“音量控制 LED 数量”自然了很多。
七、可以怎么玩
这个小作品虽然结构简单,但其实可以继续做很多扩展。
例如可以作为:
- 音乐律动灯;
- 桌面 RGB 氛围灯;
- 音量可视化显示器;
- 教室噪声提示器;
- 拍手互动装置;
- 舞台灯光效果;
- 声音传感器教学案例。
如果再加入 OLED 屏幕,还可以同时显示:
- 当前 ADC 数值;
- 当前音量等级;
- 峰值;
- 动态波形。
如果利用 ESP32 自带的 Wi-Fi,还可以进一步把声音数据上传到网页,实现实时曲线显示。
八、这个作品适合讲哪些知识点
这个项目本身不算复杂,但如果用在开源硬件教学中,可以覆盖不少知识点:
传感器部分
学习声音传感器以及模拟量采集。
程序部分
学习 ADC、变量、最大值与最小值、数据映射、阈值判断以及定时逻辑。
灯光部分
学习 WS2812 RGB LED 的控制方式,以及 RGB 三原色。
算法部分
可以进一步理解:
- 噪声阈值;
- 峰值检测;
- 滤波;
- 平滑处理;
- 动画衰减。
所以它既可以作为一个小作品展示,也比较适合作为 ESP32 入门到进阶之间的综合实验。
九、最后
这个项目最初的想法其实非常简单:
能不能把“声音”变成一种看得见的东西?
于是就有了这根会随着声音不断上下跳动的 RGB 光柱。
硬件并不复杂,核心就是:
ESP32 + 声音传感器 + WS2812 RGB 灯带。
但在加入底噪过滤、快速上升、延迟下降、渐隐以及颜色渐变以后,最终的动态效果还是挺有意思的。
尤其是播放音乐或者在旁边讲话的时候,灯柱会随着声音不断变化。
这种:
把传感器采集到的数据,通过灯光实时表现出来
的过程,也是开源硬件比较有趣的地方。
这次先把这个小作品分享出来,后面有新的玩法再继续折腾。





