找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 6192|回復(fù): 7
收起左側(cè)

MAX9814 ws2812拾音燈Arduino程序

  [復(fù)制鏈接]
ID:785695 發(fā)表于 2021-10-6 14:20 | 顯示全部樓層 |閱讀模式
10.9_MAX9814_esp8266WS2812麥克風(fēng)律動(dòng)簡(jiǎn)單電路.png

Arduino源程序如下:
  1. /*MAX9814掉落效果版本
  2.    WS2812 燈帶*1
  3.    MAX9814模塊*1
  4.    公對(duì)母杜邦線(xiàn)*6
  5.    ESP8266NODEMCU開(kāi)發(fā)板*1

  6.   開(kāi)發(fā)板選擇Wifiduino   《《====================================

  7.   最小系統(tǒng)接線(xiàn)(燈帶60燈珠以下)
  8.   MAX9814 WS2812   ES8266
  9.   VCC      +5V     3.3V
  10.   GND      GND     GND
  11.   OUT   /  DIN     A0/GPIO5
  12.   GAIN             3.3
  13. * * QQ群1147147694  《《=====================================
  14. */
  15. //中間擴(kuò)散效果
  16. #include "FastLED.h"
  17. #define NUM_LEDS 144            // LED燈珠數(shù)量
  18. #define LED_DT 5                // 輸出控制信號(hào)引腳
  19. #define sigPin A0                // ESP8266ADC引腳接MAX9814 OUT信號(hào)引腳  GAIN接3.3V
  20. #define LED_TYPE WS2812       // LED燈帶型號(hào)
  21. #define COLOR_ORDER GRB
  22. CRGB leds[NUM_LEDS];            // 建立光帶leds




  23. int sig;//麥克風(fēng)讀取數(shù)值
  24. int pre_si;//指示舊值
  25. int si;//指示新值
  26. int sig_min = 1024;//初始讀取值最大小值,開(kāi)機(jī)后將重新界定
  27. int sig_max = 0;
  28. double triger_factor = 1.40;//閾值 過(guò)濾噪音 該數(shù)值調(diào)整范圍1-2 數(shù)值越高要求聲音越大才能觸發(fā)
  29. int drop_dot; //初始掉落位置
  30. unsigned long drop_time;//觸發(fā)掉落時(shí)機(jī)
  31. int interval = 30; //每次律動(dòng)變化的過(guò)渡時(shí)間
  32. int drop_interval = 100; //掉落點(diǎn)收縮速度
  33. int maxBrightness = 250;
  34. int mid = int(NUM_LEDS / 2);
  35. int delta = int(maxBrightness / mid); //漸變量
  36. unsigned long triger_time = 0;
  37. int randC = 130; //掉落點(diǎn)隨機(jī)顏色初始
  38. bool raising = true;
  39. void setup() {
  40.   Serial.begin(115200);
  41.   LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);
  42.   // .setCorrection(TypicalLEDStrip);//如果燈帶未響應(yīng),請(qǐng)?jiān)O(shè)置
  43.   FastLED.setBrightness(255);                            // 設(shè)置光帶亮度
  44.   pinMode(sigPin, INPUT);
  45. }


  46. void loop()
  47. {
  48.   musicV();
  49. }


  50. void musicV()
  51. {
  52.   //計(jì)算環(huán)境讀取最大最小值,所以在上電后循環(huán)幾次后達(dá)到平穩(wěn)的觸發(fā)值。
  53.   sig = analogRead(sigPin);

  54.   if (sig < sig_max)//
  55.   {
  56.     sig_max = sig;
  57.   }
  58.   if (sig > sig_min)
  59.   {
  60.     sig_min = sig;
  61.   }

  62.   int mean = (sig_min + sig_max) / 2;

  63.   int _sig = abs(sig - mean ) + mean;


  64.   _sig = constrain(_sig, int(mean * triger_factor), sig_max);
  65.   //Serial.println(_sig);

  66.   si = map(_sig - int(mean * triger_factor), int(mean * triger_factor) - int(mean * triger_factor), int(sig_max) - int(mean * triger_factor), 0, mid - 2);
  67.   si = constrain(si, 0, mid - 2);
  68.   if (si == mid - 2) {
  69.     randC = random(0, 255);

  70.     pre_si = 0;
  71.   }
  72.   Serial.println(randC);
  73.   //===================================================================================================== PART1
  74.   if (si > pre_si)
  75.   {
  76.     if (si > drop_dot)
  77.     {
  78.       if (si * 1.6 < mid - 1) {
  79.         drop_dot = int(si * 1.6);
  80.       }
  81.       else {
  82.         drop_dot = mid - 3;
  83.       }




  84.     }
  85.     for (int j = pre_si - 1; j < si + 1; j++)
  86.     {
  87.       while ( millis() - triger_time < int(interval / (si - pre_si) + 2))
  88.       {

  89.         if ((drop_dot > j + 3 ) && (millis() - drop_time > drop_interval))
  90.         {
  91.           leds [mid + drop_dot + 1] = CRGB::Black;
  92.           leds [mid - 1 - drop_dot - 1] = CRGB::Black;
  93.           leds[mid + drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
  94.           leds[mid - 1 - drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);

  95.           FastLED.show();
  96.           drop_dot--;
  97.           drop_time = millis();
  98.         }

  99.         leds [mid + j] = CHSV(delta * j, 255, maxBrightness - delta * j);
  100.         leds [mid - 1 - j] = CHSV(delta * j, 255, maxBrightness - delta * j);
  101.         //leds [mid + j] = CHSV(randC, 255, 255 - delta * j);
  102.         //leds [mid - 1 - j] = CHSV(randC, 255, 255 - delta * j);


  103.       }
  104.       FastLED.show();
  105.       triger_time = millis();
  106.     }
  107.   }
  108.   // --------------------------------------------------------------------------------------------------
  109.   //===================================================================================================== PART2
  110.   if (si < pre_si)
  111.   {
  112.     leds [mid + drop_dot + 1] = CRGB::Black;
  113.     leds [mid - 1 - drop_dot - 1] = CRGB::Black;
  114.     leds[mid + drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
  115.     leds[mid - 1 - drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
  116.     FastLED.show();
  117.     drop_dot--;
  118.     drop_time = millis();


  119.     for (int k = pre_si + 1; k > si - 1; k--)
  120.     {
  121.       while ( millis() - triger_time < int(interval / (pre_si - si) + 2))
  122.       {
  123.         if ((drop_dot > k + 3 ) && (millis() - drop_time > drop_interval))
  124.         {
  125.           leds [mid + drop_dot + 1] = CRGB::Black;
  126.           leds [mid - 1 - drop_dot - 1] = CRGB::Black;
  127.           leds[mid + drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
  128.           leds[mid - 1 - drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
  129.           FastLED.show();
  130.           drop_dot--;
  131.           drop_time = millis();

  132.         }


  133.         leds[mid + k] = CRGB::Black;

  134.         leds[mid - 1 - k] = CRGB::Black;
  135.       }
  136.       FastLED.show();
  137.       triger_time = millis();

  138.     }
  139.   }
  140.   // --------------------------------------------------------------------------------------------------

  141.   if (si == 0 && pre_si == 0 && drop_dot > -1 && (millis() - drop_time > drop_interval))
  142.   {
  143.     leds [mid + drop_dot + 1] = CRGB::Black;
  144.     leds [mid - 1 - drop_dot - 1] = CRGB::Black;

  145.     leds[mid + drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
  146.     leds[mid - 1 - drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
  147.     if (drop_dot == 0)
  148.     {
  149.       leds [mid + drop_dot] = CRGB::Black;
  150.       leds [mid - 1 - drop_dot] = CRGB::Black;
  151.     }
  152.     FastLED.show();
  153.     drop_dot--;
  154.     drop_time = millis();

  155.   }
  156.   pre_si = si;
  157. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:697622 發(fā)表于 2021-10-9 10:24 | 顯示全部樓層
正好手頭有這幾樣?xùn)|東,花了一會(huì)時(shí)間就搭建好了電路,燒了程序,調(diào)整閥值,效果還可以。
回復(fù)

使用道具 舉報(bào)

ID:288183 發(fā)表于 2021-10-19 09:32 | 顯示全部樓層
#include "FastLED.h"  請(qǐng)問(wèn)這個(gè)頭文件有嗎?能否分享份完整的代碼,謝謝?
回復(fù)

使用道具 舉報(bào)

ID:1041015 發(fā)表于 2022-7-30 15:34 | 顯示全部樓層
yanzhuangsongqi 發(fā)表于 2021-10-19 09:32
#include "FastLED.h"  請(qǐng)問(wèn)這個(gè)頭文件有嗎?能否分享份完整的代碼,謝謝?

兄弟,你解決了沒(méi)?
回復(fù)

使用道具 舉報(bào)

ID:482083 發(fā)表于 2022-9-4 17:05 | 顯示全部樓層
yanzhuangsongqi 發(fā)表于 2021-10-19 09:32
#include "FastLED.h"  請(qǐng)問(wèn)這個(gè)頭文件有嗎?能否分享份完整的代碼,謝謝?

找個(gè)梯子,直接arduino里的庫(kù)能找到的
回復(fù)

使用道具 舉報(bào)

ID:967397 發(fā)表于 2022-9-7 10:57 | 顯示全部樓層
樓主,刷了燈帶沒(méi)反應(yīng)是啥情況?
回復(fù)

使用道具 舉報(bào)

ID:967397 發(fā)表于 2022-9-7 10:58 | 顯示全部樓層
樓主,燒錄程序后燈帶無(wú)反應(yīng)怎么解決?
回復(fù)

使用道具 舉報(bào)

ID:458472 發(fā)表于 2022-9-13 13:21 | 顯示全部樓層
fjm0218888 發(fā)表于 2022-9-7 10:58
樓主,燒錄程序后燈帶無(wú)反應(yīng)怎么解決?

你把VCC的電去掉
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表