【Arduino 动手做】如何DIY 32波段LED音频音乐频谱分析仪

2025-06-221416
AI 快速预览详细 收起
本文介绍了如何使用Arduino制作32波段LED音频音乐频谱分析仪。该项目使用了Arduino Nano、max7219点阵LED、100k电阻等组件。通过将max7219LED接在100k电阻前面,可以有效减少扬声器的噪音。GitHub提供了详细的方案和草图,适合初学者进行电子项目实践。
今天我们将使用 Arduino 在家制作一个 32 波段 LED 音频音乐频谱分析仪,它可以显示频谱并同时播放音乐。

max7219LED必须接在100k电阻前面,否则扬声器的噪音会很大。

► GitHub(方案和草图):https://github.com/DKARDU/spectrum-

► 组件

该项目使用了以下部件:

Arduino Nano,https://amzn.to/3hB8Pwf

两个 100K 电阻,https://amzn.to/2OSGlBW

三个 4.7K 电阻,https://amzn.to/2OSGlBW

两个104电容(104=100000pF=100nF=0.10μF),

4 合 1 Max7219 点阵 LED,https://amzn.to/3jcCL2G

PJ-320D 3.5MM音频插座,

跳线,https://amzn.to/3jCHhZd

面包板,https://amzn.to/33yEavN

3W PAM8403 D类音频放大器和两个扬声器,

使用的Arduino IDE版本是1.8.12

【Arduino 动手做】如何DIY 32波段LED音频音乐频谱分析仪图1

【Arduino 动手做】如何DIY 32波段LED音频音乐频谱分析仪图2

【Arduino 动手做】如何DIY 32波段LED音频音乐频谱分析仪图3

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(1)
驴友花雕
驴友花雕
作者
项目代码
[code]#include
#include
#include
#include
#include
#define SAMPLES 64
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
#define xres 32
#define yres 8
int MY_ARRAY[] = {0, 1, 3, 7, 15, 31, 63, 127, 255};
double vReal[SAMPLES];
double vImag[SAMPLES];
char data_avgs[xres];
int yvalue;
int displaycolumn , displayvalue;
int peaks[xres];
int pinCS = 10;
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
arduinoFFT FFT = arduinoFFT();
void setup() {
ADCSRA = 0b11100101;
ADMUX = 0b00000000;
mx.begin();
delay(50);
}
void loop() {
for (int i = 0; i < SAMPLES; i++)
{
while (!(ADCSRA & 0x10));
ADCSRA = 0b11110101 ;
int value = ADC - 512 ;
vReal[i] = value / 8;
vImag[i] = 0;
}
FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD);
FFT.ComplexToMagnitude(vReal, vImag, SAMPLES);
int step = (SAMPLES / 2) / xres;
int c = 0;
for (int i = 0; i < (SAMPLES / 2); i += step)
{
data_avgs[c] = 0;
for (int k = 0 ; k < step ; k++) {
data_avgs[c] = data_avgs[c] + vReal[i + k];
}
data_avgs[c] = data_avgs[c] / step;
c++;
}
for (int i = 0; i < xres; i++)
{
data_avgs[i] = constrain(data_avgs[i], 0, 40);
data_avgs[i] = map(data_avgs[i], 0, 40, 0, yres);
yvalue = data_avgs[i];
peaks[i] = peaks[i] - 1;
if (yvalue > peaks[i])
peaks[i] = yvalue ;
yvalue = peaks[i];
displayvalue = MY_ARRAY[yvalue];
displaycolumn = 31 - i;
mx.setColumn(displaycolumn, displayvalue);
}
}[/code]
- 没有更多了 -