7 频段 LED 音乐灯

ChangeCode
转载
发布时间: 2025-06-14 15:18:25 | 阅读数 0收藏数 0评论数 0
封面
这是一个项目,它接收一个连续的模拟信号(通常为音乐信号),并利用其驱动一个7频段LED音频可视化器。系统通过MSGEQ7芯片对音乐信号进行频谱分析,提取不同频率段的强度数据,并将这些数据映射到LED灯带上。所使用的LED灯带型号为SK6812,这是一种可编程RGB LED灯带。

准备工作:

材料:

使用的材料:

  1. MSGEQ7 频率分析芯片
  2. 3.5 毫米母插孔(用于音频输入)
  3. 2 个 22k 欧姆电阻
  4. 0.01 微法电容
  5. 2 个 0.1 微法电容
  6. 200 千欧姆电阻
  7. 33 皮法电容
  8. Arduino Uno 开发板
  9. SK6812 RGB LED 灯带(也称作 WS2811Adafruit NeoPixel

说明:

  1. MSGEQ7 是用于音频频谱分析的核心芯片,可提取音乐信号的7个频段强度。
  2. SK6812/WS2811/Adafruit NeoPixel 是可编程 RGB LED 灯带,支持通过单线协议控制颜色和亮度。
  3. 电阻和电容用于电路滤波和信号稳定,需按图示接线。
1

制作3.5毫米插孔

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

2

连接Arduino和MSGEQ7

按照原理图连接IC。

Reset 接到Arduino上的数字引脚8。

Str频闪 转到Arduino上的数字引脚5。

DC输出的直流到模拟量A0

LED的数据输入到Arduino上的数字引脚6。

PDF
FDC3BHBJPLIZKMD.pdf
145.54KB
3

LEDs

如果你想实现复古风格的可视化效果

硬件组装说明

  1. LED灯条焊接
  2. 使用 7条LED灯条,将其依次焊接在 卡片式电路板(Cardstock PCB) 上。
  3. 避免使用实心焊丝(Solid-core wire),因其难以牢固附着在电路板焊盘(Pads)上。
  4. 数据信号连接
  5. 将LED灯带的数据输入端连接至 Arduino的数字引脚6(D6)
  6. 电源与电流注意事项
  7. 每个LED的最大工作电流为 80毫安(mA)
  8. 若使用 60个LED,总电流可达 4.8安培(A)(60 × 0.08A = 4.8A)。
  9. 电源需求:建议使用 旧的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);
}



INO
FU6DCQCJPN3JP5S.ino
2.26KB
阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载