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;
- }
复制代码
|