声光律动灯——基于 ESP32 的 RGB 音量可视化装置

2026-10-313

把环境中的声音大小,实时变成一根会跳动的 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 灯带实时显示


六、程序逻辑

整个程序的核心流程大致如下:

  1. 初始化 ESP32 ADC;
  2. 初始化 WS2812 RGB 灯带;
  3. 连续读取声音传感器;
  4. 在短时间窗口内计算最大值和最小值;
  5. 得到当前声音幅度;
  6. 判断是否超过底噪阈值;
  7. 将声音强度映射为 LED 数量;
  8. 声音增强时快速增加灯柱高度;
  9. 声音减弱时短暂保持;
  10. 灯柱逐渐向下回落;
  11. 每颗 LED 根据当前位置显示不同的 RGB 渐变颜色。

核心思路并不复杂,但几个动画细节加上以后,最终效果比最初简单的“音量控制 LED 数量”自然了很多。


七、可以怎么玩

这个小作品虽然结构简单,但其实可以继续做很多扩展。

例如可以作为:

  • 音乐律动灯;
  • 桌面 RGB 氛围灯;
  • 音量可视化显示器;
  • 教室噪声提示器;
  • 拍手互动装置;
  • 舞台灯光效果;
  • 声音传感器教学案例。

如果再加入 OLED 屏幕,还可以同时显示:

  • 当前 ADC 数值;
  • 当前音量等级;
  • 峰值;
  • 动态波形。

如果利用 ESP32 自带的 Wi-Fi,还可以进一步把声音数据上传到网页,实现实时曲线显示。


八、这个作品适合讲哪些知识点

这个项目本身不算复杂,但如果用在开源硬件教学中,可以覆盖不少知识点:

传感器部分

学习声音传感器以及模拟量采集。

程序部分

学习 ADC、变量、最大值与最小值、数据映射、阈值判断以及定时逻辑。

灯光部分

学习 WS2812 RGB LED 的控制方式,以及 RGB 三原色。

算法部分

可以进一步理解:

  • 噪声阈值;
  • 峰值检测;
  • 滤波;
  • 平滑处理;
  • 动画衰减。

所以它既可以作为一个小作品展示,也比较适合作为 ESP32 入门到进阶之间的综合实验。


九、最后

这个项目最初的想法其实非常简单:

能不能把“声音”变成一种看得见的东西?

于是就有了这根会随着声音不断上下跳动的 RGB 光柱。

硬件并不复杂,核心就是:

ESP32 + 声音传感器 + WS2812 RGB 灯带。

但在加入底噪过滤、快速上升、延迟下降、渐隐以及颜色渐变以后,最终的动态效果还是挺有意思的。

尤其是播放音乐或者在旁边讲话的时候,灯柱会随着声音不断变化。

这种:

把传感器采集到的数据,通过灯光实时表现出来

的过程,也是开源硬件比较有趣的地方。

这次先把这个小作品分享出来,后面有新的玩法再继续折腾。

硬件清单

创作许可协议

本项目采用 CC BY(署名) 进行许可。

所需材料/产品

加载全部

    Gravity: 模拟声音传感器(Arduino兼容)

    Gravity: 模拟声音传感器(Arduino兼容)

    Gravity: 模拟声音传感器(Arduino兼容)

    FireBeetle 2 Board ESP32-S3(N16R8)开发板(带摄像头)

    FireBeetle 2 Board ESP32-S3(N16R8)开发板(带摄像头)

    FireBeetle 2 Board ESP32-S3(N16R8)开发板(带摄像头)

相关推荐

评论(0)
- 没有更多了 -

创作许可协议

本项目采用 CC BY(署名) 进行许可。

相关推荐

所需材料/产品

Gravity: 模拟声音传感器(Arduino兼容)

Gravity: 模拟声音传感器(Arduino兼容)

Gravity: 模拟声音传感器(Arduino兼容)

FireBeetle 2 Board ESP32-S3(N16R8)开发板(带摄像头)

FireBeetle 2 Board ESP32-S3(N16R8)开发板(带摄像头)

FireBeetle 2 Board ESP32-S3(N16R8)开发板(带摄像头)