C++ 如何使用Goertzel库和C+中的FastLED制作Arduino LED音频可视化工具+;

C++ 如何使用Goertzel库和C+中的FastLED制作Arduino LED音频可视化工具+;,c++,audio,arduino,rgb,led,C++,Audio,Arduino,Rgb,Led,我目前正在从事一个项目,该项目涉及由Arduino和7个LED条带创建的音频可视化工具。我使用的是WS2812B带,分为7个带,每个带8个LED。我设法让它只使用一个光带工作,但我不知道如何将它分成不同的频率。由于某些原因,当我尝试时,它们似乎与我播放的频率不一致。我也不知道我的代码出了什么问题。我是一个业余爱好者,所以代码有点混乱,但如果有人能找出它为什么不工作,那就太棒了。以下是图书馆: #包括 #包括 //Aduino音频可视化工具2.1 //此音乐可视化器通过3.5毫米耳机插孔的模拟

我目前正在从事一个项目,该项目涉及由Arduino和7个LED条带创建的音频可视化工具。我使用的是WS2812B带,分为7个带,每个带8个LED。我设法让它只使用一个光带工作,但我不知道如何将它分成不同的频率。由于某些原因,当我尝试时,它们似乎与我播放的频率不一致。我也不知道我的代码出了什么问题。我是一个业余爱好者,所以代码有点混乱,但如果有人能找出它为什么不工作,那就太棒了。以下是图书馆:

#包括
#包括
//Aduino音频可视化工具2.1
//此音乐可视化器通过3.5毫米耳机插孔的模拟输入工作
//只需触摸A0到3.5毫米耳机插孔尖端的跨接导线
//代码是动态的,可以处理不同数量的LED
//只要您根据正在使用的LED数量调整NUM_LED
//LED照明设置
//#定义LED_引脚6
#定义LED_带7//列数
#定义NUM_led 8//每列的led数量
#定义亮度32//LED/原始64的亮度
#定义LED_类型WS2812B//设置LED条的类型
#定义颜色顺序GRB
CRGB发光二极管1[发光二极管数量];
CRGB发光二极管2[发光二极管数量];
CRGB发光二极管3[发光二极管数量];
CRGB发光二极管4[发光二极管数量];
CRGB发光二极管5[数量发光二极管];
CRGB发光二极管6[发光二极管数量];
CRGB发光二极管7[数量发光二极管];
CRGB发光二极管8[数量发光二极管];
#定义每秒更新次数100次
//音频输入设置
int audio=A0;
//标准可视化工具变量
int loop_max=0;
int k=255;//色轮位置
int衰减=3;//一次光线衰减前有多少毫秒
int DECATION_check=0;
长pre_react1=0;//新的尖峰转换
长反应1=0;//点亮的LED数量
长pre_react2=0;//新的尖峰转换
长反应2=0;//点亮的LED数量
长pre_react3=0;//新的尖峰转换
长反应3=0;//点亮的LED数量
长pre_react4=0;//新的尖峰转换
长反应4=0;//点亮的LED数量
长pre_react5=0;//新的尖峰转换
长反应5=0;//点亮的LED数量
长前置反应6=0;//新的尖峰转换
长反应6=0;//点亮的LED数量
长前置反应7=0;//新的尖峰转换
长反应7=0;//点亮的LED数量
长桩反应=0;//旧尖峰转换
//彩虹波设置
int车轮转速=2;
浮动目标_频率=400;
常数int N=8;
int阈值;
浮动采样频率=8900;
Goertzel Goertzel=Goertzel(目标频率,N,采样频率);
布尔零;
灵敏度=10;
int值;
int pre_mag1;
int pre_mag2;
int pre_mag3;
int pre_mag4;
int pre_mag5;
int pre_mag6;
int pre_mag7;
int-mag1=0;
int-mag2=0;
int mag3=0;
int mag4=0;
int mag5=0;
int mag6=0;
int mag7=0;
int-dif1;
int-dif2;
int dif3;
int-dif4;
int-dif5;
int dif6;
int dif7;
无效设置()
{
//LED照明750
延时(3000);//上电安全延时
//声明所有LED条带
FastLED.AddLED(发光二极管1,发光二极管数)。设置校正(TypicCalledStrip);
FastLED.AddLED(发光二极管2,发光二极管数)。设置校正(TypicCalledStrip);
FastLED.AddLED(leds3,NUM_LED).setCorrection(TypicCalledStrip);
FastLED.AddLED(发光二极管4,发光二极管数)。设置校正(TypicCalledStrip);
快速发光二极管。添加发光二极管(发光二极管5,数量发光二极管)。设置校正(典型称为触发);
FastLED.AddLED(发光二极管6,发光二极管数)。设置校正(典型称为触发);
快速发光二极管。添加发光二极管(发光二极管7,数量发光二极管)。设置校正(典型称为触发);
//FastLED.AddLED(发光二极管8,发光二极管数)。设置校正(TypicCalledStrip);
快速。正确性(亮度);
//清除LEDSf
对于(int i=0;i#include <Goertzel.h>
#include <FastLED.h>

// Aduino Audio Visualizer 2.1

// This music visualizer works off of analog input from a 3.5mm headphone jack
// Just touch jumper wire from A0 to tip of 3.5mm headphone jack

// The code is dynamic and can handle variable amounts of LEDs
// as long as you adjust NUM_LEDS according to the amount of LEDs you are using

// LED LIGHTING SETUP
//#define LED_PIN     6
#define LED_STRIPS    7      // number of columns 
#define NUM_LEDS      8      // the number of LEDs per column
#define BRIGHTNESS   32      // the brightness of the LEDS /ORIGINAL 64
#define LED_TYPE    WS2812B  //Set the type of LED Strips
#define COLOR_ORDER GRB
CRGB leds1[NUM_LEDS];
CRGB leds2[NUM_LEDS];
CRGB leds3[NUM_LEDS];
CRGB leds4[NUM_LEDS];
CRGB leds5[NUM_LEDS];
CRGB leds6[NUM_LEDS];
CRGB leds7[NUM_LEDS];
CRGB leds8[NUM_LEDS];

#define UPDATES_PER_SECOND 100

// AUDIO INPUT SETUP
int audio = A0;

// STANDARD VISUALIZER VARIABLES
int loop_max = 0;
int k = 255; // COLOR WHEEL POSITION
int decay = 3; // HOW MANY MS BEFORE ONE LIGHT DECAY
int decay_check = 0;
long pre_react1 = 0; // NEW SPIKE CONVERSION
long react1 = 0; // NUMBER OF LEDs BEING LIT

long pre_react2 = 0; // NEW SPIKE CONVERSION
long react2 = 0; // NUMBER OF LEDs BEING LIT

long pre_react3 = 0; // NEW SPIKE CONVERSION
long react3 = 0; // NUMBER OF LEDs BEING LIT

long pre_react4 = 0; // NEW SPIKE CONVERSION
long react4 = 0; // NUMBER OF LEDs BEING LIT

long pre_react5 = 0; // NEW SPIKE CONVERSION
long react5 = 0; // NUMBER OF LEDs BEING LIT

long pre_react6 = 0; // NEW SPIKE CONVERSION
long react6 = 0; // NUMBER OF LEDs BEING LIT

long pre_react7 = 0; // NEW SPIKE CONVERSION
long react7 = 0; // NUMBER OF LEDs BEING LIT

long post_react = 0; // OLD SPIKE CONVERSION

// RAINBOW WAVE SETTINGS
int wheel_speed = 2;

float TARGET_FREQUENCY = 400; 
const int N = 8; 
 int THRESHOLD  ;  
float SAMPLING_FREQUENCY = 8900; 
Goertzel goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);

bool zero;
 int SENSITIVITY = 10;
 int yvalue;
  int pre_mag1;
   int pre_mag2;
    int pre_mag3;
     int pre_mag4;
      int pre_mag5;
       int pre_mag6;
        int pre_mag7;
 int mag1 = 0;
  int mag2 = 0;
   int mag3 = 0;
    int mag4 = 0;
     int mag5 = 0;
      int mag6 = 0;
       int mag7 = 0;
 int dif1;
  int dif2;
   int dif3;
    int dif4;
     int dif5;
      int dif6;
       int dif7;

void setup()
{
  // LED LIGHTING 750
  delay( 3000 ); // power-up safety delay
   // Declaring all strips of LEDS
  FastLED.addLeds<LED_TYPE, 2, COLOR_ORDER>(leds1, NUM_LEDS).setCorrection( TypicalLEDStrip );
   FastLED.addLeds<LED_TYPE, 3, COLOR_ORDER>(leds2, NUM_LEDS).setCorrection( TypicalLEDStrip );
   FastLED.addLeds<LED_TYPE, 4, COLOR_ORDER>(leds3, NUM_LEDS).setCorrection( TypicalLEDStrip );
   FastLED.addLeds<LED_TYPE, 5, COLOR_ORDER>(leds4, NUM_LEDS).setCorrection( TypicalLEDStrip );
   FastLED.addLeds<LED_TYPE, 6, COLOR_ORDER>(leds5, NUM_LEDS).setCorrection( TypicalLEDStrip );
   FastLED.addLeds<LED_TYPE, 7, COLOR_ORDER>(leds6, NUM_LEDS).setCorrection( TypicalLEDStrip );
   FastLED.addLeds<LED_TYPE, 8, COLOR_ORDER>(leds7, NUM_LEDS).setCorrection( TypicalLEDStrip );
  // FastLED.addLeds<LED_TYPE, 8, COLOR_ORDER>(leds8, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );


  // CLEAR LEDSf

      for (int i = 0; i < NUM_LEDS; i++)
      {
              leds1[i] = CRGB(0, 0, 0);
              leds2[i] = CRGB(0, 0, 0);
              leds3[i] = CRGB(0, 0, 0);
              leds4[i] = CRGB(0, 0, 0);
              leds5[i] = CRGB(0, 0, 0);
              leds6[i] = CRGB(0, 0, 0);
              leds7[i] = CRGB(0, 0, 0);
              leds8[i] = CRGB(0, 0, 0);
               FastLED.show();
      }


  // SERIAL AND INPUT SETUP
  Serial.begin(115200);
  pinMode(audio, INPUT);
  Serial.println("\nListening...");
 // THRESHOLD = goertzel.detect()  ;

goertzel.sample(A0);
  TARGET_FREQUENCY = 600;
    goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
      mag1 = goertzel.detect();
      delay(5);
  TARGET_FREQUENCY = 1500;
    goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
      mag2 = goertzel.detect();
      delay(5);
  TARGET_FREQUENCY = 2500;
    goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
      mag3 = goertzel.detect();
      delay(5);
  TARGET_FREQUENCY = 3500;
    goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
      mag4 = goertzel.detect();
      delay(5);
  TARGET_FREQUENCY = 4600;
    goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
      mag5 = goertzel.detect();
      delay(5);
  TARGET_FREQUENCY = 5700;
    goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
      mag6 = goertzel.detect();
      delay(5);
  TARGET_FREQUENCY = 6800;
    goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
      mag7 = goertzel.detect();
      delay(5);
      react1 = 8;    
react2 = 8; 
react3 = 8; 
react4 = 8; 
react5 = 8; 
react6 = 8;
react7 = 8; 
  delay(10);
react1 = 0;   
react2 = 0; 
react3 = 0;
react4 = 0; 
react5 = 0; 
react6 = 0; 
react7 = 0;


}

// FUNCTION TO GENERATE COLOR BASED ON VIRTUAL WHEEL
// https://github.com/NeverPlayLegit/Rainbow-Fader-FastLED/blob/master/rainbow.ino
CRGB Scroll(int pos) {
  CRGB color (0,0,0);
  if(pos < 85) {
    color.g = 0;
    color.r = ((float)pos / 85.0f) * 255.0f;
    color.b = 255 - color.r;
  } else if(pos < 170) {
    color.g = ((float)(pos - 85) / 85.0f) * 255.0f;
    color.r = 255 - color.g;
    color.b = 0;
  } else if(pos < 256) {
    color.b = ((float)(pos - 170) / 85.0f) * 255.0f;
    color.g = 255 - color.b;
    color.r = 1;
  }
  return color;
}

// FUNCTION TO GET AND SET COLOR
// THE ORIGINAL FUNCTION WENT BACKWARDS
// THE MODIFIED FUNCTION SENDS WAVES OUT FROM FIRST LED
// https://github.com/NeverPlayLegit/Rainbow-Fader-FastLED/blob/master/rainbow.ino
void rainbow()
{




   for(int i = NUM_LEDS - 1; i >= 0; i--) {
    if (i < react1)

  {
      leds1[i] = Scroll((i * 256 / 50 + k) % 256);
  }
    else
    {
      leds1[i] = CRGB(0, 0, 0);     
    } 
    if (i < react2)

  {
      leds2[i] = Scroll((i * 256 / 50 + k) % 256);
  }
    else
    {
      leds2[i] = CRGB(0, 0, 0);     
    }
    if (i < react3)

  {
      leds3[i] = Scroll((i * 256 / 50 + k) % 256);
  }
    else
    {
      leds3[i] = CRGB(0, 0, 0);     
    }
    if (i < react4)

  {
      leds4[i] = Scroll((i * 256 / 50 + k) % 256);
  }
    else
    {
      leds4[i] = CRGB(0, 0, 0);     
    }
    if (i < react5)

  {
      leds5[i] = Scroll((i * 256 / 50 + k) % 256);
  }
    else
    {
      leds5[i] = CRGB(0, 0, 0);     
    }
    if (i < react6)

  {
      leds6[i] = Scroll((i * 256 / 50 + k) % 256);
  }
    else
    {
      leds6[i] = CRGB(0, 0, 0);     
    }
    if (i < react7)

  {
      leds7[i] = Scroll((i * 256 / 50 + k) % 256);
  }
    else
    {
      leds7[i] = CRGB(0, 0, 0);     
    }
  }
  FastLED.show(); 
}







void loop()
{


   goertzel.sample(A0); //Will take n samples

  //int mag = goertzel.detect() ;  //check them for target_freq




//Take samples of all target frequencies then send it to the LEDs

   for (int i = 0; i <= 6; i++)
   {
    if(i==0)
    {   
        TARGET_FREQUENCY = 600;
        goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
        pre_mag1 = goertzel.detect();

        if(pre_mag1 > mag1) 
            {
        dif1 = pre_mag1 - mag1;

        pre_react1 =  dif1;
            }
    }
    if(i==1)
    {   
        TARGET_FREQUENCY = 1500;
        goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
        pre_mag2 = goertzel.detect();

        if(pre_mag2 > mag2) 
            {
        dif1 = pre_mag2 - mag2;

        pre_react2 =  dif2;
            }
    }
    if(i==2)
    {   
        TARGET_FREQUENCY = 2500;
        goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
        pre_mag3 = goertzel.detect();

        if(pre_mag3 > mag3) 
            {
        dif3 = pre_mag3 - mag3;

        pre_react3 =  dif3;
            }
    }
    if(i==3)
    {   
        TARGET_FREQUENCY = 3500;
        goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
        pre_mag4 = goertzel.detect();

        if(pre_mag4 > mag4) 
            {
        dif4 = pre_mag4 - mag4;

        pre_react4 =  dif4;
            }
    }
    if(i==4)
    {   
        TARGET_FREQUENCY = 4600;
        goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
        pre_mag5 = goertzel.detect();

        if(pre_mag5 > mag5) 
            {
        dif5 = pre_mag5 - mag5;

        pre_react5 =  dif5;
            }
    }
    if(i==5)
    {   
        TARGET_FREQUENCY = 5700;
        goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
        pre_mag6 = goertzel.detect();

        if(pre_mag6 > mag6) 
            {
        dif6 = pre_mag6 - mag6;

        pre_react6 =  dif6;
            }
    }
    if(i==6)
    {   
        TARGET_FREQUENCY = 6800;
        goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
        pre_mag7 = goertzel.detect();

        if(pre_mag7 > mag7) 
            {
        dif7 = pre_mag7 - mag7;

        pre_react7 =  dif7;
            }
    }
}


// Serial.println(dif);

    if (pre_react1 > react1) // ONLY ADJUST LEVEL OF LED IF LEVEL HIGHER THAN CURRENT LEVEL
     react1 = pre_react1;

    if (pre_react2 > react2) // ONLY ADJUST LEVEL OF LED IF LEVEL HIGHER THAN CURRENT LEVEL
     react2 = pre_react2;

    if (pre_react3 > react3) // ONLY ADJUST LEVEL OF LED IF LEVEL HIGHER THAN CURRENT LEVEL
     react3 = pre_react3;

    if (pre_react4 > react4) // ONLY ADJUST LEVEL OF LED IF LEVEL HIGHER THAN CURRENT LEVEL
     react4 = pre_react4;

    if (pre_react5 > react5) // ONLY ADJUST LEVEL OF LED IF LEVEL HIGHER THAN CURRENT LEVEL
     react5 = pre_react5;

    if (pre_react6 > react6) // ONLY ADJUST LEVEL OF LED IF LEVEL HIGHER THAN CURRENT LEVEL
     react6 = pre_react6;

    if (pre_react7 > react7) // ONLY ADJUST LEVEL OF LED IF LEVEL HIGHER THAN CURRENT LEVEL
     react7 = pre_react7;





    //if (pre_react > react) // ONLY ADJUST LEVEL OF LED IF LEVEL HIGHER THAN CURRENT LEVEL
    // react = pre_react;


 // }

  rainbow(); // APPLY COLOR

  k = k - wheel_speed; // SPEED OF COLOR WHEEL
  if (k < 0) // RESET COLOR WHEEL
    k = 255;

  // Decay leds over time

    decay_check++;
  if (decay_check > decay)
  {
    decay_check = 0;
    if (react1 > 0)
      react1--;
       if (react2 > 0)
      react2--;
       if (react3 > 0)
      react3--;
       if (react4 > 0)
      react4--;
       if (react5 > 0)
      {
      react5--;
      }
       if (react6 > 0)
      react6--;
       if (react7 > 0)
       {
      react7--;
       }
  }



  //delay(1);
}