165浏览
查看: 165|回复: 1

[项目] 【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

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

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

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

驴友花雕  中级技神
 楼主|

发表于 7 天前

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

项目代码

  1. #include <arduinoFFT.h>
  2. #include <MD_MAX72xx.h>
  3. #include <SPI.h>
  4. #include <Adafruit_GFX.h>
  5. #include <Max72xxPanel.h>
  6. #define SAMPLES 64
  7. #define HARDWARE_TYPE MD_MAX72XX::FC16_HW
  8. #define MAX_DEVICES  4
  9. #define CLK_PIN   13
  10. #define DATA_PIN  11
  11. #define CS_PIN    10
  12. #define  xres 32
  13. #define  yres 8
  14. int MY_ARRAY[] = {0, 1, 3, 7, 15, 31, 63, 127, 255};
  15. double vReal[SAMPLES];
  16. double vImag[SAMPLES];
  17. char data_avgs[xres];
  18. int yvalue;
  19. int displaycolumn , displayvalue;
  20. int peaks[xres];
  21. int pinCS = 10;
  22. MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
  23. arduinoFFT FFT = arduinoFFT();
  24. void setup() {
  25.   ADCSRA = 0b11100101;
  26.   ADMUX = 0b00000000;
  27.   mx.begin();
  28.   delay(50);
  29. }
  30. void loop() {
  31.    
  32.     for (int i = 0; i < SAMPLES; i++)
  33.     {
  34.       while (!(ADCSRA & 0x10));
  35.       ADCSRA = 0b11110101 ;
  36.       int value = ADC - 512 ;
  37.       vReal[i] = value / 8;
  38.       vImag[i] = 0;
  39.     }
  40.     FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
  41.     FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD);
  42.     FFT.ComplexToMagnitude(vReal, vImag, SAMPLES);
  43.     int step = (SAMPLES / 2) / xres;
  44.     int c = 0;
  45.     for (int i = 0; i < (SAMPLES / 2); i += step)
  46.     {
  47.       data_avgs[c] = 0;
  48.       for (int k = 0 ; k < step ; k++) {
  49.         data_avgs[c] = data_avgs[c] + vReal[i + k];
  50.       }
  51.       data_avgs[c] = data_avgs[c] / step;
  52.       c++;
  53.     }
  54.     for (int i = 0; i < xres; i++)
  55.     {
  56.       data_avgs[i] = constrain(data_avgs[i], 0, 40);
  57.       data_avgs[i] = map(data_avgs[i], 0, 40, 0, yres);
  58.       yvalue = data_avgs[i];
  59.       peaks[i] = peaks[i] - 1;
  60.       if (yvalue > peaks[i])
  61.         peaks[i] = yvalue ;
  62.       yvalue = peaks[i];
  63.       displayvalue = MY_ARRAY[yvalue];
  64.       displaycolumn = 31 - i;
  65.       mx.setColumn(displaycolumn, displayvalue);
  66.     }
  67.   }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail