1796浏览
查看: 1796|回复: 23

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

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

01.jpg

驴友花雕  初级技神
 楼主|

发表于 2022-8-15 13:59:29

  【花雕动手做】有趣好玩的音乐可视化系列小项目(16)--热干胶棒棒灯
  项目程序之三:测试麻花棒棒灯
  模块接线:WS2812B接D7
  MAX4466      UNO
  VCC          5V
  GND         GND
  OUT          A0

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化系列小项目(16)--热干胶棒棒灯
  3.   项目程序之三:测试麻花棒棒灯
  4.   模块接线:WS2812B接D7
  5.   MAX4466      UNO
  6.   VCC          5V
  7.   GND         GND
  8.   OUT          A0
  9. */
  10. #include <Adafruit_NeoPixel.h>
  11. #ifdef __AVR__
  12. #include <avr/power.h>
  13. #endif
  14. #define PIN 7
  15. // Parameter 1 = number of pixels in strip
  16. // Parameter 2 = Arduino pin number (most are valid)
  17. // Parameter 3 = pixel type flags, add together as needed:
  18. //   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
  19. //   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
  20. //   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
  21. //   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
  22. //   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
  23. Adafruit_NeoPixel strip = Adafruit_NeoPixel(64, PIN, NEO_GRB + NEO_KHZ800);
  24. // IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
  25. // pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
  26. // and minimize distance between Arduino and first pixel.  Avoid connecting
  27. // on a live circuit...if you must, connect GND first.
  28. void setup() {
  29.   // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  30.   #if defined (__AVR_ATtiny85__)
  31.     if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  32.   #endif
  33.   // End of trinket special code
  34.   strip.begin();
  35.   strip.show(); // Initialize all pixels to 'off'
  36. }
  37. void loop() {
  38.   // Some example procedures showing how to display to the pixels:
  39.   //colorWipe(strip.Color(255, 0, 0), 50); // Red
  40. // colorWipe(strip.Color(0, 255, 0), 50); // Green
  41.   //colorWipe(strip.Color(0, 0, 255), 50); // Blue
  42. //colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
  43.   // Send a theater pixel chase in...
  44. // theaterChase(strip.Color(127, 127, 127), 50); // White
  45.   //theaterChase(strip.Color(127, 0, 0), 50); // Red
  46.   //theaterChase(strip.Color(0, 0, 127), 50); // Blue
  47.   rainbow(20);
  48.   //rainbowCycle(20);
  49.   //theaterChaseRainbow(50);
  50. }
  51. // Fill the dots one after the other with a color
  52. void colorWipe(uint32_t c, uint8_t wait) {
  53.   for(uint16_t i=0; i<strip.numPixels(); i++) {
  54.     strip.setPixelColor(i, c);
  55.     strip.show();
  56.     delay(wait);
  57.   }
  58. }
  59. void rainbow(uint8_t wait) {
  60.   uint16_t i, j;
  61.   for(j=0; j<256; j++) {
  62.     for(i=0; i<strip.numPixels(); i++) {
  63.       strip.setPixelColor(i, Wheel((i+j) & 255));
  64.     }
  65.     strip.show();
  66.     delay(wait);
  67.   }
  68. }
  69. // Slightly different, this makes the rainbow equally distributed throughout
  70. void rainbowCycle(uint8_t wait) {
  71.   uint16_t i, j;
  72.   for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
  73.     for(i=0; i< strip.numPixels(); i++) {
  74.       strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
  75.     }
  76.     strip.show();
  77.     delay(wait);
  78.   }
  79. }
  80. //Theatre-style crawling lights.
  81. void theaterChase(uint32_t c, uint8_t wait) {
  82.   for (int j=0; j<10; j++) {  //do 10 cycles of chasing
  83.     for (int q=0; q < 3; q++) {
  84.       for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
  85.         strip.setPixelColor(i+q, c);    //turn every third pixel on
  86.       }
  87.       strip.show();
  88.       delay(wait);
  89.       for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
  90.         strip.setPixelColor(i+q, 0);        //turn every third pixel off
  91.       }
  92.     }
  93.   }
  94. }
  95. //Theatre-style crawling lights with rainbow effect
  96. void theaterChaseRainbow(uint8_t wait) {
  97.   for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
  98.     for (int q=0; q < 3; q++) {
  99.       for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
  100.         strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
  101.       }
  102.       strip.show();
  103.       delay(wait);
  104.       for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
  105.         strip.setPixelColor(i+q, 0);        //turn every third pixel off
  106.       }
  107.     }
  108.   }
  109. }
  110. // Input a value 0 to 255 to get a color value.
  111. // The colours are a transition r - g - b - back to r.
  112. uint32_t Wheel(byte WheelPos) {
  113.   WheelPos = 255 - WheelPos;
  114.   if(WheelPos < 85) {
  115.     return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  116.   }
  117.   if(WheelPos < 170) {
  118.     WheelPos -= 85;
  119.     return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  120.   }
  121.   WheelPos -= 170;
  122.   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  123. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-31 21:01:35

  【花雕动手做】有趣好玩的音乐可视化系列小项目(16)--热干胶棒棒灯
  项目程序之五:多彩MegunoLink伸缩音乐节拍灯
  模块接线:WS2812B接D6
  MAX4466      UNO
  VCC          5V
  GND         GND
  OUT          A0

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化系列小项目(16)--热干胶棒棒灯
  3.   项目程序之五:多彩MegunoLink伸缩音乐节拍灯
  4.   模块接线:WS2812B接D6
  5.   MAX4466      UNO
  6.   VCC          5V
  7.   GND         GND
  8.   OUT          A0
  9. */
  10. #include<FastLED.h>
  11. #include<MegunoLink.h>
  12. #include<Filter.h>
  13. #define N_PIXELS  13
  14. #define MIC_PIN   A0
  15. #define LED_PIN   6
  16. #define NOISE 10
  17. #define TOP   (N_PIXELS+2)
  18. #define LED_TYPE  WS2811
  19. #define BRIGHTNESS  10
  20. #define COLOR_ORDER GRB
  21. CRGB leds[N_PIXELS];
  22. int lvl = 0, minLvl = 0, maxLvl = 10;
  23. ExponentialFilter<long> ADCFilter(5, 0);
  24. void setup() {
  25.   FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, N_PIXELS).setCorrection(TypicalLEDStrip);
  26.   FastLED.setBrightness(BRIGHTNESS);
  27. }
  28. void loop() {
  29.   int n, height;
  30.   n = analogRead(MIC_PIN);
  31.   n = abs(1023 - n);
  32.   n = (n <= NOISE) ? 0 : abs(n - NOISE);
  33.   ADCFilter.Filter(n);
  34.   lvl = ADCFilter.Current();
  35.   //  Serial.print(n);
  36.   //  Serial.print(" ");
  37.   //  Serial.println(lvl);
  38.   height = TOP * (lvl - minLvl) / (long)(maxLvl - minLvl);
  39.   if (height < 0L) height = 0;
  40.   else if (height > TOP) height = TOP;
  41.   for (uint8_t i = 0; i < N_PIXELS; i++) {
  42.     if (i >= height) leds[i] = CRGB(0, 0, 0);
  43.     else leds[i] = Wheel( map( i, 0, N_PIXELS - 1, 30, 150 ) );
  44.   }
  45.   FastLED.show();
  46. }
  47. CRGB Wheel(byte WheelPos) {
  48.   if (WheelPos < 85)
  49.     return CRGB(WheelPos * 3, 255 - WheelPos * 3, 0);
  50.   else if (WheelPos < 170) {
  51.     WheelPos -= 85;
  52.     return CRGB(255 - WheelPos * 3, 0, WheelPos * 3);
  53.   } else {
  54.     WheelPos -= 170;
  55.     return CRGB(0, WheelPos * 3, 255 - WheelPos * 3);
  56.   }
  57. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-14 19:17:15

  【花雕动手做】有趣好玩的音乐可视化系列小项目(16)--热干胶棒棒灯
  项目程序之二:热干胶棒棒音乐节奏灯盘
  模块接线:WS2812B接D6
  MAX4466      UNO
  VCC          5V
  GND         GND
  OUT          A0

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化系列小项目(16)--热干胶棒棒灯
  3.   项目程序之二:热干胶棒棒音乐节奏灯盘
  4.   模块接线:WS2812B接D6
  5.   MAX4466      UNO
  6.   VCC          5V
  7.   GND         GND
  8.   OUT          A0
  9. */
  10. #include<FastLED.h>
  11. #include<MegunoLink.h>
  12. #include<Filter.h>
  13. #define N_PIXELS  69
  14. #define MIC_PIN   A5
  15. #define LED_PIN   12
  16. #define NOISE 10
  17. #define TOP   (N_PIXELS+2)
  18. #define LED_TYPE  WS2811
  19. #define BRIGHTNESS  22
  20. #define COLOR_ORDER GRB
  21. CRGB leds[N_PIXELS];
  22. int lvl = 0, minLvl = 0, maxLvl = 10;
  23. ExponentialFilter<long> ADCFilter(5, 0);
  24. void setup() {
  25.   FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, N_PIXELS).setCorrection(TypicalLEDStrip);
  26.   FastLED.setBrightness(BRIGHTNESS);
  27. }
  28. void loop() {
  29.   int n, height;
  30.   n = analogRead(MIC_PIN);
  31.   n = abs(1023 - n);
  32.   n = (n <= NOISE) ? 0 : abs(n - NOISE);
  33.   ADCFilter.Filter(n);
  34.   lvl = ADCFilter.Current();
  35.   //  Serial.print(n);
  36.   //  Serial.print(" ");
  37.   //  Serial.println(lvl);
  38.   height = TOP * (lvl - minLvl) / (long)(maxLvl - minLvl);
  39.   if (height < 0L) height = 0;
  40.   else if (height > TOP) height = TOP;
  41.   for (uint8_t i = 0; i < N_PIXELS; i++) {
  42.     if (i >= height) leds[i] = CRGB(0, 0, 0);
  43.     else leds[i] = Wheel( map( i, 0, N_PIXELS - 1, 30, 150 ) );
  44.   }
  45.   FastLED.show();
  46. }
  47. CRGB Wheel(byte WheelPos) {
  48.   if (WheelPos < 85)
  49.     return CRGB(WheelPos * 3, 255 - WheelPos * 3, 0);
  50.   else if (WheelPos < 170) {
  51.     WheelPos -= 85;
  52.     return CRGB(255 - WheelPos * 3, 0, WheelPos * 3);
  53.   } else {
  54.     WheelPos -= 170;
  55.     return CRGB(0, WheelPos * 3, 255 - WheelPos * 3);
  56.   }
  57. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-14 17:38:22

本帖最后由 驴友花雕 于 2022-8-14 17:46 编辑

WS2812B灯带选用的是每米60灯黑底裸板
06.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-14 17:50:01

声音模块,使用性价比更高的MAX4466声音传感器

0-.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-14 19:03:15

  【花雕动手做】有趣好玩的音乐可视化系列小项目(16)--热干胶棒棒灯
  项目程序之一:热干胶棒棒音乐反应灯
  模块接线:WS2812B接D6
  MAX4466      UNO
  VCC          5V
  GND         GND
  OUT          A0

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化系列小项目(16)--热干胶棒棒灯
  3.   项目程序之一:热干胶棒棒音乐反应灯
  4.   模块接线:WS2812B接D6
  5.   MAX4466      UNO
  6.   VCC          5V
  7.   GND         GND
  8.   OUT          A0
  9. */
  10. #include<FastLED.h>
  11. #define LED_PIN 6
  12. #define NUM_LEDS 18
  13. CRGB leds[NUM_LEDS];
  14. uint8_t hue = 0;
  15. int soundsensor = A0;
  16. void setup() {
  17.   delay(2000);
  18.   FastLED.setBrightness(100);
  19.   pinMode(soundsensor, INPUT);
  20.   FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
  21. }
  22. void loop() {
  23.   int sensval = digitalRead(soundsensor);
  24.   if (sensval == 1) {
  25.     Serial.println("ON");
  26.     leds[0] = CRGB :: Red;
  27.     fill_solid(leds, NUM_LEDS, CRGB :: Blue);
  28.     rainbow_moving();
  29.     FastLED.show();
  30.     delay(10);
  31.   }
  32.   else {
  33.     leds[0] = CRGB :: Black;
  34.     fill_solid(leds, NUM_LEDS, CRGB :: Black);
  35.     FastLED.show();
  36.     delay(10);
  37.   }
  38. }
  39. void rainbow_moving() {
  40.   for (int i = 0; i < NUM_LEDS; i++) {
  41.     leds[i] = CHSV(hue + (i * 10), 255, 255);
  42.   }
  43.   EVERY_N_MILLISECONDS(10) {
  44.     hue++;
  45.   }
  46. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-14 19:13:39

实验的视频记录之一(1分05秒)

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




回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-14 19:20:31

实验场景图  动态图

动画58.gif

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-14 19:25:09

实验的视频记录(1分03秒)

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



回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-15 12:11:53

找到一个装喜糖的小铁盒子

02.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-15 12:17:17

8分位钻孔

03.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-15 12:19:55

10mm扩孔

04.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-15 12:22:34

安装热干胶棒

05.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-15 12:25:18

扭个麻花

06.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-15 12:28:19

07.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-15 14:04:53

实验场景图

08.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-15 14:10:27

实验的视频记录(1分05秒)

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



回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-15 14:36:15

  【花雕动手做】有趣好玩的音乐可视化系列小项目(16)--热干胶棒棒灯
  项目程序之四:音乐反应麻花棒棒灯
  模块接线:WS2812B接D6
  MAX4466      UNO
  VCC          5V
  GND         GND
  OUT          D7

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化系列小项目(16)--热干胶棒棒灯
  3.   项目程序之四:音乐反应麻花棒棒灯
  4.   模块接线:WS2812B接D6
  5.   MAX4466      UNO
  6.   VCC          5V
  7.   GND         GND
  8.   OUT          D7
  9. */
  10. #include<FastLED.h>
  11. #define LED_PIN 6
  12. #define NUM_LEDS 12
  13. CRGB leds[NUM_LEDS];
  14. uint8_t hue = 0;
  15. int soundsensor = 7;
  16. void setup() {
  17.   delay(2000);
  18.   Serial.begin(9600);
  19.   FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
  20.   FastLED.setBrightness(155);
  21.   pinMode(soundsensor, INPUT);
  22. }
  23. void loop() {
  24.   int sensval = digitalRead(soundsensor);
  25.   if (sensval == 1) {
  26.     Serial.println("ON");
  27.     leds[0] = CRGB :: Red;
  28.     fill_solid(leds, NUM_LEDS, CRGB :: Blue);
  29.     rainbow_moving();
  30.     FastLED.show();
  31.     delay(10);
  32.   }
  33.   else {
  34.     leds[0] = CRGB :: Black;
  35.     fill_solid(leds, NUM_LEDS, CRGB :: Black);
  36.     FastLED.show();
  37.     delay(10);
  38.   }
  39. }
  40. void rainbow_moving() {
  41.   for (int i = 0; i < NUM_LEDS; i++) {
  42.     leds[i] = CHSV(hue + (i * 10), 255, 255);
  43.   }
  44.   EVERY_N_MILLISECONDS(10) {
  45.     hue++;
  46.   }
  47. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-15 15:02:28

实验的视频记录(1分03秒)

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



回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-15 15:15:58

实验的视频记录(5分10秒)

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



回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-8-31 20:55:18

继续尝试棒棒灯

09.jpg

回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail