数码之家

标题: 【花雕动手做】有趣好玩的音乐可视化项目(02)---OLED频谱灯 [打印本页]

作者: eagler8    时间: 2021-10-4 11:49
标题: 【花雕动手做】有趣好玩的音乐可视化项目(02)---OLED频谱灯
本帖最后由 eagler8 于 2021-10-5 19:40 编辑

为做这个项目,特意准备了四种规格的OLED有机屏幕


[attach]1293287[/attach]

作者: ww5223017240    时间: 2021-10-4 12:13
频谱灯这东西真心看不懂,难道一边听音乐一边在那看着这个闪?啥意义?:doubt:
作者: eagler8    时间: 2021-10-4 13:33
本帖最后由 eagler8 于 2021-10-7 05:36 编辑

Arduino 系列传感器和执行器模块实验目录清单:
【花雕动手做】音乐可视化系列小项目(01)---LED节奏灯
https://www.mydigit.cn/thread-278513-1-1.html
【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
https://www.mydigit.cn/thread-278659-1-1.html
【花雕动手做】用快餐盒盖搭建极低成本的多种运动方式实验平台/机器人
https://www.mydigit.cn/thread-227134-1-1.html
【花雕动手做】超低成本,尝试做个五十元的麦克纳姆轮小车!
https://www.mydigit.cn/thread-220131-1-1.html
【花雕动手做】太搞笑啦,一支胶管制成二只蠕动机器人
https://www.mydigit.cn/thread-226476-1-1.html
【花雕动手做】超迷你哦,用徽商香烟盒做个智能小车!
https://www.mydigit.cn/thread-222085-1-1.html
【花雕动手做】五花八门的简易机器人66种
https://www.mydigit.cn/thread-221775-1-1.html
【花雕动手做】特别苗条,使用微波人体感应模块控制的纤细机器人小车
https://www.mydigit.cn/forum.php?mod=viewthread&tid=244463
素人学习Aduino编程的简单办法
https://www.mydigit.cn/forum.php?mod=viewthread&tid=34316
Arduino 语法手册的五个版本
https://www.mydigit.cn/thread-35089-1-1.html
ESP8266 Arduino开发环境搭建的五个备选地址
https://www.mydigit.cn/thread-40541-1-1.html
只用一块扩展板完成Arduino的9类37项实验(代码+图形+仿真)
https://www.mydigit.cn/thread-44343-1-1.html

37种传感器实验(Arduino)记录每一次小小的进步
https://www.mydigit.cn/thread-35315-1-1.html
实验一百一十五: 震动马达模块 高低电平振动小电机 智能可穿戴式产品震动提醒模块
https://www.mydigit.cn/thread-76804-1-1.html
实验一百一十六:NRF24L01+ 无线模块 功率加强版 2.4G无线收发通信模块 黑金刚
https://www.mydigit.cn/thread-76843-1-1.html
实验一百一十七:蓝色诺基亚5110屏 LCD液晶屏模块 兼容3310 LCD
https://www.mydigit.cn/thread-77142-1-1.html
实验一百一十八:US-015 高分辨超声波测距模块 超声波传感器 US-020升级版
https://www.mydigit.cn/thread-77594-1-1.html
实验一百一十九:HB100微波雷达感应模块 10.525GHz多普勒探测器探头传感器
https://www.mydigit.cn/thread-78082-1-1.html
实验一百二十: SIM800L GPRS 转接板GSM模块 microSIM卡带天线4频通讯模块
https://www.mydigit.cn/thread-75498-1-1.html
实验一百二十一:五向导航按键模块 5D摇杆 单片机 独立键盘开关 按钮 Your Cee
https://www.mydigit.cn/thread-78274-1-1.html
实验一百二十二: BBC microbit micro:bit,bit go,bit club python图形编程开发板
https://www.mydigit.cn/thread-76145-1-1.html
实验一百二十三: P10单红V706模组  32*16单元板LED显示屏
https://www.mydigit.cn/thread-78460-1-1.html
实验一百二十四: PS2鼠标 键盘插座接口 PS2模块
https://www.mydigit.cn/thread-78589-1-1.html
实验一百二十五: 升级版 WeMos D1 R2 WiFi UNO 开发板 基于ESP8266
https://www.mydigit.cn/thread-78843-1-1.html
实验一百二十六:JQ6500语音模块 MP3模块 MCU串口控制播报 一对一5路控制 音乐IC
https://www.mydigit.cn/thread-79043-1-1.html
实验一百二十七:JoyStick Shield PS2游戏摇杆扩展板 模拟键盘鼠标功能 大摇杆
https://www.mydigit.cn/thread-79290-1-1.html
实验一百二十八:日本夏普SHARP PM2.5 灰尘/粉尘传感器 GP2Y1014AU0F 带线
https://www.mydigit.cn/thread-79385-1-1.html
实验一百二十九:GY-302 数字量光强度检测 光照传感器 BH1750FVI 光线检测模块
https://www.mydigit.cn/thread-79661-1-1.html
实验一百三十:XD-203多功能扩展板Multi-function Shield模块(12合1版)
https://www.mydigit.cn/thread-79777-1-1.html
实验一百三十一:24位 WS2812 5050 RGB LED 内置全彩驱动彩灯 圆形开发板
https://www.mydigit.cn/thread-80667-1-1.html
实验一百三十二:WT588D语音模块 语音芯片 可反复擦写高音质语音下载16P-16M 蓝板HW-708
https://www.mydigit.cn/thread-81018-1-1.html
实验一百三十三:夏普GP2Y0A02YK0F 红外测距传感器模块 20-150cm 距离传感器
https://www.mydigit.cn/thread-81360-1-1.html
实验一百三十四:2004A液晶屏 20X4 J204A字符显示液晶模块 204A LCD/LCM 蓝屏5V(带背光 IIC/I2C)
https://www.mydigit.cn/thread-81914-1-1.html
实验一百三十五:ESP8266机智云开发板 ESP12F wifi模块(支持云端的智能硬件开发套件)
https://www.mydigit.cn/thread-82229-1-1.html
实验一百三十六:基于STM32F103RCT6及多种传感器的UFUN2.0升级开发板
https://www.mydigit.cn/thread-100457-1-1.html
实验一百三十七:IIC I2C电平转换模块 5-3v系统兼容 2路
https://www.mydigit.cn/thread-121468-1-1.html
实验一百三十八:中文TTS文本转语音合成模块 替代SYN6288和XFS5152
https://www.mydigit.cn/thread-121781-1-1.html
实验一百三十九:电流互感器模块 5A量程 单相 交流电流传感器模块
https://www.mydigit.cn/thread-122217-1-1.html
实验一百四十:YL-004老款20按键独立键盘 跑马灯矩阵键盘模块
(4*4矩阵键盘+4位独立按键+8位跑马灯组合模块)
https://www.mydigit.cn/thread-122307-1-1.html
实验一百四十一:KY-027 魔术光杯 for UNO 魔术光环模块
https://www.mydigit.cn/thread-122579-1-1.html
实验一百四十二:LCD1602 字符液晶屏 输入输出扩展板 LCD Keypad Shield
https://www.mydigit.cn/thread-123105-1-1.html
实验一百四十三:I2C接口I/O扩展模块 支持级联PCF8574T模块
https://www.mydigit.cn/thread-127953-1-1.html
实验一百四十四:Ethernet W5100S 网络扩展板 SD卡扩展模块 支持MEGA
https://www.mydigit.cn/thread-130504-1-1.html
实验一百四十五:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V
https://www.mydigit.cn/thread-124905-1-1.html
实验一百四十六:MT8870 DTMF语音解码板模块 电话拨号控制音频解码处理电路
https://www.mydigit.cn/thread-128475-1-1.html
实验一百四十七:64位 WS2812B 8x8 RGB 5050 LED模块 ws2812s像素点阵屏
https://www.mydigit.cn/thread-127681-1-1.html
实验一百四十八:E18-D80NK 漫反射式红外光电开关避障传感器模块
https://www.mydigit.cn/thread-126831-1-1.html
实验一百四十九:MAX3232电平转TTL电平转换板 mini RS232 MCU串口转换模块
https://www.mydigit.cn/thread-126424-1-1.html
实验一百五十:AS608光学指纹识别模块 智能锁/考勤门禁开发/指纹采集模块
https://www.mydigit.cn/thread-124272-1-1.html
实验一百五十一:ESP-32掌控板 盛思 MicroPython微控制器开发板
https://www.mydigit.cn/thread-136590-1-1.html
实验一百五十二:GY-25 串口直接输出角度数据 倾斜度角度传感器模块 MPU-6050
https://www.mydigit.cn/thread-218333-1-1.html
实验一百五十三:Maixduino AI开发板 k210 RISC-V AI+lOT ESP32视觉听觉开发套装
https://www.mydigit.cn/thread-129551-1-1.html
实验一百五十四:ML8511紫外线传感器模块  模拟量输出UV Sensor Breakou
https://www.mydigit.cn/thread-143285-1-1.html
实验一百五十五:KA2284 电平指示模块 5点LED电量/音频音乐旋律显示器
https://www.mydigit.cn/thread-223567-1-1.html
实验一百五十六:恒压型LED无级触摸调光PWM控制板 电容式触摸开关器模块
https://www.mydigit.cn/thread-223681-1-1.html
实验一百五十七:SG3525 PWM控制器模块 频率可调 占空比可调 波形发生器
https://www.mydigit.cn/thread-129257-1-1.html
实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
https://www.mydigit.cn/thread-230781-1-1.html
实验一百五十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器 CMA-4544PF-W
https://www.mydigit.cn/thread-129060-1-1.html
实验一百六十二:S12SD紫外线传感器模块太阳光强度检测传感器模块高灵敏LM358放大
https://www.mydigit.cn/thread-143194-1-1.html
实验一百六十四:Seeeduino Lotus开发板 传感器9件套 主板+扩展板二合一
https://www.mydigit.cn/thread-141403-1-1.html
实验一百七十:L293D四路电机驱动模块 扩展板 motor control shield 马达板
https://www.mydigit.cn/thread-205585-1-1.html
实验一百七十一:HLK-V20 AI智能离线语音识别模块 150条本地指令离线识别
https://www.mydigit.cn/thread-206726-1-1.html
实验一百七十二:MX1508 四通道双路有刷直流马达驱动模块 2路直流电机驱动模块 双H桥步进电机 正反转PWM调速
https://www.mydigit.cn/thread-216710-1-1.html
实验一百七十三:2262/2272四路无线遥控套件 M4非锁接收板 四键无线遥控器发射模块
https://www.mydigit.cn/thread-224877-1-1.html
实验一百七十四:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG
https://www.mydigit.cn/thread-220662-1-1.html
实验一百七十五:LD3320 语音识别模块 非特定人声 语音控制 智能家居开发板
https://www.mydigit.cn/thread-225247-1-1.html
实验二百零一:OPT101模拟光照传感器 TEMT6000光强度模块 单片光电二极管 YourCee
https://www.mydigit.cn/thread-278450-1-1.html
实验二百零七:I2C红色8*8LED点阵模块ht16k33驱动1088BS树莓派物联网可扩展编程
https://www.mydigit.cn/thread-274979-1-1.html



作者: eagler8    时间: 2021-10-4 13:49
ww5223017240 发表于 2021-10-4 12:13
频谱灯这东西真心看不懂,难道一边听音乐一边在那看着这个闪?啥意义? ...

老师好,关于意义,做手工时没有想那么多
假如有好奇心的话,百度百科有个条目:《音乐可视化》,也可以用谷歌搜索 “Music visualization”



频谱仪涉及的FFT和FHT等算法也相当复杂,动手做做相关的小项目,也能促进学习和提高,看来还是有点意义的。

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

[attach]1293368[/attach]


作者: eagler8    时间: 2021-10-4 13:56
本帖最后由 eagler8 于 2021-10-4 14:30 编辑

[attach]1293370[/attach]

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 明流以上。

作者: ww5223017240    时间: 2021-10-4 19:02
eagler8 发表于 2021-10-4 13:49
老师好,关于意义,做手工时没有想那么多
假如有好奇心的话,百度百科有个条目:《音乐可视化》,也可以 ...

没意义很正常,逛数码之家的干的大部分都是没意义的事:lol:
不过频谱仪这个东西我是真觉得没啥用啊,一般听音乐的时候不都干别的事去了嘛,谁一直盯着屏幕看的啊
作者: eagler8    时间: 2021-10-4 19:36
ww5223017240 发表于 2021-10-4 19:02
没意义很正常,逛数码之家的干的大部分都是没意义的事
不过频谱仪这个东西我是真觉得没啥用啊,一般 ...

看来老师是见多识广,向您学习

作者: eagler8    时间: 2021-10-5 11:24
主要的实验材料


[attach]1294029[/attach]

作者: eagler8    时间: 2021-10-5 11:48
[attach]1294052[/attach]

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

作者: eagler8    时间: 2021-10-5 13:52
MAX9814麦克风放大器模块电原理图


[attach]1294117[/attach]

[attach]1294118[/attach]

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



[attach]1294159[/attach]

作者: eagler8    时间: 2021-10-5 14:38
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

[attach]1294163[/attach]


作者: babymax08    时间: 2021-10-5 15:47
eagler8 发表于 2021-10-5 11:48
MAX9814麦克风放大器模块
MAX9814是一款低成本高性能麦克风放大器,具有自动增益控制(AGC)和低噪声麦克风 ...

为了拍图片专门修剪了指甲
作者: eagler8    时间: 2021-10-5 16:22
本帖最后由 eagler8 于 2021-10-6 07:04 编辑

  【花雕动手做】音乐可视化系列小项目(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. }
复制代码



作者: eagler8    时间: 2021-10-5 16:29
实验串口返回情况

[attach]1294273[/attach]

作者: eagler8    时间: 2021-10-5 16:33
打开IDE的串口绘图器

[attach]1294283[/attach]

作者: eagler8    时间: 2021-10-5 16:40
[attach]1294290[/attach]

作者: eagler8    时间: 2021-10-5 16:43
  实验场景图

[attach]1294292[/attach]

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

  实验视频剪辑

https://v.youku.com/v_show/id_XNTgxMTEzNjE5Mg==.html?spm=a2hcb.playlsit.page.1




作者: eagler8    时间: 2021-10-5 16:51
  实验场景图  动态图

[attach]1294300[/attach]

作者: eagler8    时间: 2021-10-5 17:04
本帖最后由 eagler8 于 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. }
复制代码



作者: eagler8    时间: 2021-10-5 17:46
  实验场景图

[attach]1294409[/attach]

作者: eagler8    时间: 2021-10-5 19:14
  【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
  项目之二:0.91寸OLED液晶屏声音可视化频谱灯

  实验视频剪辑

https://v.youku.com/v_show/id_XNTgxMTI1NzEzMg==.html?spm=a2hcb.playlsit.page.1




作者: eagler8    时间: 2021-10-5 19:14
  实验场景图  动态图

[attach]1294456[/attach]

作者: eagler8    时间: 2021-10-5 19:21
【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
   项目之三:0.96寸OLED液晶屏声音可视化频谱灯
   实验视频剪辑

https://v.youku.com/v_show/id_XNTgxMTE1NDAzMg==.html?spm=a2hcb.playlsit.page.1




作者: eagler8    时间: 2021-10-5 19:21
  实验场景图

[attach]1294463[/attach]

作者: eagler8    时间: 2021-10-5 19:28
  实验场景图  动态图

[attach]1294469[/attach]

作者: eagler8    时间: 2021-10-6 07:00
【花雕动手做】音乐可视化系列小项目(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. }
复制代码



作者: eagler8    时间: 2021-10-6 07:16
实验场景图

[attach]1294617[/attach]

作者: eagler8    时间: 2021-10-6 07:38
【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
   项目之三:32段分频0.91寸OLED液晶可视化细条频谱灯

   实验视频剪辑

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




作者: eagler8    时间: 2021-10-6 07:46
实验场景动态图

[attach]1294621[/attach]

作者: eagler8    时间: 2021-10-6 07:49
本帖最后由 eagler8 于 2021-10-6 09:13 编辑

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

   实验视频剪辑

https://v.youku.com/v_show/id_XNTgwNzY3ODkwNA==.html?firsttime=0


作者: eagler8    时间: 2021-10-6 07:52
  实验场景图

[attach]1294622[/attach]

作者: eagler8    时间: 2021-10-6 07:56
  实验场景动态图


[attach]1294623[/attach]

作者: 古巴造    时间: 2021-10-7 00:59
你这用点阵屏显示多段LED屏的内容,完全大炮打蚊子了啊,怎么也得显示个瀑布图吧
作者: 余173917    时间: 2021-10-7 05:09
做实验用,案例倒是不少,慢慢学
作者: eagler8    时间: 2021-10-7 05:40
古巴造 发表于 2021-10-7 00:59
你这用点阵屏显示多段LED屏的内容,完全大炮打蚊子了啊,怎么也得显示个瀑布图吧 ...

谢谢老师,瀑布图是什么呢?还不懂
作者: eagler8    时间: 2021-10-7 05:40
余173917 发表于 2021-10-7 05:09
做实验用,案例倒是不少,慢慢学

谢谢鼓励:handshake:




欢迎光临 数码之家 (https://www.mydigit.cn/) Powered by Discuz! X3.4