数码之家

标题: 【花雕动手做】有趣好玩的音乐可视化系列项目(29)--16X16硬屏灯 [打印本页]

作者: eagler8    时间: 2022-10-25 16:02
标题: 【花雕动手做】有趣好玩的音乐可视化系列项目(29)--16X16硬屏灯
偶然心血来潮,想要做一个音乐可视化的系列专题。这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,逐步积累些有用的音乐频谱可视化的资料,也会争取成型一些实用好玩的音乐可视器项目。

正好手头还有四片8X8硬屏,于是把它们拼在一起,组成一块16X16的WS2812B硬屏,继续尝试音乐可视化的项目。

[attach]1643049[/attach]


作者: eagler8    时间: 2022-10-25 16:09
背面

[attach]1643051[/attach]


作者: eagler8    时间: 2022-10-25 16:13
拼装成16X16的像素WS2812灯

[attach]1643055[/attach]


作者: naonom    时间: 2022-10-25 16:34
占个位置坐等过程结果
作者: 543624636    时间: 2022-10-25 17:23
沙发,赶上直播了
作者: eagler8    时间: 2022-10-25 18:13
WS2812B
是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和12V高压可编程定电流控制部分,有效保证了像素点光的颜色高度一致。

数据协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅仅受限信号传输速度要求。

LED具有低电压驱动,环保节能,亮度高,散射角度大,一致性好,超低功率,超长寿命等优点。将控制电路集成于LED上面,电路变得更加简单,体积小,安装更加简便。


[attach]1643179[/attach]

作者: eagler8    时间: 2022-10-25 18:17
[attach]1643182[/attach]

作者: eagler8    时间: 2022-10-25 18:22
模块电原理图

[attach]1643185[/attach]

作者: eagler8    时间: 2022-10-25 19:56
[attach]1643318[/attach]

[attach]1643319[/attach]

[attach]1643320[/attach]

作者: eagler8    时间: 2022-10-25 19:57
543624636 发表于 2022-10-25 17:23
沙发,赶上直播了

谢谢鼓励
作者: eagler8    时间: 2022-10-25 20:14
  【花雕动手做】有趣好玩的音乐可视化系列项目(29)--16X16硬屏灯
  项目之一:WS2812FX库最简单的点亮形式

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化系列项目(29)--16X16硬屏灯
  3.   项目之一:WS2812FX库最简单的点亮形式
  4. */

  5. #include <WS2812FX.h> //导入库
  6. #define LED_COUNT 256 //WS2812B LED数量
  7. #define LED_PIN    6 //WS2812B LED接脚

  8. WS2812FX ws2812fx = WS2812FX(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

  9. void setup() {
  10.   ws2812fx.init(); //初始化
  11.   ws2812fx.setBrightness(35); //设置亮度(0-255),可以控制总电流(重要!)
  12.   ws2812fx.setSpeed(100); // 设置速度
  13.   ws2812fx.setMode(FX_MODE_FIREWORKS_RANDOM);// 设置模式(内置63种模式)
  14.   ws2812fx.start(); //启动
  15. }

  16. void loop() {
  17.   ws2812fx.service(); //循环运行
  18. }
复制代码



作者: eagler8    时间: 2022-10-25 20:21
实验场景图  动态图

[attach]1643375[/attach]


作者: eagler8    时间: 2022-10-25 20:26
实验场景图

[attach]1643379[/attach]


作者: wqwq212    时间: 2022-10-25 20:39
不费脑子了,直接使用LED显示屏。
作者: eagler8    时间: 2022-10-26 06:43
wqwq212 发表于 2022-10-25 20:39
不费脑子了,直接使用LED显示屏。

老师好,什么屏?是用专门控制器的吧
作者: cv130    时间: 2022-10-26 09:18
做的漂亮至极
作者: mitcher    时间: 2022-10-26 09:50
关注下后续到底是怎么做的。。和哈哈

作者: eagler8    时间: 2022-10-26 10:24
  【花雕动手做】有趣好玩的音乐可视化系列项目(29)--16X16硬屏灯
   项目之二:RGB传输测试满屏变幻彩灯
[attach]1643859[/attach]

[attach]1643860[/attach]

作者: eagler8    时间: 2022-10-26 10:24
[attach]1643861[/attach]

[attach]1643862[/attach]

作者: eagler8    时间: 2022-10-26 10:25
mitcher 发表于 2022-10-26 09:50
关注下后续到底是怎么做的。。和哈哈

一步一步来呗,呵呵
作者: eagler8    时间: 2022-10-26 10:36
实验场景图

[attach]1643868[/attach]


作者: eagler8    时间: 2022-10-26 10:54
  【花雕动手做】有趣好玩的音乐可视化系列项目(29)--16X16硬屏灯
  项目之三:应用Adafruit_NeoPixel库的入门极简程序

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化系列项目(29)--16X16硬屏灯
  3.   项目之三:应用Adafruit_NeoPixel库的入门极简程序
  4. */


  5. #include <Adafruit_NeoPixel.h>
  6. #define PIN        6 //接脚
  7. #define NUMPIXELS 256 //数量
  8. Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
  9. #define DELAYVAL 10 //延时

  10. void setup() {
  11.   pixels.setBrightness(22);//亮度
  12.   pixels.begin();//启动
  13. }

  14. void loop() {
  15.   pixels.clear();
  16.   for (int i = 0; i < NUMPIXELS; i++) {
  17.     pixels.setPixelColor(i, pixels.Color(50, 250, 0));//绿色
  18.     pixels.show();
  19.     delay(1);
  20.   }
  21. }
复制代码



作者: eagler8    时间: 2022-10-26 10:59
实验场景图

[attach]1643896[/attach]

作者: eagler8    时间: 2022-10-26 18:39
  【花雕动手做】有趣好玩的音乐可视化系列项目(29)--16X16硬屏灯
  项目之四:256位音乐频谱灯

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化系列项目(29)--16X16硬屏灯
  3.   项目之四:256位音乐频谱灯
  4. */

  5. #include "FastLED.h"

  6. #define OCTAVE 1 //   // Group buckets into octaves  (use the log output function LOG_OUT 1)
  7. #define OCT_NORM 0 // Don't normalise octave intensities by number of bins
  8. #define FHT_N 256 // set to 256 point fht
  9. #include <FHT.h> // include the library
  10. //int noise[] = {204,188,68,73,150,98,88,68}; // noise level determined by playing pink noise and seeing levels [trial and error]{204,188,68,73,150,98,88,68}


  11. // int noise[] = {204,190,108,85,65,65,55,60}; // noise for mega adk
  12. int noise[] = {204, 195, 100, 90, 85, 80, 75, 75}; // noise for NANO
  13. //int noise[] = {204,198,100,85,85,80,80,80};
  14. float noise_fact[] = {15, 7, 1.5, 1, 1.2, 1.4, 1.7, 3}; // noise level determined by playing pink noise and seeing levels [trial and error]{204,188,68,73,150,98,88,68}
  15. float noise_fact_adj[] = {15, 7, 1.5, 1, 1.2, 1.4, 1.7, 3}; // noise level determined by playing pink noise and seeing levels [trial and error]{204,188,68,73,150,98,88,68}


  16. #define LED_PIN     6
  17. #define LED_TYPE    WS2812
  18. #define COLOR_ORDER GRB


  19. // Params for width and height
  20. const uint8_t kMatrixWidth = 8;
  21. const uint8_t kMatrixHeight = 32;
  22. //#define NUM_LEDS (kMatrixWidth * kMatrixHeight)
  23. #define NUM_LEDS    256

  24. CRGB leds[NUM_LEDS];

  25. int counter2 = 0;



  26. void setup() {
  27.   Serial.begin(9600);
  28.   delay(1000);
  29.   FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );

  30.   FastLED.setBrightness (33);
  31.   fill_solid(leds, NUM_LEDS, CRGB::Black);
  32.   FastLED.show();
  33.   // TIMSK0 = 0; // turn off timer0 for lower jitter
  34.   ADCSRA = 0xe5; // set the adc to free running mode
  35.   ADMUX = 0x40; // use adc0
  36.   DIDR0 = 0x01; // turn off the digital input for adc0

  37. }




  38. void loop() {
  39.   int prev_j[8];
  40.   int beat = 0;
  41.   int prev_oct_j;
  42.   int counter = 0;
  43.   int prev_beat = 0;
  44.   int led_index = 0;
  45.   int saturation = 0;
  46.   int saturation_prev = 0;
  47.   int brightness = 0;
  48.   int brightness_prev = 0;

  49.   while (1) { // reduces jitter

  50.     cli();  // UDRE interrupt slows this way down on arduino1.0

  51.     for (int i = 0 ; i < FHT_N ; i++) { // save 256 samples
  52.       while (!(ADCSRA & 0x10)); // wait for adc to be ready
  53.       ADCSRA = 0xf5; // restart adc
  54.       byte m = ADCL; // fetch adc data
  55.       byte j = ADCH;
  56.       int k = (j << 8) | m; // form into an int
  57.       k -= 0x0200; // form into a signed int
  58.       k <<= 6; // form into a 16b signed int
  59.       fht_input[i] = k; // put real data into bins
  60.     }
  61.     fht_window(); // window the data for better frequency response
  62.     fht_reorder(); // reorder the data before doing the fht
  63.     fht_run(); // process the data in the fht
  64.     fht_mag_octave(); // take the output of the fht  fht_mag_log()

  65.     // every 50th loop, adjust the volume accourding to the value on A2 (Pot)
  66.     if (counter >= 50) {
  67.       ADMUX = 0x40 | (1 & 0x07); // set admux to look at Analogpin A1 - Master Volume


  68.       while (!(ADCSRA & 0x10)); // wait for adc to be ready
  69.       ADCSRA = 0xf5; // restart adc
  70.       delay(10);
  71.       while (!(ADCSRA & 0x10)); // wait for adc to be ready
  72.       ADCSRA = 0xf5; // restart adc
  73.       byte m = ADCL; // fetch adc data
  74.       byte j = ADCH;
  75.       int k = (j << 8) | m; // form into an int
  76.       float master_volume = (k + 0.1) / 1000 + .75; // so the valu will be between ~0.5 and 1.---------------------+.75 was .5
  77.       Serial.println (master_volume);


  78.       for (int i = 1; i < 8; i++) {
  79.         noise_fact_adj[i] = noise_fact[i] * master_volume;
  80.       }

  81.       ADMUX = 0x40 | (0 & 0x07); // set admux back to look at A0 analog pin (to read the microphone input
  82.       counter = 0;
  83.     }

  84.     sei();
  85.     counter++;


  86.     // End of Fourier Transform code - output is stored in fht_oct_out[i].

  87.     // i=0-7 frequency (octave) bins (don't use 0 or 1), fht_oct_out[1]= amplitude of frequency for bin 1
  88.     // for loop a) removes background noise average and takes absolute value b) low / high pass filter as still very noisy
  89.     // c) maps amplitude of octave to a colour between blue and red d) sets pixel colour to amplitude of each frequency (octave)

  90.     for (int i = 1; i < 8; i++) {  // goes through each octave. skip the first 1, which is not useful

  91.       int j;
  92.       j = (fht_oct_out[i] - noise[i]); // take the pink noise average level out, take the asbolute value to avoid negative numbers
  93.       if (j < 10) {
  94.         j = 0;
  95.       }
  96.       j = j * noise_fact_adj[i];

  97.       if (j < 10) {
  98.         j = 0;
  99.       }
  100.       else {
  101.         j = j * noise_fact_adj[i];
  102.         if (j > 180) {
  103.           if (i >= 7) {
  104.             beat += 2;
  105.           }
  106.           else {
  107.             beat += 1;
  108.           }
  109.         }
  110.         j = j / 30;
  111.         j = j * 30; // (force it to more discrete values)
  112.       }

  113.       prev_j[i] = j;

  114.       //     Serial.print(j);
  115.       //     Serial.print(" ");


  116.       // this fills in 11 LED's with interpolated values between each of the 8 OCT values
  117.       if (i >= 2) {
  118.         led_index = 2 * i - 3;
  119.         prev_oct_j = (j + prev_j[i - 1]) / 2;

  120.         saturation = constrain(j + 50, 0, 255); //-----------50 was 30
  121.         saturation_prev = constrain(prev_oct_j + 50, 0, 255);
  122.         brightness = constrain(j, 0, 255);
  123.         brightness_prev = constrain(prev_oct_j, 0, 255);
  124.         if (brightness == 255) {
  125.           saturation = 50;
  126.           brightness = 200;
  127.         }
  128.         if (brightness_prev == 255) {
  129.           saturation_prev = 50;
  130.           brightness_prev = 200;
  131.         }


  132.         for (uint8_t y = 0; y < kMatrixHeight; y++) {
  133.           leds[XY(led_index - 1, y)] = CHSV(j + y * 30, saturation, brightness);
  134.           if (i > 2) {
  135.             prev_oct_j = (j + prev_j[i - 1]) / 2;
  136.             leds[ XY(led_index - 2, y)] = CHSV(prev_oct_j + y * 30, saturation_prev, brightness_prev);
  137.           }
  138.         }
  139.       }
  140.     }



  141.     if (beat >= 7) {
  142.       fill_solid(leds, NUM_LEDS, CRGB::Gray);
  143.       FastLED.setBrightness(200);



  144.     }
  145.     else {
  146.       if (prev_beat != beat) {
  147.         FastLED.setBrightness(40 + beat * beat * 5);
  148.         prev_beat = beat;
  149.       }

  150.     }

  151.     FastLED.show();
  152.     if (beat) {
  153.       counter2 += ((beat + 4) / 2 - 2);
  154.       if (counter2 < 0) {
  155.         counter2 = 1000;
  156.       }
  157.       if (beat > 3 && beat < 7) {
  158.         FastLED.delay (20);
  159.       }
  160.       beat = 0;
  161.     }

  162.     // Serial.println();
  163.   }
  164. }



  165. // Param for different pixel layouts
  166. const bool    kMatrixSerpentineLayout = false;
  167. // Set 'kMatrixSerpentineLayout' to false if your pixels are
  168. // laid out all running the same way, like this:

  169. // Set 'kMatrixSerpentineLayout' to true if your pixels are
  170. // laid out back-and-forth, like this:

  171. uint16_t XY( uint8_t x, uint8_t y)
  172. {
  173.   uint16_t i;

  174.   if ( kMatrixSerpentineLayout == false) {
  175.     i = (y * kMatrixWidth) + x;
  176.   }

  177.   if ( kMatrixSerpentineLayout == true) {
  178.     if ( y & 0x01) {
  179.       // Odd rows run backwards
  180.       uint8_t reverseX = (kMatrixWidth - 1) - x;
  181.       i = (y * kMatrixWidth) + reverseX;

  182.     } else {
  183.       // Even rows run forwards
  184.       i = (y * kMatrixWidth) + x;

  185.     }
  186.   }

  187.   i = (i + counter2) % NUM_LEDS;
  188.   return i;
  189. }
复制代码



作者: eagler8    时间: 2022-10-26 18:43
实验场景图  动态图

[attach]1644316[/attach]

作者: microlim    时间: 2022-10-26 19:07
可以阿,可编程,可以继续发挥想象力了
作者: eagler8    时间: 2022-10-26 19:25
实验的视频记录
优酷:https://v.youku.com/v_show/id_XN ... hcb.playlsit.page.1
B站:https://www.bilibili.com/video/B ... 87403d97f8d3cc0b7e5




作者: eagler8    时间: 2022-10-26 19:32
实验场景图

[attach]1644332[/attach]


作者: eagler8    时间: 2022-10-26 21:55
  【花雕动手做】有趣好玩的音乐可视化系列项目(29)--16X16硬屏灯
   项目之五:多彩MegunoLink音乐节拍灯

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化系列项目(29)--16X16硬屏灯
  3.   项目之五:多彩MegunoLink音乐节拍灯
  4. */

  5. #include<FastLED.h>
  6. #include<MegunoLink.h>
  7. #include<Filter.h>

  8. #define N_PIXELS  23
  9. #define MIC_PIN   A0
  10. #define LED_PIN   6
  11. #define NOISE 10
  12. #define TOP   (N_PIXELS+2)
  13. #define LED_TYPE  WS2811
  14. #define BRIGHTNESS  10
  15. #define COLOR_ORDER GRB

  16. CRGB leds[N_PIXELS];
  17. int lvl = 0, minLvl = 0, maxLvl = 10;

  18. ExponentialFilter<long> ADCFilter(5, 0);

  19. void setup() {
  20.   FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, N_PIXELS).setCorrection(TypicalLEDStrip);
  21.   FastLED.setBrightness(BRIGHTNESS);
  22. }

  23. void loop() {
  24.   int n, height;
  25.   n = analogRead(MIC_PIN);
  26.   n = abs(1023 - n);
  27.   n = (n <= NOISE) ? 0 : abs(n - NOISE);
  28.   ADCFilter.Filter(n);
  29.   lvl = ADCFilter.Current();
  30.   //  Serial.print(n);
  31.   //  Serial.print(" ");
  32.   //  Serial.println(lvl);
  33.   height = TOP * (lvl - minLvl) / (long)(maxLvl - minLvl);
  34.   if (height < 0L) height = 0;
  35.   else if (height > TOP) height = TOP;
  36.   for (uint8_t i = 0; i < N_PIXELS; i++) {
  37.     if (i >= height) leds[i] = CRGB(0, 0, 0);
  38.     else leds[i] = Wheel( map( i, 0, N_PIXELS - 1, 30, 150 ) );
  39.   }
  40.   FastLED.show();
  41. }

  42. CRGB Wheel(byte WheelPos) {
  43.   if (WheelPos < 85)
  44.     return CRGB(WheelPos * 3, 255 - WheelPos * 3, 0);
  45.   else if (WheelPos < 170) {
  46.     WheelPos -= 85;
  47.     return CRGB(255 - WheelPos * 3, 0, WheelPos * 3);
  48.   } else {
  49.     WheelPos -= 170;
  50.     return CRGB(0, WheelPos * 3, 255 - WheelPos * 3);
  51.   }
  52. }
复制代码



作者: eagler8    时间: 2022-10-26 21:59
实验场景图  动态图

[attach]1644430[/attach]


作者: eagler8    时间: 2022-10-26 22:02
实验的视频记录
优酷:
B站:https://www.bilibili.com/video/B ... 87403d97f8d3cc0b7e5




作者: eagler8    时间: 2022-10-26 22:06
实验场景图

[attach]1644432[/attach]


作者: eagler8    时间: 2022-10-27 08:00
  【花雕动手做】有趣好玩的音乐可视化系列项目(29)--16X16硬屏灯
  项目之六:Arduino 和 FastLED多彩音乐节奏灯

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化系列项目(29)--16X16硬屏灯
  3.   项目之六:Arduino 和 FastLED多彩音乐节奏灯
  4. */

  5. #include <FastLED.h>
  6. #define SAMPLEPERIODUS 200
  7. #define MIC_PIN A0
  8. #define LED_DT 6
  9. #define COLOR_ORDER GRB
  10. #define LED_TYPE WS2812
  11. #define NUM_LEDS 256
  12. uint8_t max_bright = 33;
  13. struct CRGB leds[NUM_LEDS];
  14. CRGBPalette16 currentPalette = RainbowColors_p;
  15. CRGBPalette16 targetPalette;

  16. void setup() {
  17.   pinMode(LED_BUILTIN, OUTPUT);
  18.   LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);
  19.   FastLED.setBrightness(max_bright);
  20. }

  21. float bassFilter(float sample) {
  22.   static float xv[3] = {0, 0, 0}, yv[3] = {0, 0, 0};
  23.   xv[0] = xv[1]; xv[1] = xv[2];
  24.   xv[2] = sample / 9.1f;
  25.   yv[0] = yv[1]; yv[1] = yv[2];
  26.   yv[2] = (xv[2] - xv[0]) + (-0.7960060012f * yv[0]) + (1.7903124146f * yv[1]);
  27.   return yv[2];
  28. }

  29. float envelopeFilter(float sample) {
  30.   static float xv[2] = {0, 0}, yv[2] = {0, 0};
  31.   xv[0] = xv[1];
  32.   xv[1] = sample / 160.f;
  33.   yv[0] = yv[1];
  34.   yv[1] = (xv[0] + xv[1]) + (0.9875119299f * yv[0]);
  35.   return yv[1];
  36. }

  37. float beatFilter(float sample) {
  38.   static float xv[3] = {0, 0, 0}, yv[3] = {0, 0, 0};
  39.   xv[0] = xv[1]; xv[1] = xv[2];
  40.   xv[2] = sample / 7.015f;
  41.   yv[0] = yv[1]; yv[1] = yv[2];
  42.   yv[2] = (xv[2] - xv[0]) + (-0.7169861741f * yv[0]) + (1.4453653501f * yv[1]);
  43.   return yv[2];
  44. }

  45. void loop() {
  46.   unsigned long time = micros();
  47.   float sample, value, envelope, beat, thresh, micLev;
  48.   for (uint8_t i = 0; ; ++i) {
  49.     sample = (float)analogRead(MIC_PIN);
  50.     micLev = ((micLev * 67) + sample) / 68;
  51.     sample -= micLev;
  52.     value = bassFilter(sample);
  53.     value = abs(value);
  54.     envelope = envelopeFilter(value);
  55.     if (i == 200) {
  56.       beat = beatFilter(envelope);
  57.       thresh = 0.02f * 75.;

  58.       if (beat > thresh) {
  59.         digitalWrite(LED_BUILTIN, LOW);

  60.         int strt = random8(NUM_LEDS / 2);
  61.         int ende = strt + random8(NUM_LEDS / 2);
  62.         for (int i = strt; i < ende; i++) {
  63.           uint8_t index = inoise8(i * 30, millis() + i * 30);
  64.           leds[i] = ColorFromPalette(currentPalette, index, 255, LINEARBLEND);
  65.         }
  66.       } else {
  67.         digitalWrite(LED_BUILTIN, HIGH);
  68.       }
  69.       i = 0;
  70.     }

  71.     EVERY_N_SECONDS(5) {
  72.       uint8_t baseC = random8();
  73.       targetPalette = CRGBPalette16(CHSV(baseC + random8(32), 255, random8(128, 255)),
  74.                                     CHSV(baseC + random8(64), 255, random8(128, 255)),
  75.                                     CHSV(baseC + random8(64), 192, random8(128, 255)),
  76.                                     CHSV(baseC + random8(),   255, random8(128, 255)));
  77.     }

  78.     EVERY_N_MILLISECONDS(50) {
  79.       uint8_t maxChanges = 24;
  80.       nblendPaletteTowardPalette(currentPalette, targetPalette, maxChanges);
  81.     }

  82.     EVERY_N_MILLIS(50) {
  83.       fadeToBlackBy(leds, NUM_LEDS, 64);
  84.       FastLED.show();
  85.     }

  86.     for (unsigned long up = time + SAMPLEPERIODUS; time > 20 && time < up; time = micros()) {  }

  87.   } // for i
  88. } // loop()
复制代码



作者: eagler8    时间: 2022-10-27 08:41
本帖最后由 eagler8 于 2022-10-27 08:45 编辑

实验场景图  动态图

[attach]1644647[/attach]


作者: eagler8    时间: 2022-10-27 08:49
实验的视频记录
优酷:
B站:https://www.bilibili.com/video/B ... 87403d97f8d3cc0b7e5




作者: eagler8    时间: 2022-10-27 08:57
实验场景图

[attach]1644649[/attach]


作者: eagler8    时间: 2022-10-29 11:15
镜像扩展的实验场景图

[attach]1646698[/attach]


作者: eagler8    时间: 2022-10-29 11:19
实验的视频记录
优酷:
B站:https://www.bilibili.com/video/B ... 87403d97f8d3cc0b7e5




作者: eagler8    时间: 2022-10-29 11:24
实验场景图  动态图

[attach]1646700[/attach]


作者: eagler8    时间: 2022-10-29 11:32
【花雕动手做】有趣好玩音乐可视化16X16硬屏灯(镜像扩展)之二

实验的视频记录
优酷:
B站:https://www.bilibili.com/video/B ... 87403d97f8d3cc0b7e5





作者: eagler8    时间: 2022-10-29 11:34
实验场景图

[attach]1646735[/attach]


作者: eagler8    时间: 2022-10-29 11:38
【花雕动手做】有趣好玩音乐可视化16X16硬屏灯(镜像扩展)之三

实验的视频记录
优酷:
B站:https://www.bilibili.com/video/B ... 87403d97f8d3cc0b7e5





作者: eagler8    时间: 2022-10-29 12:38
实验场景图

[attach]1646868[/attach]


作者: eagler8    时间: 2022-10-29 12:52
【花雕动手做】有趣好玩音乐可视化16X16硬屏灯(组合镜像)

实验场景图

[attach]1646878[/attach]


作者: eagler8    时间: 2022-10-29 13:11
实验场景图  动态图

[attach]1646910[/attach]


作者: eagler8    时间: 2022-10-29 13:32
【花雕动手做】有趣好玩音乐可视化16X16硬屏灯(组合镜像)

实验的视频记录
优酷:https://v.youku.com/v_show/id_XN ... hcb.playlsit.page.3
B站:https://www.bilibili.com/video/B ... 87403d97f8d3cc0b7e5




作者: eagler8    时间: 2022-10-29 15:21
实验场景图

[attach]1647035[/attach]


作者: eagler8    时间: 2022-10-29 15:28
【花雕动手做】有趣好玩音乐可视化16X16硬屏灯(组合镜像)之二

实验的视频记录
优酷:https://v.youku.com/v_show/id_XN ... hcb.playlsit.page.1
B站:https://www.bilibili.com/video/B ... 87403d97f8d3cc0b7e5




作者: eagler8    时间: 2022-10-29 15:30
youle0 发表于 2022-10-29 13:57
感谢分享!学习

谢谢鼓励
作者: eagler8    时间: 2022-10-29 15:39
【花雕动手做】有趣好玩音乐可视化16X16硬屏灯(组合镜像)之三

实验的视频记录
优酷:https://v.youku.com/v_show/id_XN ... hcb.playlsit.page.5
B站:https://www.bilibili.com/video/B ... 87403d97f8d3cc0b7e5




作者: eagler8    时间: 2022-10-29 15:43
【花雕动手做】有趣好玩音乐可视化16X16硬屏灯(组合镜像)之三

实验的视频记录
优酷:https://v.youku.com/v_show/id_XN ... hcb.playlsit.page.5
B站:https://www.bilibili.com/video/B ... 87403d97f8d3cc0b7e5




作者: eagler8    时间: 2022-10-29 15:47
实验场景图

[attach]1647058[/attach]


作者: eagler8    时间: 2022-10-29 15:48
实验场景图

[attach]1647061[/attach]


作者: 5228753    时间: 2022-11-7 08:11
厉害厉害,赶上直播了。
作者: eagler8    时间: 2022-11-17 21:20
5228753 发表于 2022-11-7 08:11
厉害厉害,赶上直播了。

谢谢鼓励
作者: eagler8    时间: 2022-11-17 21:41
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验一百七十七:Wemos D1 R32 ESP32开发板
  项目之四十七:快速傅里叶变换256位频谱仪

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验一百七十七:Wemos D1 R32 ESP32开发板
  4.   项目之四十七:快速傅里叶变换256位频谱仪
  5. */

  6. #include  "arduinoFFT.h"
  7. #include <FastLED.h>   

  8. #define NUM_LEDS 256   
  9. #define LED_TYPE WS2812
  10. #define COLOR_ORDER GRB

  11. arduinoFFT FFT = arduinoFFT();
  12. CRGB leds[NUM_LEDS];           

  13. #define CHANNEL 39
  14. #define DATA_PIN 23

  15. const uint8_t max_bright = 2;         
  16. const uint16_t samples = NUM_LEDS / 4;
  17. const byte halfsamples = samples / 2;  
  18. uint8_t gHue;                          
  19. int value;                             
  20. double vReal[samples];                 
  21. double vImag[samples];                 
  22. char toData[halfsamples];              

  23. int pointJump[halfsamples];
  24. int uJump[halfsamples];     
  25. int dJump[halfsamples];   

  26. int uValue;                 
  27. int dValue;                 
  28. int tValue;                 
  29. int toDown = 0;            
  30. uint8_t toDownSpeed = 3;   
  31. int pointDown = 0;         
  32. uint8_t pointDownSpeed = 9;

  33. void setup(){
  34.   delay(100);              
  35.   Serial.println("Ready");
  36.   FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  37.   FastLED.setBrightness(max_bright);
  38. }

  39. void loop(){
  40.   FastLED.clear();                        
  41.   EVERY_N_MILLISECONDS(10) {
  42.     gHue += 10;  
  43.   }
  44.   for (int i = 0; i < samples; i++)        
  45.   {
  46.     value = analogRead(CHANNEL);
  47.     vReal[i] = value;      
  48.     vImag[i] = 0.0;         
  49.   }
  50.   
  51.   FFT.Windowing(vReal, samples, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
  52.   FFT.Compute(vReal, vImag, samples, FFT_FORWARD);
  53.   FFT.ComplexToMagnitude(vReal, vImag, samples);
  54.   
  55.   for (int i = 0; i < halfsamples; i++)
  56.   {
  57.     toData[i] = vReal[i + halfsamples / 2];   
  58.     toData[i] = constrain(toData[i], 0, 100);
  59.     toData[i] = map(toData[i], 0, 100, 1, 7);
  60.   }
  61.   for (int i = 0; i < halfsamples; i++)
  62.   {
  63.     uValue = toData[i];   
  64.     uJump[i]++;            
  65.     if (uValue > uJump[i])
  66.     {
  67.       uValue = uJump[i];
  68.     }
  69.     else
  70.     {
  71.       uJump[i] = uValue;
  72.     }
  73.     dValue = uValue;
  74.     toDown++;                     
  75.     if (toDown % toDownSpeed == 0)
  76.     {
  77.       dJump[i]--;
  78.       toDown = 0;
  79.     }
  80.     if (dValue > pointJump[i])
  81.     {
  82.       dJump[i] = dValue;
  83.     }
  84.     else
  85.     {
  86.       dValue = dJump[i];
  87.     }
  88.     tValue = uValue;                     
  89.     pointDown++;                        
  90.     if (pointDown % pointDownSpeed == 0)
  91.     {
  92.       pointJump[i]--;
  93.       pointDown = 0;  
  94.     }
  95.     if (tValue > pointJump[i])
  96.     {
  97.       pointJump[i] = tValue;
  98.     }
  99.     else
  100.     {
  101.       tValue = pointJump[i];
  102.     }
  103.     fill_rainbow(leds + 8 * i, uValue, gHue, 30);
  104.     fill_rainbow(leds + 8 * i, dValue, gHue, 30);
  105.     fill_solid(leds + 8 * i + tValue, 1, CRGB::White);
  106.    
  107.   }
  108.   FastLED.show();
  109.   delay(2);      
  110. }
复制代码



作者: eagler8    时间: 2022-11-17 21:43
实验场景图

[attach]1665523[/attach]


作者: eagler8    时间: 2022-11-17 21:46
实验场景图  动态图

[attach]1665525[/attach]


作者: eagler8    时间: 2022-11-17 21:49
实验的视频记录
优酷:
B站:https://www.bilibili.com/video/B ... 87403d97f8d3cc0b7e5




作者: eagler8    时间: 2022-11-18 10:59
实验的视频记录
优酷:https://v.youku.com/v_show/id_XN ... hcb.playlsit.page.1
B站:








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