驴友花雕 发表于 2021-10-4 11:46:06

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

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


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



驴友花雕 发表于 2021-10-6 07:04:04

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

实验开源代码

/*
【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
项目之三:32段分频0.91寸OLED液晶可视化细条频谱灯
实验接线: max9814接A0
oled模块    Ardunio Uno
GND---------GND接地线
VCC---------5V 接电源
SDA---------A4
SCL ------- A5
*/

#include <fix_fft.h>                  
#include <ssd1306.h>                  
#include <nano_engine.h>            

// These are user-adjustable
#define LOG_OUTPUT               // Uncomment to enable logarithmic output (exchanges absolute resoluton for more readable output; may require different below params)
#define SAMPLING_FREQUENCY 15000// Sampling frequency (Actual max measured frequency captured is half)
#define TIME_FACTOR 2             // Smoothing factor (lower is more dynamic, higher is smoother) ranging from 1 to 10+
#define SCALE_FACTOR 15         // Direct scaling factor (raise for higher bars, lower for shorter bars)

#ifdef LOG_OUTPUT
const float log_scale = 64. / log(64. / SCALE_FACTOR + 1.);    // Attempts to create an equivalent to SCALE_FACTOR for log function
#endif
const float coeff = 1. / TIME_FACTOR;                         // Time smoothing coefficients (used to factor in previous data)
const float anti_coeff = (TIME_FACTOR - 1.) / TIME_FACTOR;
const unsigned int sampling_period_us = round(1000000 * (2.0 / SAMPLING_FREQUENCY)); // Sampling period (doubled to account for overclock)

int8_t data, buff;                                     // used to store FFT input/output and past data
unsigned long microseconds;                                    // used for timekeeping
int summ, avg;                                                 // used for DC bias elimination

NanoEngine<TILE_32x32_MONO> engine;                            // declares nanoengine

void setup()
{
OSCCAL = 240; // Overclocks the MCU to around 30 MHz, set lower if this causes instability, raise if you can/want

ADCSRA &= ~(bit (ADPS0) | bit (ADPS1) | bit (ADPS2));       // clear ADC prescaler bits
ADCSRA |= bit (ADPS2);                                    // sets ADC clock in excess of 10kHz
ADCSRA |= bit (ADPS0);

ssd1306_128x64_i2c_init();                                  // initializes OLED
ssd1306_clearScreen();                                    // clears OLED

engine.begin();                                             // inititalizes nanoengine
};

void loop()
{
summ = 0;
for (int i = 0; i < 64; i++) {
    microseconds = micros();

    data = ((analogRead(A0)) >> 2) - 128;                        // Fitting analogRead data (range:0 - 1023) to int8_t array (range:-128 - 127)
    summ += data;
    while (micros() < (microseconds + sampling_period_us)) {      // Timing out uC ADC to fulfill sampling frequency requirement
    }
}

// Eliminating remaining DC component (produces usable data in FFT bin #0, which is usually swamped by DC bias)
avg = summ / 64;
for (int i = 0; i < 64; i++) {
    data -= avg;
}

fix_fftr(data, 6, 0);                           // Performing real FFT

// Time smoothing by user-determined factor and user-determined scaling
for (int count = 0; count < 32; count++) {
    if (data < 0) data = 0;                                       // Eliminating negative output of fix_fftr
#ifdef LOG_OUTPUT
    else data = log_scale * log((float)(data + 1));               // Logarithmic function equivalent to SCALING_FACTOR*log2(x+1)
#else
    else data *= SCALE_FACTOR;                                             // Linear scaling up according to SCALE_FACTOR
#endif
    data = (float)buff * anti_coeff + (float)data * coeff;   // Smoothing by factoring in past data
    buff = data;                                                    // Storing current output as next frame's past data
    if (data > 63) data = 63;                                       // Capping output at screen height
}

// Output to SSD1306 using nanoengine canvas from library
engine.refresh();                                             // Mark entire screen to be refreshed
engine.canvas.clear();                                          // Clear canvas as previous data
for (int i = 0; i < 8; i++) {
    engine.canvas.drawVLine(i * 4, 31 - (data + 1), 31);// Draw to canvas data for lower-leftest sector (FFT bins 0 - 7, lower half)
}
engine.canvas.blt(0, 32);                                       // Outputs canvas to OLED with an offset (x pixels, y pixels)
engine.canvas.clear();
for (int i = 0; i < 8; i++) {
    if (data > 31) engine.canvas.drawVLine(i * 4, 31 - (data - 31), 31); // Draw to canvas data for upper-leftest sector (FFT bins 0 - 7, upper half)
}
engine.canvas.blt(0, 0);
engine.canvas.clear();
for (int i = 8; i < 16; i++) {
    engine.canvas.drawVLine((i - 8) * 4, 31 - (data + 1), 31); // FFT bins 8 - 15, lower half
}
engine.canvas.blt(32, 32);
engine.canvas.clear();
for (int i = 8; i < 16; i++) {
    if (data > 31) engine.canvas.drawVLine((i - 8) * 4, 31 - (data - 31), 31); // FFT bins 9 - 15, upper half
}
engine.canvas.blt(32, 0);
engine.canvas.clear();
for (int i = 16; i < 24; i++) {
    engine.canvas.drawVLine((i - 16) * 4, 31 - (data + 1), 31); // FFT bins 16 - 23, lower half
}
engine.canvas.blt(64, 32);
engine.canvas.clear();
for (int i = 16; i < 24; i++) {
    if (data > 31) engine.canvas.drawVLine((i - 16) * 4, 31 - (data - 31), 31); // FFT bins 16 - 23, upper half
}
engine.canvas.blt(64, 0);
engine.canvas.clear();
for (int i = 24; i < 32; i++) {
    engine.canvas.drawVLine((i - 24) * 4, 31 - (data + 1), 31); // FFT bins 24 - 31, lower half
}
engine.canvas.blt(96, 32);
engine.canvas.clear();
for (int i = 24; i < 32; i++) {
    if (data > 31) engine.canvas.drawVLine((i - 24) * 4, 31 - (data - 31), 31); // FFT bins 24 - 31, upper half
}
engine.canvas.blt(96, 0);
}

驴友花雕 发表于 2021-10-5 17:03:59

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

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

实验开源代码

/*
【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
项目之二:0.91寸OLED液晶屏声音可视化频谱灯
实验接线: max9814接A0
oled模块    Ardunio Uno
GND---------GND接地线
VCC---------5V 接电源
SDA---------A4
SCL ------- A5
*/

#include "arduinoFFT.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SAMPLES 64 // power of 2
#define SAMPLING_FREQ 8000 // 12 kHz Fmax = sampleF /2
#define AMPLITUDE 100 // 灵敏度
#define FREQUENCY_BANDS 14
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define BARWIDTH 11
#define BARS 11
#define ANALOG_PIN A0
#define OLED_RESET   -1 // 重置引脚 #(如果共享 Arduino 重置引脚,则为 -1)

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
double vImag;
double vReal;
unsigned long sampling_period_us;
arduinoFFT fft = arduinoFFT(vReal, vImag, SAMPLES, SAMPLING_FREQ);
//调整参考以去除背景噪声
float reference = log10(60.0);
double coutoffFrequencies;

void setup() {
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
    for (;;); // Don't proceed, loop forever
}

// Setup display
display.clearDisplay();
display.display();
display.setRotation(0);
display.invertDisplay(false);

sampling_period_us = (1.0 / SAMPLING_FREQ ) * pow(10.0, 6);

// 计算截止频率,以对数标度为基数 POt
double basePot = pow(SAMPLING_FREQ / 2.0, 1.0 / FREQUENCY_BANDS);
coutoffFrequencies = basePot;
for (int i = 1 ; i < FREQUENCY_BANDS; i++ ) {
    coutoffFrequencies = basePot * coutoffFrequencies;
}

// 绘制虚线以分离频段
for (int i = 0; i < BARS - 1 ; i++) {
    for (int j = 0; j < SCREEN_HEIGHT ; j += 4) {
      display.writePixel((i + 1)*BARWIDTH + 2 , j, SSD1306_WHITE );
    }
}
display.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SSD1306_WHITE);
}

int oldHeight;
int oldMax;
double maxInFreq;

void loop() {
// 采样
for (int i = 0; i < SAMPLES; i++) {
    unsigned long newTime = micros();
    int value = analogRead(ANALOG_PIN);
    vReal = value;
    vImag = 0;
    while (micros() < (newTime + sampling_period_us)) {
      yield();
    }
}

// 计算 FFT
fft.DCRemoval();
fft.Windowing(FFT_WIN_TYP_HAMMING, FFT_FORWARD);
fft.Compute(FFT_FORWARD);
fft.ComplexToMagnitude();

double median;
double max;
int index = 0;
double hzPerSample = (1.0 * SAMPLING_FREQ) / SAMPLES; //
double hz = 0;
double maxinband = 0;
double sum = 0;
int count = 0;
for (int i = 2; i < (SAMPLES / 2) ; i++) {
    count++;
    sum += vReal;
    if (vReal >max ) {
      max = vReal;
    }
    if (hz > coutoffFrequencies) {
      median = sum / count;
      sum = 0.0;
      count = 0;
      index++;
      max = 0;
      median= 0;
    }
    hz += hzPerSample;
}
// 计算每个频段的中值和最大值
if ( sum > 0.0) {
    median =sum / count;
    if (median > maxinband) {
      maxinband = median;
    }
}
int bar = 0;

for (int i = FREQUENCY_BANDS - 1; i >= 3; i--) {
    int newHeight = 0;
    int newMax = 0;
    // 计算实际分贝
    if (median > 0 && max > 0 ) {
      newHeight = 20.0 * (log10(median ) - reference);
      newMax = 20.0 * (log10(max ) - reference);
    }

    // 调整最小和最大级别
    if (newHeight < 0 ||newMax < 0) {
      newHeight = 1;
      newMax = 1;
    }
    if (newHeight >= SCREEN_HEIGHT - 2) {
      newHeight = SCREEN_HEIGHT - 3;
    }
    if (newMax >= SCREEN_HEIGHT - 2) {
      newMax = SCREEN_HEIGHT - 3;
    }

    int barX = bar * BARWIDTH + 5;
    // 删除旧水平中位数
    if (oldHeight > newHeight) {
      display.fillRect(barX, newHeight + 1, 7, oldHeight, SSD1306_BLACK);
    }
    // 删除旧的最大级别
    if ( oldMax > newHeight) {
      for (int j = oldMax; j > newHeight; j -= 2) {
      display.drawFastHLine(barX , j, 7, SSD1306_BLACK);
      }
    }
    // 绘制新的最大级别
    for (int j = newMax; j > newHeight; j -= 2) {
      display.drawFastHLine(barX , j, 7,SSD1306_WHITE);
    }
    // 绘制新的级别中位数
    display.fillRect(barX , 1, 7, newHeight, SSD1306_WHITE);
    oldMax = newMax;
    oldHeight = newHeight;
    bar++;
}
display.drawFastHLine(0 , SCREEN_HEIGHT - 1, SCREEN_WIDTH, SSD1306_WHITE);
display.display();
}

驴友花雕 发表于 2022-10-5 09:45:45

【花雕动手做】看见声音,基于Arduino系列音乐可视器(1)---LED节奏灯
https://mc.dfrobot.com.cn/thread-311167-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(2)---OLED频谱灯
https://mc.dfrobot.com.cn/thread-311174-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(3)---RGB律动灯
https://mc.dfrobot.com.cn/thread-311183-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(4)---WS2812条灯
https://mc.dfrobot.com.cn/thread-311190-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(5)---WS2812柱跳灯
https://mc.dfrobot.com.cn/thread-311192-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(6)---点阵频谱灯
https://mc.dfrobot.com.cn/thread-311201-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(7)---大方格频谱灯
https://mc.dfrobot.com.cn/thread-311364-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(8)---四位32段点阵屏
https://mc.dfrobot.com.cn/thread-311490-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(9)---X Music Spectrum
https://mc.dfrobot.com.cn/thread-311627-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(10)---WS2812硬板屏
https://mc.dfrobot.com.cn/thread-311641-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(11)---WS2812幻彩灯带
https://mc.dfrobot.com.cn/thread-313648-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(12)---米管快速节奏灯
https://mc.dfrobot.com.cn/thread-313708-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(13)---有机棒立柱灯
https://mc.dfrobot.com.cn/thread-313723-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(14)---水杯水瓶灯
https://mc.dfrobot.com.cn/thread-313803-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(15)--横排LED方管灯
https://mc.dfrobot.com.cn/thread-313811-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(16)--热干胶棒棒灯
https://mc.dfrobot.com.cn/thread-313844-1-1.html
【花雕动手做】有趣好玩音乐可视化系列(17)--光导纤维灯
https://mc.dfrobot.com.cn/thread-313867-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(18)--LED平面板灯
https://mc.dfrobot.com.cn/thread-313951-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(19)--通体光纤灯
https://mc.dfrobot.com.cn/thread-313962-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(20)--首饰盒镜子灯
https://mc.dfrobot.com.cn/thread-313969-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(21)--CD 光盘灯
https://mc.dfrobot.com.cn/thread-313984-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(22)--LED无限魔方
https://mc.dfrobot.com.cn/thread-313994-1-1.html
【花雕动手做】有趣好玩的音乐可视化(23)--3合1闪点光纤
https://mc.dfrobot.com.cn/thread-314168-1-1.html
【花雕动手做】有趣好玩的音乐可视化(24)--无限LED镜子灯
https://mc.dfrobot.com.cn/thread-314180-1-1.html
【花雕动手做】有趣好玩音乐可视化(25)--水龙卷旋涡灯
https://mc.dfrobot.com.cn/thread-314231-1-1.html
【花雕动手做】有趣好玩音乐可视化系列(26)--LED 超立方体
https://mc.dfrobot.com.cn/thread-314244-1-1.html
【花雕动手做】有趣好玩的音乐可视化(27)--磁搅LED水旋灯
https://mc.dfrobot.com.cn/thread-314273-1-1.html


驴友花雕 发表于 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显示屏幕可以做得更轻更薄,可视角度更大,并且能够显著的节省耗电量。



驴友花雕 发表于 2021-10-4 13:53:54

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



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

主要的实验材料



驴友花雕 发表于 2021-10-5 11:45:09




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麦克风放大器模块电原理图





驴友花雕 发表于 2021-10-5 14:29:04

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




驴友花雕 发表于 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



驴友花雕 发表于 2021-10-5 16:21:21

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

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

实验开源代码

/*
【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
项目之一:使用MAX9814声音模块测试环境音乐的动态波形
实验接线:
MAX9814Arduino
VCC      5V
GND      GND
OUT      A0
*/

const int sampleWindow = 50; // 以mS为单位的采样窗口宽度(50 mS = 20Hz)
unsigned int sample;

void setup() {
Serial.begin(9600);
pinMode(A0, INPUT);
}

void loop() {
unsigned long startMillis = millis(); // 样本窗口的开始
unsigned int peakToPeak = 0;   // 峰峰值

unsigned int signalMax = 0;
unsigned int signalMin = 1024;

// collect data for 50 mS
while (millis() - startMillis < sampleWindow)
{
    sample = analogRead(A0);
    if (sample < 1024)// 抛出错误的读数
    {
      if (sample > signalMax)
      {
      signalMax = sample;// 只保存最大级别
      }
      else if (sample < signalMin)
      {
      signalMin = sample;// 仅保存最低级别
      }
    }
}
peakToPeak = signalMax - signalMin;// max-min =峰峰值幅度
double volts = (peakToPeak * 5.0) / 166;
Serial.println(volts);
}

驴友花雕 发表于 2021-10-5 16:27:15

实验串口返回情况


驴友花雕 发表于 2021-10-5 16:32:25

打开IDE的串口绘图器


驴友花雕 发表于 2021-10-5 16:39:02


驴友花雕 发表于 2021-10-5 16:42:10

实验场景图


驴友花雕 发表于 2021-10-5 16:47:15

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

实验视频剪辑

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

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

驴友花雕 发表于 2021-10-5 16:49:33

实验场景图动态图


驴友花雕 发表于 2021-10-5 17:44:08

实验场景图


驴友花雕 发表于 2021-10-5 19:01:03

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

实验视频剪辑

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

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

驴友花雕 发表于 2021-10-5 19:12:24

实验场景图动态图


驴友花雕 发表于 2021-10-5 19:17:41

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

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

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

页: [1] 2
查看完整版本: 【花雕动手做】看见声音,基于Arduino系列音乐可视器(2)