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

实验场景图


驴友花雕 发表于 2021-10-5 19:27:49

实验场景图动态图


驴友花雕 发表于 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-6 07:14:35

实验场景图


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

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

   实验视频剪辑

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

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

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

实验场景动态图


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

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

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

   实验视频剪辑

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


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

实验场景图


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

实验场景动态图



perseverance51 发表于 2021-10-12 17:19:39

驴友花雕 发表于 2021-10-5 17:03
【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
项目之二:11段分频0.91寸OLED液晶屏声音可视 ...

代码不完整,arduinoFFT.h和Adafruit_SSD1306.h有库之间有冲突,同时调用,运行 arduinoFFT fft = arduinoFFT(vReal, vImag,64, 8000);初始化display.begin(SSD1306_SWITCHCAPVCC,0x3c)会报找不到硬件。

驴友花雕 发表于 2021-10-13 09:37:58

perseverance51 发表于 2021-10-12 17:19
代码不完整,arduinoFFT.h和Adafruit_SSD1306.h有库之间有冲突,同时调用,运行 arduinoFFT fft = arduin ...

可能硬件不同吧

发表于 2022-4-15 08:05:29

不错不错

驴友花雕 发表于 2022-4-28 20:53:42

诩 发表于 2022-4-15 08:05
不错不错

谢谢老师,有您的鼓励真好

发表于 2022-4-29 11:36:19

驴友花雕 发表于 2022-4-28 20:53
谢谢老师,有您的鼓励真好

过誉了,我是初中生

驴友花雕 发表于 2022-5-5 15:28:05

诩 发表于 2022-4-29 11:36
过誉了,我是初中生

不错啊,高级技师了

发表于 2022-5-6 08:19:39

驴友花雕 发表于 2022-5-5 15:28
不错啊,高级技师了

小学三年级上学期就开始玩创客了
快下学期的时候就到了DF社区
这不过了四年了么
怎么地也得高级技师了吧?{:5_116:}

驴友花雕 发表于 2022-5-6 11:13:11

诩 发表于 2022-5-6 08:19
小学三年级上学期就开始玩创客了
快下学期的时候就到了DF社区
这不过了四年了么


你的底子不错,许多项目让人羡慕

发表于 2022-5-6 11:28:13

驴友花雕 发表于 2022-5-6 11:13
你的底子不错,许多项目让人羡慕

不敢当      

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


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