楼主: eagler8

[教程] 【Arduino】108种传感器模块系列实验(61)---WS2812直条8位模块

[复制链接]

签到天数: 506 天

[LV.9]以坛为家II

 楼主| 发表于 2021-9-24 10:09 | 显示全部楼层
  【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  实验九十七: 0.96寸I2C IIC通信128*64显示器 OLED液晶屏模块
  项目三十五:十六位音乐反应式 LED 灯条(实验视频)
https://v.youku.com/v_show/id_XN ... hcb.playlsit.page.1






签到天数: 506 天

[LV.9]以坛为家II

 楼主| 发表于 2021-9-24 10:30 | 显示全部楼层
  【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  实验六十一:直条16位 WS2812B 5050 RGB LED内置全彩驱动彩灯模块
  项目四十:十六位音乐频谱灯条

  实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  3.   实验六十一:直条16位 WS2812B 5050 RGB LED内置全彩驱动彩灯模块
  4.   项目四十:十六位音乐频谱灯条
  5. */

  6. #include "FastLED.h"

  7. #define OCTAVE 1 //   // Group buckets into octaves  (use the log output function LOG_OUT 1)
  8. #define OCT_NORM 0 // Don't normalise octave intensities by number of bins
  9. #define FHT_N 256 // set to 256 point fht
  10. #include <FHT.h> // include the library
  11. //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}


  12. // int noise[] = {204,190,108,85,65,65,55,60}; // noise for mega adk
  13. int noise[] = {204,195,100,90,85,80,75,75}; // noise for NANO
  14. //int noise[] = {204,198,100,85,85,80,80,80};
  15. 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}
  16. 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}


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


  20. // Params for width and height
  21. const uint8_t kMatrixWidth = 8;
  22. const uint8_t kMatrixHeight = 8;//----------was 27
  23. //#define NUM_LEDS (kMatrixWidth * kMatrixHeight)
  24. #define NUM_LEDS    64

  25. CRGB leds[NUM_LEDS];

  26. int counter2=0;



  27. void setup() {
  28. Serial.begin(9600);
  29.   delay(1000);
  30.   FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  31.   
  32.   FastLED.setBrightness (33);
  33.   fill_solid(leds, NUM_LEDS, CRGB::Black);
  34.   FastLED.show();   
  35. // TIMSK0 = 0; // turn off timer0 for lower jitter
  36.   ADCSRA = 0xe5; // set the adc to free running mode
  37.   ADMUX = 0x40; // use adc0
  38.   DIDR0 = 0x01; // turn off the digital input for adc0

  39. }




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

  51. while (1) { // reduces jitter

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

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


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


  81.       for (int i=1; i<8; i++) {
  82.           noise_fact_adj[i]=noise_fact[i]*master_volume;
  83.       }

  84.       ADMUX = 0x40 | (0 & 0x07); // set admux back to look at A0 analog pin (to read the microphone input
  85.       counter = 0;
  86.     }
  87.         
  88.     sei();
  89.     counter++;

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

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

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

  96.       int j;      
  97.       j = (fht_oct_out[i] - noise[i]); // take the pink noise average level out, take the asbolute value to avoid negative numbers
  98.       if (j<10) {j=0;}  
  99.       j= j*noise_fact_adj[i];
  100.       
  101.       if (j<10) {j=0;}
  102.       else {  
  103.         j= j*noise_fact_adj[i];
  104.         if (j>180) {
  105.           if (i>=7) {
  106.             beat+=2;
  107.           }
  108.           else {
  109.             beat+=1;
  110.           }
  111.         }
  112.         j=j/30;
  113.         j=j*30; // (force it to more discrete values)
  114.       }
  115.       
  116.       prev_j[i]=j;

  117. //     Serial.print(j);
  118. //     Serial.print(" ");


  119. // this fills in 11 LED's with interpolated values between each of the 8 OCT values
  120.        if (i>=2) {
  121.         led_index=2*i-3;
  122.         prev_oct_j=(j+prev_j[i-1])/2;
  123.         
  124.         saturation=constrain(j+50, 0,255);//-----------50 was 30
  125.         saturation_prev=constrain(prev_oct_j+50, 0,255);
  126.         brightness=constrain(j, 0,255);
  127.         brightness_prev=constrain(prev_oct_j, 0,255);
  128. if (brightness==255) {
  129.   saturation=50;
  130.   brightness=200;
  131. }
  132. if (brightness_prev==255) {
  133.   saturation_prev=50;
  134.   brightness_prev=200;
  135. }


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


  146.       if (beat>=7) {
  147.           fill_solid(leds, NUM_LEDS, CRGB::Gray);         
  148.           FastLED.setBrightness(200);



  149.       }                 
  150.     else {
  151.       if (prev_beat!=beat) {
  152.         FastLED.setBrightness(40+beat*beat*5);
  153.         prev_beat=beat;
  154.       }

  155.     }

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

  165. // Serial.println();
  166. }
  167. }



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

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

  174. uint16_t XY( uint8_t x, uint8_t y)
  175. {
  176.   uint16_t i;
  177.   
  178.   if( kMatrixSerpentineLayout == false) {
  179.     i = (y * kMatrixWidth) + x;
  180.   }

  181.   if( kMatrixSerpentineLayout == true) {
  182.     if( y & 0x01) {
  183.       // Odd rows run backwards
  184.       uint8_t reverseX = (kMatrixWidth - 1) - x;
  185.       i = (y * kMatrixWidth) + reverseX;

  186.     } else {
  187.       // Even rows run forwards
  188.       i = (y * kMatrixWidth) + x;

  189.     }
  190.   }
  191.   
  192.   i=(i+counter2)%NUM_LEDS;  
  193.   return i;
  194. }
复制代码


签到天数: 506 天

[LV.9]以坛为家II

 楼主| 发表于 2021-9-24 10:39 | 显示全部楼层
本帖最后由 eagler8 于 2021-9-24 10:56 编辑

  【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  实验六十一:直条16位 WS2812B 5050 RGB LED内置全彩驱动彩灯模块
  项目四十:十六位音乐频谱灯条

实验视频剪辑

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




签到天数: 506 天

[LV.9]以坛为家II

 楼主| 发表于 2021-9-24 11:52 | 显示全部楼层
  【Arduino】168种传感器模块系列实验(资料代码 +图形编程 +仿真编程)
  实验六十一:直条16位 WS2812B 5050 RGB LED内置全彩驱动彩灯模块
  项目四十一:快速哈特利变换FHT音乐反应灯条

  实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码 +图形编程 +仿真编程)
  3.   实验六十一:直条16位 WS2812B 5050 RGB LED内置全彩驱动彩灯模块
  4.   项目四十一:快速哈特利变换FHT音乐反应灯条
  5. */

  6. /*
  7.   这是带有 FastLED 的 FHT 库的项目
  8.   FHT 库位于 http://wiki.openmusiclabs.com/wiki/ArduinoFHT
  9.   开始的例子是:
  10.   https://github.com/TJC/arduino/blob/master/fhttest/fhttest.cpp

  11.   注意:如果您使用的是由 3.3V 信号供电的麦克风,例如 Sparkfun MEMS 麦克风,则将 3.3V 连接到 AREF 引脚。
  12.   还要确保取消对 analogReference(EXTERNAL); 的注释。 在设置()中。

  13.   在线频率发生器 测试:http://onlinetonegenerator.com/frequency-sweep-generator.html
  14. */


  15. #define qsubd(x, b) ((x>b)?wavebright:0)                     // A digital unsigned subtraction macro. if result <0, then => 0. Otherwise, take on fixed value.
  16. #define qsuba(x, b) ((x>b)?x-b:0)                            // Unsigned subtraction macro. if result <0, then => 0.

  17. #define wavebright 128                                        // qsubd result will be this value if subtraction is >0.

  18. #include "FastLED.h"                                          // FastLED library. Preferably the latest copy of FastLED 2.1.

  19. #if FASTLED_VERSION < 3001000
  20. #error "Requires FastLED 3.1 or later; check github for latest code."
  21. #endif

  22. // Fixed definitions cannot change on the fly.
  23. #define LED_DT 6                                             // Data pin to connect to the strip.
  24. //#define LED_CK 11                                             // Clock pin for APA102 or WS2801
  25. #define COLOR_ORDER GRB                                       // It's GRB for WS2812
  26. #define LED_TYPE WS2812B                                       // What kind of strip are you using (APA102, WS2801 or WS2812B)
  27. #define NUM_LEDS 16                                        // Number of LED's.

  28. // Initialize changeable global variables.
  29. uint8_t max_bright = 255;                                     // Overall brightness definition. It can be changed on the fly.

  30. struct CRGB leds[NUM_LEDS];                                   // Initialize our LED array.


  31. #define LOG_OUT 1

  32. #define FHT_N 256                                             // Set to 256 point fht.
  33. #define inputPin A0
  34. //#define potPin A4

  35. #include <FHT.h>                                              // FHT library


  36. uint8_t hueinc = 0;                                               // A hue increment value to make it rotate a bit.
  37. uint8_t micmult = 25;
  38. uint8_t fadetime = 900;
  39. uint8_t noiseval = 25;                                        // Increase this to reduce sensitivity. 30 seems best for quiet

  40. void setup() {
  41.   analogReference(EXTERNAL);                                  // Connect 3.3V to AREF pin for any microphones using 3.3V
  42.   Serial.begin(9600);                                        // use the serial port

  43.   LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);
  44.   //  LEDS.addLeds<LED_TYPE, LED_DT, LED_CK, COLOR_ORDER>(leds, NUM_LEDS);

  45.   FastLED.setBrightness(max_bright);
  46.   set_max_power_in_volts_and_milliamps(5, 500);               // FastLED Power management set at 5V, 500mA.
  47. }


  48. void loop() {
  49.   //    noiseval = map(analogRead(potPin), 0, 1023, 16, 48);          // Adjust sensitivity of cutoff.
  50.   EVERY_N_MILLISECONDS(13) {
  51.     fhtsound();
  52.   }
  53.   show_at_max_brightness_for_power();

  54.   Serial.println(LEDS.getFPS(), DEC);         // Display frames per second on the serial monitor.
  55.   Serial.println(" ");          // Display frames per second on the serial monitor.
  56.   Serial.println(analogRead(inputPin));       // print as an ASCII-encoded decimal         */

  57. }


  58. void fhtsound() {
  59.   // hueinc++;                                                   // A cute little hue incrementer.
  60.   GetFHT();                                                   // Let's take FHT_N samples and crunch 'em.

  61.   for (int i = 0; i < NUM_LEDS; i++) {                        // Run through the LED array.

  62.     int tmp = qsuba(fht_log_out[2 * i + 2], noiseval);       // Get the sample and subtract the 'quiet' normalized values, but don't go < 0.
  63.     if (tmp > (leds[i].r + leds[i].g + leds[i].b) / 2)          // Refresh an LED only when the intensity is low
  64.       leds[i] = CHSV((i * 4) + tmp * micmult, 255, tmp * micmult); // Note how we really cranked up the tmp value to get BRIGHT LED's. Also increment the hue for fun.
  65.     leds[i].nscale8(fadetime);                                     // Let's fade the whole thing over time as well.
  66.   }
  67. } // fhtsound()


  68. void GetFHT() {
  69.   cli();
  70.   for (int i = 0 ; i < FHT_N ; i++) fht_input[i] = analogRead(inputPin);
  71.   sei();

  72.   fht_window();                                               // Window the data for better frequency response.
  73.   fht_reorder();                                              // Reorder the data before doing the fht.
  74.   fht_run();                                                  // Process the data in the fht.
  75.   fht_mag_log();
  76. } // GetFHT()
复制代码


签到天数: 506 天

[LV.9]以坛为家II

 楼主| 发表于 2021-9-24 12:00 | 显示全部楼层
  【Arduino】168种传感器模块系列实验(资料代码 +图形编程 +仿真编程)
  实验六十一:直条16位 WS2812B 5050 RGB LED内置全彩驱动彩灯模块
  项目四十一:快速哈特利变换FHT音乐反应灯条

  实验视频剪辑

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



签到天数: 506 天

[LV.9]以坛为家II

 楼主| 发表于 2021-10-8 15:11 | 显示全部楼层
  【花雕动手做】有趣好玩的音乐可视化系列小项目(04)---WS2812条灯
  项目之一: 使用KY—038声音模块的阙值触发WS2812节奏灯条

  实验开源代码

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化系列小项目(04)---WS2812条灯
  3.   项目之一: 使用KY—038声音模块的阙值触发WS2812节奏灯条
  4. */

  5. #include<FastLED.h>
  6. #define LED_PIN 6
  7. #define NUM_LEDS 8

  8. CRGB leds[NUM_LEDS];
  9. uint8_t hue = 0;
  10. int soundsensor = 7;

  11. void setup() {
  12.   delay(2000);
  13.   Serial.begin(9600);
  14.   FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
  15.   FastLED.setBrightness(255);
  16.   pinMode(soundsensor, INPUT);
  17. }

  18. void loop() {
  19.   int sensval = digitalRead(soundsensor);

  20.   if (sensval == 1) {
  21.     Serial.println("ON");
  22.     leds[0] = CRGB :: Red;
  23.     fill_solid(leds, NUM_LEDS, CRGB :: Blue);
  24.     rainbow_moving();
  25.     FastLED.show();
  26.     delay(10);
  27.   }
  28.   else {
  29.     leds[0] = CRGB :: Black;
  30.     fill_solid(leds, NUM_LEDS, CRGB :: Black);
  31.     FastLED.show();
  32.     delay(10);
  33.   }
  34. }

  35. void rainbow_moving() {
  36.   for (int i = 0; i < NUM_LEDS; i++) {
  37.     leds[i] = CHSV(hue + (i * 10), 255, 255);
  38.   }
  39.   EVERY_N_MILLISECONDS(10) {
  40.     hue++;
  41.   }
  42. }
复制代码


签到天数: 506 天

[LV.9]以坛为家II

 楼主| 发表于 2021-10-8 15:12 | 显示全部楼层
【花雕动手做】有趣好玩的音乐可视化系列小项目(04)---WS2812条灯
  项目之一: 使用KY—038声音模块的阙值触发WS2812节奏灯条

  实验场景图

03.jpg

签到天数: 506 天

[LV.9]以坛为家II

 楼主| 发表于 2021-10-8 15:13 | 显示全部楼层
【花雕动手做】有趣好玩的音乐可视化系列小项目(04)---WS2812条灯
  项目之一: 使用KY—038声音模块的阙值触发WS2812节奏灯条

  实验视频剪辑

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



签到天数: 506 天

[LV.9]以坛为家II

 楼主| 发表于 2021-10-8 15:14 | 显示全部楼层
  实验场景动态图
04.gif


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

本版积分规则

热门推荐

原价299元【语音开发板套件】限时免费领!
原价299元【语音开发板套
教你让OLED动起来!多重字符串版!
教你让OLED动起来!多重字
大家都知道:arduino单片机是单线程的 而上次教程中的多段字符串的运行速度必须一致
TTGO T8 1.7.1使用TFT_eSPI库驱动2.4寸ILI9341屏幕显示板载SD内图片
TTGO T8 1.7.1使用TFT_eSP
TTGO T8 1.7.1采用Espressif官方ESP32-WROVER模块制作,4MB闪存和8MB PSRAM,支持TF
TTGO TFT屏幕Arduino使用的小结
TTGO TFT屏幕Arduino使用
TTGO TFT屏幕是一款ESP32和1.44寸LCD屏幕组合的产品,屏幕由ST7789驱动。ESP32自带520
分享我的第一个点灯程序——家庭控制中心
分享我的第一个点灯程序—
2020年,在B站上初识ESP8266,被ESP8266的低门槛、高性价比深深吸引,2020年6月20日,
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表