驴友花雕 发表于 2025-6-22 16:17:11

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

今天我们将使用 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







驴友花雕 发表于 2025-6-22 16:19:05

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

项目代码

#include <arduinoFFT.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#define SAMPLES 64
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES4
#define CLK_PIN   13
#define DATA_PIN11
#define CS_PIN    10
#definexres 32
#defineyres 8
int MY_ARRAY[] = {0, 1, 3, 7, 15, 31, 63, 127, 255};
double vReal;
double vImag;
char data_avgs;
int yvalue;
int displaycolumn , displayvalue;
int peaks;
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 = value / 8;
      vImag = 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 = 0;
      for (int k = 0 ; k < step ; k++) {
      data_avgs = data_avgs + vReal;
      }
      data_avgs = data_avgs / step;
      c++;
    }

    for (int i = 0; i < xres; i++)
    {
      data_avgs = constrain(data_avgs, 0, 40);
      data_avgs = map(data_avgs, 0, 40, 0, yres);
      yvalue = data_avgs;

      peaks = peaks - 1;
      if (yvalue > peaks)
      peaks = yvalue ;
      yvalue = peaks;
      displayvalue = MY_ARRAY;
      displaycolumn = 31 - i;
      mx.setColumn(displaycolumn, displayvalue);
    }
}

页: [1]
查看完整版本: 【Arduino 动手做】如何DIY 32波段LED音频音乐频谱分析仪