7 频段 LED 音乐灯
发布时间: 2025-06-14 15:18:25 |
0
0
0
0




Arduino
WS2812
AdafruitNeopi
LED

这是一个项目,它接收一个连续的模拟信号(通常为音乐信号),并利用其驱动一个7频段LED音频可视化器。系统通过MSGEQ7芯片对音乐信号进行频谱分析,提取不同频率段的强度数据,并将这些数据映射到LED灯带上。所使用的LED灯带型号为SK6812,这是一种可编程RGB LED灯带。
准备工作:
材料:
使用的材料:
- MSGEQ7 频率分析芯片
- 3.5 毫米母插孔(用于音频输入)
- 2 个 22k 欧姆电阻
- 0.01 微法电容
- 2 个 0.1 微法电容
- 200 千欧姆电阻
- 33 皮法电容
- Arduino Uno 开发板
- SK6812 RGB LED 灯带(也称作 WS2811 或 Adafruit NeoPixel)
说明:
- MSGEQ7 是用于音频频谱分析的核心芯片,可提取音乐信号的7个频段强度。
- SK6812/WS2811/Adafruit NeoPixel 是可编程 RGB LED 灯带,支持通过单线协议控制颜色和亮度。
- 电阻和电容用于电路滤波和信号稳定,需按图示接线。
1
制作3.5毫米插孔

用2个不同的22K欧姆电阻焊接两个通道。然后连接两个电阻并将它们焊接到0.01微法拉电容器上。这就是信号
2
连接Arduino和MSGEQ7




12
按照原理图连接IC。
Reset 接到Arduino上的数字引脚8。
Str频闪 转到Arduino上的数字引脚5。
DC输出的直流到模拟量A0
LED的数据输入到Arduino上的数字引脚6。
FDC3BHBJPLIZKMD.pdf
145.54KB
3
LEDs

如果你想实现复古风格的可视化效果
硬件组装说明
- LED灯条焊接
- 使用 7条LED灯条,将其依次焊接在 卡片式电路板(Cardstock PCB) 上。
- 避免使用实心焊丝(Solid-core wire),因其难以牢固附着在电路板焊盘(Pads)上。
- 数据信号连接
- 将LED灯带的数据输入端连接至 Arduino的数字引脚6(D6)。
- 电源与电流注意事项
- 每个LED的最大工作电流为 80毫安(mA)。
- 若使用 60个LED,总电流可达 4.8安培(A)(60 × 0.08A = 4.8A)。
- 电源需求:建议使用 旧的CPU电源模块(ATX电源),其输出功率足以支持高电流需求。
4
The Code

代码是附加的,可以在arduino ide中打开。您可以在代码中设置led的数量。
#include <Adafruit_NeoPixel.h>
#define PIN 6
int strobe = 4; // strobe pins on digital 4
int res = 5; // reset pins on digital 5
int freq[7]; // store band values in this array
int band;
int numLed = 12; // number of LEDs in one band strip
Adafruit_NeoPixel strip = Adafruit_NeoPixel(7*numLed, PIN, NEO_GRB + NEO_KHZ800);
void setup()
{
Serial.begin(115200);
strip.begin();
strip.show();
pinMode(res, OUTPUT); // reset
pinMode(strobe, OUTPUT); // strobe
digitalWrite(res,LOW); // reset low
digitalWrite(strobe,HIGH); //pin 5 is RESET on the shield
}
void readMSGEQ7()
// Function to read 7 band equalizers
{
digitalWrite(res, HIGH);
digitalWrite(res, LOW);
for(band = 0; band <7; band++)
{
digitalWrite(strobe,LOW); // strobe pin on the shield - kicks the IC up to the next band
delayMicroseconds(30); //
freq[band] = map(analogRead(0),0,1023,1,numLed); // store frequency reading
digitalWrite(strobe,HIGH);
}
}
void setPixel(){
for(int i = 0; i < numLed; ++i){
if(i < freq[0]){
strip.setPixelColor(i,255,0,0);// red for 63 hz
}
else{
strip.setPixelColor(i,0,0,0);
}
if(i < freq[1]){
strip.setPixelColor(i+numLed,255,20,0);// orange for 160hz
}
else{
strip.setPixelColor(i+numLed,0,0,0);
}
if(i < freq[2]){
strip.setPixelColor(i+ 2*numLed,255,215,0);// yellow for 400 hz
}
else{
strip.setPixelColor(i+ 2*numLed,0,0,0);
}
if(i < freq[3]){
strip.setPixelColor(i+ 3*numLed,0,255,0);//green for 1khz
}
else{
strip.setPixelColor(i+ 3*numLed,0,0,0);
}
if(i < freq[4]){
strip.setPixelColor(i+ 4*numLed,0,0,255);//blue for 2.5khz
}
else{
strip.setPixelColor(i+ 4*numLed,0,0,0);
}
if(i < freq[0]){
strip.setPixelColor(i+ 5*numLed,75,0,130);// Indigo for 6.25khz
}
else{
strip.setPixelColor(i+ 5*numLed,0,0,0);
}
if(i < freq[0]){
strip.setPixelColor(i+ 6*numLed,238,130,238);//violet for 16khz
}
else{
strip.setPixelColor(i+ 6*numLed,0,0,0);
}
}
strip.show();
}
void loop()
{
readMSGEQ7();
// display values of freqyency on serial monitor for testing purposes
for (band = 0; band < 7; band++)
{
Serial.print(freq[band]);
Serial.print(" ");
}
Serial.println();
setPixel();
delay(20);
}
FU6DCQCJPN3JP5S.ino
2.26KB










更多相关项目
猜你喜欢
评论/提问(已发布 0 条)

