241浏览
查看: 241|回复: 31

[项目] 【花雕动手做】看见声音,基于Arduino系列音乐可视器(2)

[复制链接]
偶然脑子发热心血来潮,想要做一个声音可视化的系列专题。这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,逐步积累些有用的音乐频谱可视化的资料,也会争取成型一些实用好玩的音乐可视器项目。


【花雕动手做】看见声音,基于Arduino系列音乐可视器(2)
为做这个项目,特意准备了四种规格的OLED有机屏幕


0.jpg

驴友花雕  初级技神
 楼主|

发表于 2021-10-6 07:04:04

【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
  项目之三:32段分频0.91寸OLED液晶可视化细条频谱灯

  实验开源代码

  1. /*
  2. 【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
  3.   项目之三:32段分频0.91寸OLED液晶可视化细条频谱灯
  4.   实验接线: max9814接A0
  5.   oled模块    Ardunio Uno
  6.   GND---------GND接地线
  7.   VCC---------5V 接电源
  8.   SDA---------A4
  9.   SCL ------- A5
  10. */
  11. #include <fix_fft.h>                  
  12. #include <ssd1306.h>                  
  13. #include <nano_engine.h>              
  14. // These are user-adjustable
  15. #define LOG_OUTPUT                 // Uncomment to enable logarithmic output (exchanges absolute resoluton for more readable output; may require different below params)
  16. #define SAMPLING_FREQUENCY 15000  // Sampling frequency (Actual max measured frequency captured is half)
  17. #define TIME_FACTOR 2             // Smoothing factor (lower is more dynamic, higher is smoother) ranging from 1 to 10+
  18. #define SCALE_FACTOR 15           // Direct scaling factor (raise for higher bars, lower for shorter bars)
  19. #ifdef LOG_OUTPUT
  20. const float log_scale = 64. / log(64. / SCALE_FACTOR + 1.);    // Attempts to create an equivalent to SCALE_FACTOR for log function
  21. #endif
  22. const float coeff = 1. / TIME_FACTOR;                         // Time smoothing coefficients (used to factor in previous data)
  23. const float anti_coeff = (TIME_FACTOR - 1.) / TIME_FACTOR;
  24. const unsigned int sampling_period_us = round(1000000 * (2.0 / SAMPLING_FREQUENCY)); // Sampling period (doubled to account for overclock)
  25. int8_t data[64], buff[32];                                     // used to store FFT input/output and past data
  26. unsigned long microseconds;                                    // used for timekeeping
  27. int summ, avg;                                                 // used for DC bias elimination
  28. NanoEngine<TILE_32x32_MONO> engine;                            // declares nanoengine
  29. void setup()
  30. {
  31.   OSCCAL = 240; // Overclocks the MCU to around 30 MHz, set lower if this causes instability, raise if you can/want
  32.   ADCSRA &= ~(bit (ADPS0) | bit (ADPS1) | bit (ADPS2));       // clear ADC prescaler bits
  33.   ADCSRA |= bit (ADPS2);                                      // sets ADC clock in excess of 10kHz
  34.   ADCSRA |= bit (ADPS0);
  35.   ssd1306_128x64_i2c_init();                                  // initializes OLED
  36.   ssd1306_clearScreen();                                      // clears OLED
  37.   engine.begin();                                             // inititalizes nanoengine
  38. };
  39. void loop()
  40. {
  41.   summ = 0;
  42.   for (int i = 0; i < 64; i++) {
  43.     microseconds = micros();
  44.     data[i] = ((analogRead(A0)) >> 2) - 128;                        // Fitting analogRead data (range:0 - 1023) to int8_t array (range:-128 - 127)
  45.     summ += data[i];
  46.     while (micros() < (microseconds + sampling_period_us)) {        // Timing out uC ADC to fulfill sampling frequency requirement
  47.     }
  48.   }
  49.   // Eliminating remaining DC component (produces usable data in FFT bin #0, which is usually swamped by DC bias)
  50.   avg = summ / 64;
  51.   for (int i = 0; i < 64; i++) {
  52.     data[i] -= avg;
  53.   }
  54.   fix_fftr(data, 6, 0);                             // Performing real FFT
  55.   // Time smoothing by user-determined factor and user-determined scaling
  56.   for (int count = 0; count < 32; count++) {
  57.     if (data[count] < 0) data[count] = 0;                                         // Eliminating negative output of fix_fftr
  58. #ifdef LOG_OUTPUT
  59.     else data[count] = log_scale * log((float)(data[count] + 1));                 // Logarithmic function equivalent to SCALING_FACTOR*log2(x+1)
  60. #else
  61.     else data[count] *= SCALE_FACTOR;                                             // Linear scaling up according to SCALE_FACTOR
  62. #endif
  63.     data[count] = (float)buff[count] * anti_coeff + (float)data[count] * coeff;   // Smoothing by factoring in past data
  64.     buff[count] = data[count];                                                    // Storing current output as next frame's past data
  65.     if (data[count] > 63) data[count] = 63;                                       // Capping output at screen height
  66.   }
  67.   // Output to SSD1306 using nanoengine canvas from library
  68.   engine.refresh();                                               // Mark entire screen to be refreshed
  69.   engine.canvas.clear();                                          // Clear canvas as previous data
  70.   for (int i = 0; i < 8; i++) {
  71.     engine.canvas.drawVLine(i * 4, 31 - (data[i] + 1), 31);  // Draw to canvas data for lower-leftest sector (FFT bins 0 - 7, lower half)
  72.   }
  73.   engine.canvas.blt(0, 32);                                       // Outputs canvas to OLED with an offset (x pixels, y pixels)
  74.   engine.canvas.clear();
  75.   for (int i = 0; i < 8; i++) {
  76.     if (data[i] > 31) engine.canvas.drawVLine(i * 4, 31 - (data[i] - 31), 31); // Draw to canvas data for upper-leftest sector (FFT bins 0 - 7, upper half)
  77.   }
  78.   engine.canvas.blt(0, 0);
  79.   engine.canvas.clear();
  80.   for (int i = 8; i < 16; i++) {
  81.     engine.canvas.drawVLine((i - 8) * 4, 31 - (data[i] + 1), 31); // FFT bins 8 - 15, lower half
  82.   }
  83.   engine.canvas.blt(32, 32);
  84.   engine.canvas.clear();
  85.   for (int i = 8; i < 16; i++) {
  86.     if (data[i] > 31) engine.canvas.drawVLine((i - 8) * 4, 31 - (data[i] - 31), 31); // FFT bins 9 - 15, upper half
  87.   }
  88.   engine.canvas.blt(32, 0);
  89.   engine.canvas.clear();
  90.   for (int i = 16; i < 24; i++) {
  91.     engine.canvas.drawVLine((i - 16) * 4, 31 - (data[i] + 1), 31); // FFT bins 16 - 23, lower half
  92.   }
  93.   engine.canvas.blt(64, 32);
  94.   engine.canvas.clear();
  95.   for (int i = 16; i < 24; i++) {
  96.     if (data[i] > 31) engine.canvas.drawVLine((i - 16) * 4, 31 - (data[i] - 31), 31); // FFT bins 16 - 23, upper half
  97.   }
  98.   engine.canvas.blt(64, 0);
  99.   engine.canvas.clear();
  100.   for (int i = 24; i < 32; i++) {
  101.     engine.canvas.drawVLine((i - 24) * 4, 31 - (data[i] + 1), 31); // FFT bins 24 - 31, lower half
  102.   }
  103.   engine.canvas.blt(96, 32);
  104.   engine.canvas.clear();
  105.   for (int i = 24; i < 32; i++) {
  106.     if (data[i] > 31) engine.canvas.drawVLine((i - 24) * 4, 31 - (data[i] - 31), 31); // FFT bins 24 - 31, upper half
  107.   }
  108.   engine.canvas.blt(96, 0);
  109. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 17:03:59

本帖最后由 驴友花雕 于 2021-10-6 07:04 编辑

  【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
  项目之二:11段分频0.91寸OLED液晶屏声音可视化频谱灯


  实验开源代码

  1. /*
  2.   【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
  3.   项目之二:0.91寸OLED液晶屏声音可视化频谱灯
  4.   实验接线: max9814接A0
  5.   oled模块    Ardunio Uno
  6.   GND---------GND接地线
  7.   VCC---------5V 接电源
  8.   SDA---------A4
  9.   SCL ------- A5
  10. */
  11. #include "arduinoFFT.h"
  12. #include <Adafruit_GFX.h>
  13. #include <Adafruit_SSD1306.h>
  14. #define SAMPLES 64 // power of 2
  15. #define SAMPLING_FREQ 8000 // 12 kHz Fmax = sampleF /2
  16. #define AMPLITUDE 100 // 灵敏度
  17. #define FREQUENCY_BANDS 14
  18. #define SCREEN_WIDTH 128
  19. #define SCREEN_HEIGHT 32
  20. #define BARWIDTH 11
  21. #define BARS 11
  22. #define ANALOG_PIN A0
  23. #define OLED_RESET     -1 // 重置引脚 #(如果共享 Arduino 重置引脚,则为 -1)
  24. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
  25. double vImag[SAMPLES];
  26. double vReal[SAMPLES];
  27. unsigned long sampling_period_us;
  28. arduinoFFT fft = arduinoFFT(vReal, vImag, SAMPLES, SAMPLING_FREQ);
  29. //调整参考以去除背景噪声
  30. float reference = log10(60.0);
  31. double coutoffFrequencies[FREQUENCY_BANDS];
  32. void setup() {
  33.   // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  34.   if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
  35.     for (;;); // Don't proceed, loop forever
  36.   }
  37.   // Setup display
  38.   display.clearDisplay();
  39.   display.display();
  40.   display.setRotation(0);
  41.   display.invertDisplay(false);
  42.   sampling_period_us = (1.0 / SAMPLING_FREQ ) * pow(10.0, 6);
  43.   // 计算截止频率,以对数标度为基数 POt
  44.   double basePot = pow(SAMPLING_FREQ / 2.0, 1.0 / FREQUENCY_BANDS);
  45.   coutoffFrequencies[0] = basePot;
  46.   for (int i = 1 ; i < FREQUENCY_BANDS; i++ ) {
  47.     coutoffFrequencies[i] = basePot * coutoffFrequencies[i - 1];
  48.   }
  49.   // 绘制虚线以分离频段
  50.   for (int i = 0; i < BARS - 1 ; i++) {
  51.     for (int j = 0; j < SCREEN_HEIGHT ; j += 4) {
  52.       display.writePixel((i + 1)*BARWIDTH + 2 , j, SSD1306_WHITE );
  53.     }
  54.   }
  55.   display.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SSD1306_WHITE);
  56. }
  57. int oldHeight[20];
  58. int oldMax[20];
  59. double maxInFreq;
  60. void loop() {
  61.   // 采样
  62.   for (int i = 0; i < SAMPLES; i++) {
  63.     unsigned long newTime = micros();
  64.     int value = analogRead(ANALOG_PIN);
  65.     vReal[i] = value;
  66.     vImag[i] = 0;
  67.     while (micros() < (newTime + sampling_period_us)) {
  68.       yield();
  69.     }
  70.   }
  71.   // 计算 FFT
  72.   fft.DCRemoval();
  73.   fft.Windowing(FFT_WIN_TYP_HAMMING, FFT_FORWARD);
  74.   fft.Compute(FFT_FORWARD);
  75.   fft.ComplexToMagnitude();
  76.   double median[20];
  77.   double max[20];
  78.   int index = 0;
  79.   double hzPerSample = (1.0 * SAMPLING_FREQ) / SAMPLES; //
  80.   double hz = 0;
  81.   double maxinband = 0;
  82.   double sum = 0;
  83.   int count = 0;
  84.   for (int i = 2; i < (SAMPLES / 2) ; i++) {
  85.     count++;
  86.     sum += vReal[i];
  87.     if (vReal[i] >  max[index] ) {
  88.       max[index] = vReal[i];
  89.     }
  90.     if (hz > coutoffFrequencies[index]) {
  91.       median[index] = sum / count;
  92.       sum = 0.0;
  93.       count = 0;
  94.       index++;
  95.       max[index] = 0;
  96.       median[index]  = 0;
  97.     }
  98.     hz += hzPerSample;
  99.   }
  100.   // 计算每个频段的中值和最大值
  101.   if ( sum > 0.0) {
  102.     median[index] =  sum / count;
  103.     if (median[index] > maxinband) {
  104.       maxinband = median[index];
  105.     }
  106.   }
  107.   int bar = 0;
  108.   for (int i = FREQUENCY_BANDS - 1; i >= 3; i--) {
  109.     int newHeight = 0;
  110.     int newMax = 0;
  111.     // 计算实际分贝
  112.     if (median[i] > 0 && max[i] > 0 ) {
  113.       newHeight = 20.0 * (log10(median[i] ) - reference);
  114.       newMax = 20.0 * (log10(max[i] ) - reference);
  115.     }
  116.     // 调整最小和最大级别
  117.     if (newHeight < 0 ||  newMax < 0) {
  118.       newHeight = 1;
  119.       newMax = 1;
  120.     }
  121.     if (newHeight >= SCREEN_HEIGHT - 2) {
  122.       newHeight = SCREEN_HEIGHT - 3;
  123.     }
  124.     if (newMax >= SCREEN_HEIGHT - 2) {
  125.       newMax = SCREEN_HEIGHT - 3;
  126.     }
  127.     int barX = bar * BARWIDTH + 5;
  128.     // 删除旧水平中位数
  129.     if (oldHeight[i] > newHeight) {
  130.       display.fillRect(barX, newHeight + 1, 7, oldHeight[i], SSD1306_BLACK);
  131.     }
  132.     // 删除旧的最大级别
  133.     if ( oldMax[i] > newHeight) {
  134.       for (int j = oldMax[i]; j > newHeight; j -= 2) {
  135.         display.drawFastHLine(barX , j, 7, SSD1306_BLACK);
  136.       }
  137.     }
  138.     // 绘制新的最大级别
  139.     for (int j = newMax; j > newHeight; j -= 2) {
  140.       display.drawFastHLine(barX , j, 7,  SSD1306_WHITE);
  141.     }
  142.     // 绘制新的级别中位数
  143.     display.fillRect(barX , 1, 7, newHeight, SSD1306_WHITE);
  144.     oldMax[i] = newMax;
  145.     oldHeight[i] = newHeight;
  146.     bar++;
  147.   }
  148.   display.drawFastHLine(0 , SCREEN_HEIGHT - 1, SCREEN_WIDTH, SSD1306_WHITE);
  149.   display.display();
  150. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-4 13:27:56

Arduino 系列传感器和执行器模块实验目录清单:
一块扩展板完成Arduino的10类37项实验(代码+图形+仿真)
https://mc.dfrobot.com.cn/thread-280845-1-1.html
连杆形式的腿机构十一种:盘点机器人行走背后的机械原理
https://mc.dfrobot.com.cn/thread-308097-1-1.html
【花雕动手做】超低成本,尝试五十元的麦克纳姆轮小车!
https://mc.dfrobot.com.cn/thread-307863-1-1.html
【花雕动手做】超迷你哦,用徽商香烟盒做个智能小车!
https://mc.dfrobot.com.cn/thread-307907-1-1.html
【花雕动手做】太搞笑啦,一支胶管制成二只蠕动机器人
https://mc.dfrobot.com.cn/thread-308046-1-1.html
【花雕动手做】快餐盒盖,极低成本搭建机器人实验平台
https://mc.dfrobot.com.cn/thread-308063-1-1.html
【花雕动手做】特别苗条,使用微波传感器控制的纤细小车
https://mc.dfrobot.com.cn/thread-308866-1-1.html
【花雕动手做】脑洞大开、五花八门的简易机器人66种
https://mc.dfrobot.com.cn/thread-307900-1-1.html
【花雕动手做】音乐可视化系列小项目(01)---LED节奏灯
https://mc.dfrobot.com.cn/thread-311167-1-1.html
【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
https://mc.dfrobot.com.cn/thread-311174-1-1.html


实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
https://mc.dfrobot.com.cn/thread-308195-1-1.html
实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪  I2C/SPI 14LGA
https://mc.dfrobot.com.cn/thread-310371-1-1.html
实验一百六十五:2.4 英寸 TFT LCD 触摸屏模块 XPT2046 PCB ILI9341 240x320 像素 8 位 SPI 串口显示器 300mA
https://mc.dfrobot.com.cn/thread-309803-1-1.html
实验一百七十六:6mm大尺寸8x8LED方块方格点阵模块 可级联 红绿蓝白色 可选8级亮度
https://mc.dfrobot.com.cn/thread-309845-1-1.html
实验一百八十一:1.3寸OLED液晶屏  I2C IIC通信 4针模块 1106/1306驱动 128*64像素
https://mc.dfrobot.com.cn/thread-311123-1-1.html
实验一百八十三:GY-530 VL53L0X 激光测距 ToF测距 飞行时间测距传感器模块 IIC通信协议
https://mc.dfrobot.com.cn/thread-310273-1-1.html
实验一百八十五:MAX4466声音传感器 驻极体话筒放大器 麦克风可调功放模块 microphone
https://mc.dfrobot.com.cn/thread-310193-1-1.html
实验一百八十九:TDA1308 硅麦克风 数字咪头放大模块 拾音器放大板 楼氏SUNLEPHANT
https://mc.dfrobot.com.cn/thread-310246-1-1.html
实验一百九十三:TCS34725颜色识别传感器 RGB IIC明光感应模块 ColorSensor
https://mc.dfrobot.com.cn/thread-310209-1-1.html
实验二百:RCWL-0515微波雷达感应开关 人体感应 智能感应探测传感器 12-15米远距离2.7G微波检测模块
https://mc.dfrobot.com.cn/thread-310313-1-1.html
实验二百零一:OPT101模拟光照传感器 TEMT6000光强度模块 单片光电二极管 YourCee
https://mc.dfrobot.com.cn/thread-311164-1-1.html
实验二百零三:Air724UG合宙 Cat14G模块 DTU物联网UART串口通信数据TCP透传 核心板组合套餐
https://mc.dfrobot.com.cn/thread-310342-1-1.html
实验二百零七:I2C红色8*8LED点阵模块ht16k33驱动1088BS树莓派物联网可扩展编程
https://mc.dfrobot.com.cn/thread-310951-1-1.html
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块 NB-IoT广域低功耗无线通信 GPS/北斗精准定位
https://mc.dfrobot.com.cn/thread-310433-1-1.html

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-4 13:50:26

OLED (Organic Light-Emitting Diode)
即有机发光二极管,在手机OLED上属于新型产品,被称誉为“梦幻显示器”。OLED显示技术与传统的LCD显示方式不同,无需背光灯,采用非常薄的有机材料涂层和玻璃基板(或柔性有机基板),当有电流通过时,这些有机材料就会发光。而且OLED显示屏幕可以做得更轻更薄,可视角度更大,并且能够显著的节省耗电量。

0--.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-4 13:53:54

本帖最后由 驴友花雕 于 2021-10-4 14:28 编辑

07.jpeg

OLED技术特点
(1) OLED 器件的核心层厚度很薄,厚度可以小于 1mm,为液晶的 1/3。
(2) OLED 器件为全固态机构,无真空,液体物质,抗震性好,可以适应巨大的加速度,振动等恶劣环境。
(3) 主动发光的特性使 OLED 几乎没有视角限制,视角一般可达到 170 度,具有较宽的视角,从侧面也不会失真。
(4) OLED 显示屏的响应时间超过 TFT—LCD 液晶屏。TFT—LCD 的响应时间大约使几十毫秒,现在做得最好的 TFT—LCD 响应时间也只有 12 毫秒。而 OLED 显示屏的响应时间大约是几微秒到几十微秒。
(5) OLED 低温特性好,在零下 40 摄氏度都能正常显示,目前航天服上也使用OLED 作为显示屏。而 TFT—LCD 的响应速度随温度发生变化,低温下,其响应速度变慢,因此,液晶在低温下显示效果不好。
(6) OLED 采用有机发光原理,所需材料很少,制作上比采用液体发光的液晶工序少,液晶显示屏少 3 道工序,成本大幅降低。
(7) OLED 采用的二极管会自行发光,因此不需要背面光源,发光转化效率高,能耗比液晶低,OLED 能够在不同材质的基板上制造,厂家甚至可以将电路印刷在弹性材料上——做成能弯曲的柔软显示器。
(8) 低电压直流驱动,5V 以下,用电池就能点亮。高亮度,可达 300 明流以上。
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 11:22:03

主要的实验材料


01.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 11:45:09

000.jpg


MAX9814麦克风放大器模块

MAX9814是一款低成本高性能麦克风放大器,具有自动增益控制(AGC)和低噪声麦克风偏置。器件具有低噪声前端放大器、可变增益放大(VGA)、输出放大器、麦克风偏置电压发生器和AGC控制电路。
●自动增益控制(AGC)  
●3种增益设置(40dB、50dB、60dB)  
●可编程动作时间  
●可编程动作和释放时间比  
●电源电压范围2.7V~5.5V   
●低THD:0.04% (典型值)  
●低功耗关断模式  
●内置2V低噪声麦克风偏置
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 13:50:28

MAX9814麦克风放大器模块电原理图


07.jpg

07-.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 14:29:04

0.91寸OLED液晶屏显示模块参数
驱动芯片:SSD1306
支持接口:I2C
显示颜色:白色
高分辨率: 128×32
可视角度:大于160°
工作电压:3.3V / 5V
模块大小:36 x 12.5(mm)



0-0.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 14:37:40

0.96寸OLED模块主要参数
电压:3V~5V DC
工作温度:-30℃~70℃
驾驶义务:1/64职责
高分辨率:128 * 64
面板尺寸:26.70 * 19.26 * 1.85mm / 1.03 * 0.76 * 0.07英寸(约)
有效面积:21.74 * 11.2mm /0.86*0.44英寸(约)
驱动IC:SSD1306
128 * 64 LED显示模块,支持多种控制芯片。
完全兼容51系列,MSP430系列,STM32 / 2,CSR IC等
超低功耗:全屏点亮0.08W
超高亮度和对比度可调
带嵌入式驱动/控制器
接口类型为IIC

0-.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 16:21:21

本帖最后由 驴友花雕 于 2021-10-6 07:05 编辑

  【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
  项目之一:使用MAX9814声音模块测试环境音乐的动态波形


  实验开源代码

  1. /*
  2.   【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
  3.   项目之一:使用MAX9814声音模块测试环境音乐的动态波形
  4.   实验接线:
  5.   MAX9814  Arduino
  6.   VCC        5V
  7.   GND        GND
  8.   OUT        A0
  9. */
  10. const int sampleWindow = 50; // 以mS为单位的采样窗口宽度(50 mS = 20Hz)
  11. unsigned int sample;
  12. void setup() {
  13.   Serial.begin(9600);
  14.   pinMode(A0, INPUT);
  15. }
  16. void loop() {
  17.   unsigned long startMillis = millis(); // 样本窗口的开始
  18.   unsigned int peakToPeak = 0;   // 峰峰值
  19.   unsigned int signalMax = 0;
  20.   unsigned int signalMin = 1024;
  21.   // collect data for 50 mS
  22.   while (millis() - startMillis < sampleWindow)
  23.   {
  24.     sample = analogRead(A0);
  25.     if (sample < 1024)  // 抛出错误的读数
  26.     {
  27.       if (sample > signalMax)
  28.       {
  29.         signalMax = sample;  // 只保存最大级别
  30.       }
  31.       else if (sample < signalMin)
  32.       {
  33.         signalMin = sample;  // 仅保存最低级别
  34.       }
  35.     }
  36.   }
  37.   peakToPeak = signalMax - signalMin;  // max-min =峰峰值幅度
  38.   double volts = (peakToPeak * 5.0) / 166;
  39.   Serial.println(volts);
  40. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 16:27:15

实验串口返回情况

03.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 16:32:25

打开IDE的串口绘图器

04.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 16:39:02

05.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 16:42:10

  实验场景图

06.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 16:47:15

  【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
  项目之一:使用MAX9814声音模块测试环境音乐的动态波形

  实验视频剪辑

https://v.youku.com/v_show/id_XN ... hcb.playlsit.page.1



回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 16:49:33

  实验场景图  动态图

06.gif
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 17:44:08

  实验场景图

07.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 19:01:03

  【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
  项目之二:0.91寸OLED液晶屏声音可视化频谱灯

  实验视频剪辑

https://v.youku.com/v_show/id_XN ... hcb.playlsit.page.1



回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 19:12:24

  实验场景图  动态图

09.gif
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 19:17:41

【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
   项目之三:0.96寸OLED液晶屏声音可视化频谱灯
   实验视频剪辑

https://v.youku.com/v_show/id_XN ... hcb.playlsit.page.1



回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail