C++ 如何使用Goertzel库和C+中的FastLED制作Arduino LED音频可视化工具+;
我目前正在从事一个项目,该项目涉及由Arduino和7个LED条带创建的音频可视化工具。我使用的是WS2812B带,分为7个带,每个带8个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毫米耳机插孔的模拟
#包括
#包括
//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);
}