10.9_MAX9814_esp8266WS2812麥克風律動簡單電路.png (354.28 KB, 下載次數: 84)
下載附件
2021-10-6 14:19 上傳
Arduino源程序如下:- /*MAX9814掉落效果版本
- WS2812 燈帶*1
- MAX9814模塊*1
- 公對母杜邦線*6
- ESP8266NODEMCU開發板*1
- 開發板選擇Wifiduino 《《====================================
- 最小系統接線(燈帶60燈珠以下)
- MAX9814 WS2812 ES8266
- VCC +5V 3.3V
- GND GND GND
- OUT / DIN A0/GPIO5
- GAIN 3.3
- * * QQ群1147147694 《《=====================================
- */
- //中間擴散效果
- #include "FastLED.h"
- #define NUM_LEDS 144 // LED燈珠數量
- #define LED_DT 5 // 輸出控制信號引腳
- #define sigPin A0 // ESP8266ADC引腳接MAX9814 OUT信號引腳 GAIN接3.3V
- #define LED_TYPE WS2812 // LED燈帶型號
- #define COLOR_ORDER GRB
- CRGB leds[NUM_LEDS]; // 建立光帶leds
- int sig;//麥克風讀取數值
- int pre_si;//指示舊值
- int si;//指示新值
- int sig_min = 1024;//初始讀取值最大小值,開機后將重新界定
- int sig_max = 0;
- double triger_factor = 1.40;//閾值 過濾噪音 該數值調整范圍1-2 數值越高要求聲音越大才能觸發
- int drop_dot; //初始掉落位置
- unsigned long drop_time;//觸發掉落時機
- int interval = 30; //每次律動變化的過渡時間
- int drop_interval = 100; //掉落點收縮速度
- int maxBrightness = 250;
- int mid = int(NUM_LEDS / 2);
- int delta = int(maxBrightness / mid); //漸變量
- unsigned long triger_time = 0;
- int randC = 130; //掉落點隨機顏色初始
- bool raising = true;
- void setup() {
- Serial.begin(115200);
- LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);
- // .setCorrection(TypicalLEDStrip);//如果燈帶未響應,請設置
- FastLED.setBrightness(255); // 設置光帶亮度
- pinMode(sigPin, INPUT);
- }
- void loop()
- {
- musicV();
- }
- void musicV()
- {
- //計算環境讀取最大最小值,所以在上電后循環幾次后達到平穩的觸發值。
- sig = analogRead(sigPin);
- if (sig < sig_max)//
- {
- sig_max = sig;
- }
- if (sig > sig_min)
- {
- sig_min = sig;
- }
- int mean = (sig_min + sig_max) / 2;
- int _sig = abs(sig - mean ) + mean;
- _sig = constrain(_sig, int(mean * triger_factor), sig_max);
- //Serial.println(_sig);
- 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);
- si = constrain(si, 0, mid - 2);
- if (si == mid - 2) {
- randC = random(0, 255);
- pre_si = 0;
- }
- Serial.println(randC);
- //===================================================================================================== PART1
- if (si > pre_si)
- {
- if (si > drop_dot)
- {
- if (si * 1.6 < mid - 1) {
- drop_dot = int(si * 1.6);
- }
- else {
- drop_dot = mid - 3;
- }
- }
- for (int j = pre_si - 1; j < si + 1; j++)
- {
- while ( millis() - triger_time < int(interval / (si - pre_si) + 2))
- {
- if ((drop_dot > j + 3 ) && (millis() - drop_time > drop_interval))
- {
- leds [mid + drop_dot + 1] = CRGB::Black;
- leds [mid - 1 - drop_dot - 1] = CRGB::Black;
- leds[mid + drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
- leds[mid - 1 - drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
- FastLED.show();
- drop_dot--;
- drop_time = millis();
- }
- leds [mid + j] = CHSV(delta * j, 255, maxBrightness - delta * j);
- leds [mid - 1 - j] = CHSV(delta * j, 255, maxBrightness - delta * j);
- //leds [mid + j] = CHSV(randC, 255, 255 - delta * j);
- //leds [mid - 1 - j] = CHSV(randC, 255, 255 - delta * j);
- }
- FastLED.show();
- triger_time = millis();
- }
- }
- // --------------------------------------------------------------------------------------------------
- //===================================================================================================== PART2
- if (si < pre_si)
- {
- leds [mid + drop_dot + 1] = CRGB::Black;
- leds [mid - 1 - drop_dot - 1] = CRGB::Black;
- leds[mid + drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
- leds[mid - 1 - drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
- FastLED.show();
- drop_dot--;
- drop_time = millis();
- for (int k = pre_si + 1; k > si - 1; k--)
- {
- while ( millis() - triger_time < int(interval / (pre_si - si) + 2))
- {
- if ((drop_dot > k + 3 ) && (millis() - drop_time > drop_interval))
- {
- leds [mid + drop_dot + 1] = CRGB::Black;
- leds [mid - 1 - drop_dot - 1] = CRGB::Black;
- leds[mid + drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
- leds[mid - 1 - drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
- FastLED.show();
- drop_dot--;
- drop_time = millis();
- }
- leds[mid + k] = CRGB::Black;
- leds[mid - 1 - k] = CRGB::Black;
- }
- FastLED.show();
- triger_time = millis();
- }
- }
- // --------------------------------------------------------------------------------------------------
- if (si == 0 && pre_si == 0 && drop_dot > -1 && (millis() - drop_time > drop_interval))
- {
- leds [mid + drop_dot + 1] = CRGB::Black;
- leds [mid - 1 - drop_dot - 1] = CRGB::Black;
- leds[mid + drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
- leds[mid - 1 - drop_dot] = CHSV(int(255 - randC), 255, maxBrightness);
- if (drop_dot == 0)
- {
- leds [mid + drop_dot] = CRGB::Black;
- leds [mid - 1 - drop_dot] = CRGB::Black;
- }
- FastLED.show();
- drop_dot--;
- drop_time = millis();
- }
- pre_si = si;
- }
復制代碼
|