Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

[经验] 【Arduino】108种传感器模块系列实验(105)---12位智能RGB彩环

[复制链接]
 楼主| 发表于 2021-10-9 12:26 | 显示全部楼层
  【花雕动手做】有趣好玩的音乐可视化系列小项目(05)---WS2812柱跳灯
  项目之二:Adafruit_NeoPixel库的音乐可视化环灯

  实验开源代码

  1. /*
  2.   【花雕动手做】有趣好玩的音乐可视化系列小项目(05)---WS2812柱跳灯
  3.   项目之二:Adafruit_NeoPixel库的音乐可视化环灯
  4. */

  5. #include <Adafruit_NeoPixel.h>

  6. #define MIC A0 // 麦克风与A0相连接
  7. #define LED_PIN 6 // LED are connected to D6
  8. #define N_PIXELS 12 // Number of LED
  9. #define N 100 //样本数
  10. #define fadeDelay 10 // 淡出量
  11. #define noiseLevel 15 // 降噪下限

  12. Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

  13. int samples[N]; // 存储样本
  14. int periodFactor = 0; // 用于周期计算
  15. int t1 = -1;
  16. int T;
  17. int slope;
  18. byte periodChanged = 0;

  19. void setup() {
  20.   // Serial.begin(9600);
  21.   strip.begin();
  22.   ledsOff();
  23.   delay(500);
  24.   displayColor(Wheel(100));
  25.   strip.show();
  26.   delay(500);
  27. }

  28. void loop() {
  29.   Samples();
  30. }

  31. void Samples() {
  32.   for (int i = 0; i < N; i++) {
  33.     samples[i] = analogRead(0);
  34.     if (i > 0) {
  35.       slope = samples[i] - samples[i - 1];
  36.     }
  37.     else {
  38.       slope = samples[i] - samples[N - 1];
  39.     }

  40.     if (abs(slope) > noiseLevel) {
  41.       if (slope < 0) {
  42.         calculatePeriod(i);
  43.         if (periodChanged == 1) {
  44.           displayColor(getColor(T));
  45.         }
  46.       }
  47.     }
  48.     else {
  49.       ledsOff();
  50.     }
  51.     periodFactor += 1;
  52.     delay(1);
  53.   }
  54. }

  55. void calculatePeriod(int i) {
  56.   if (t1 == -1) {

  57.     t1 = i;
  58.   }
  59.   else {

  60.     int period = periodFactor * (i - t1);
  61.     periodChanged = T == period ? 0 : 1;
  62.     T = period;
  63.     // Serial.println(T);

  64.     t1 = i;
  65.     periodFactor = 0;
  66.   }
  67. }

  68. uint32_t getColor(int period) {
  69.   if (period == -1)
  70.     return Wheel(0);
  71.   else if (period > 400)
  72.     return Wheel(5);
  73.   else
  74.     return Wheel(map(-1 * period, -400, -1, 50, 255));
  75. }

  76. void fadeOut()
  77. {
  78.   for (int i = 0; i < 5; i++) {
  79.     strip.setBrightness(110 - i * 20);
  80.     strip.show(); // Update strip
  81.     delay(fadeDelay);
  82.     periodFactor += fadeDelay;
  83.   }
  84. }

  85. void fadeIn() {
  86.   strip.setBrightness(100);
  87.   strip.show();

  88.   for (int i = 0; i < 5; i++) {
  89.     //strip.setBrightness(20*i + 30);
  90.     //strip.show();
  91.     delay(fadeDelay);
  92.     periodFactor += fadeDelay;
  93.   }
  94. }

  95. void ledsOff() {
  96.   fadeOut();
  97.   for (int i = 0; i < N_PIXELS; i++) {
  98.     strip.setPixelColor(i, 0, 0, 0);
  99.   }
  100. }

  101. void displayColor(uint32_t color) {
  102.   for (int i = 0; i < N_PIXELS; i++) {
  103.     strip.setPixelColor(i, color);
  104.   }
  105.   fadeIn();
  106. }

  107. uint32_t Wheel(byte WheelPos) {
  108.   // Serial.println(WheelPos);
  109.   if (WheelPos < 85) {

  110.     return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  111.   }
  112.   else if (WheelPos < 170) {
  113.     WheelPos -= 85;
  114.     return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  115.   }
  116.   else {
  117.     WheelPos -= 170;
  118.     return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  119.   }
  120. }
复制代码

 楼主| 发表于 2021-10-9 12:31 | 显示全部楼层

【花雕动手做】有趣好玩的音乐可视化系列小项目(05)---WS2812柱跳灯
  项目之二:Adafruit_NeoPixel库的音乐可视化环灯

  实验视频剪辑


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


 楼主| 发表于 2021-10-9 12:37 | 显示全部楼层
  实验场景 动态图

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

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-12-2 04:56 , Processed in 0.072685 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表