|
Arduino源程序如下:- /*MAX9814掉落效果版本
- WS2812 燈帶*1
- MAX9814模塊*1
- 公對(duì)母杜邦線(xiàn)*6
- ESP8266NODEMCU開(kāi)發(fā)板*1
- 開(kāi)發(fā)板選擇Wifiduino 《《====================================
- 最小系統(tǒng)接線(xiàn)(燈帶60燈珠以下)
- MAX9814 WS2812 ES8266
- VCC +5V 3.3V
- GND GND GND
- OUT / DIN A0/GPIO5
- GAIN 3.3
- * * QQ群1147147694 《《=====================================
- */
- //中間擴(kuò)散效果
- #include "FastLED.h"
- #define NUM_LEDS 144 // LED燈珠數(shù)量
- #define LED_DT 5 // 輸出控制信號(hào)引腳
- #define sigPin A0 // ESP8266ADC引腳接MAX9814 OUT信號(hào)引腳 GAIN接3.3V
- #define LED_TYPE WS2812 // LED燈帶型號(hào)
- #define COLOR_ORDER GRB
- CRGB leds[NUM_LEDS]; // 建立光帶leds
- int sig;//麥克風(fēng)讀取數(shù)值
- int pre_si;//指示舊值
- int si;//指示新值
- int sig_min = 1024;//初始讀取值最大小值,開(kāi)機(jī)后將重新界定
- int sig_max = 0;
- double triger_factor = 1.40;//閾值 過(guò)濾噪音 該數(shù)值調(diào)整范圍1-2 數(shù)值越高要求聲音越大才能觸發(fā)
- int drop_dot; //初始掉落位置
- unsigned long drop_time;//觸發(fā)掉落時(shí)機(jī)
- int interval = 30; //每次律動(dòng)變化的過(guò)渡時(shí)間
- int drop_interval = 100; //掉落點(diǎn)收縮速度
- int maxBrightness = 250;
- int mid = int(NUM_LEDS / 2);
- int delta = int(maxBrightness / mid); //漸變量
- unsigned long triger_time = 0;
- int randC = 130; //掉落點(diǎn)隨機(jī)顏色初始
- bool raising = true;
- void setup() {
- Serial.begin(115200);
- LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);
- // .setCorrection(TypicalLEDStrip);//如果燈帶未響應(yīng),請(qǐng)?jiān)O(shè)置
- FastLED.setBrightness(255); // 設(shè)置光帶亮度
- pinMode(sigPin, INPUT);
- }
- void loop()
- {
- musicV();
- }
- void musicV()
- {
- //計(jì)算環(huán)境讀取最大最小值,所以在上電后循環(huán)幾次后達(dá)到平穩(wěn)的觸發(fā)值。
- 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;
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|