Hiya wvmarle.
Hope you're having a great summer
Thanks a lot for your help.
Basically you need two steps.
- read the channel information from the spectrum shield - if I understand it all correctly this gives you 6 or 7 values of 0-1023 (the ADC range), each representing the volume of the at the various frequency bands. This is the part you have done successfully already, right?
As I wrote in the post above, noting can be read from the EQ7 sketches from Sparkfun..
And from the sketch I have been modifying, only digital output. Or, at least I think so
Here's that sketch:
#include <FastLED.h>
// Arduino Music Visualizer 0.3
// 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
// This code uses the Sparkfun Spectrum Shield
// LED LIGHTING SETUP
//#define LED_PIN 6
#define NUM_LEDS_PER_STRIP 48 // 250
#define BRIGHTNESS 40
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS_PER_STRIP];
#define UPDATES_PER_SECOND 100
// AUDIO INPUT SETUP
int strobe = 4;
int reset = 5;
int audio1 = A0;
int audio2 = A1;
int left[7];
int right[7];
int band;
int audio_input = 0;
int freq = 0;
// STANDARD VISUALIZER VARIABLES
int midway = NUM_LEDS_PER_STRIP / 2; // CENTER MARK FROM DOUBLE LEVEL VISUALIZER
int loop_max = 0;
int k = 339; // COLOR WHEEL POSITION
int decay = 0; // HOW MANY MS BEFORE ONE LIGHT DECAY
int decay_check = 0;
long pre_react = 0; // NEW SPIKE CONVERSION
long react = 0; // NUMBER OF LEDs BEING LIT
long post_react = 0; // OLD SPIKE CONVERSION
// RAINBOW WAVE SETTINGS
int wheel_speed = 0;
void setup()
{
// SPECTRUM SETUP
pinMode(audio1, INPUT);
pinMode(audio2, INPUT);
pinMode(strobe, OUTPUT);
pinMode(reset, OUTPUT);
digitalWrite(reset, LOW);
digitalWrite(strobe, HIGH);
// LED LIGHTING SETUP
delay( 3000 ); // power-up safety delay
FastLED.addLeds<LED_TYPE, 12, COLOR_ORDER>(leds, NUM_LEDS_PER_STRIP).setCorrection( TypicalLEDStrip );
FastLED.addLeds<LED_TYPE, 7, COLOR_ORDER>(leds, NUM_LEDS_PER_STRIP).setCorrection( TypicalLEDStrip );
FastLED.setBrightness( BRIGHTNESS );
// CLEAR LEDS
for (int i = 0; i < NUM_LEDS_PER_STRIP; i++)
leds[i] = CRGB(0, 0, 0);
FastLED.show();
// SERIAL AND INPUT SETUP
Serial.begin(115200);
Serial.println("\nListening...");
}
// FUNCTION TO GENERATE COLOR BASED ON VIRTUAL WHEEL
// https://github.com/NeverPlayLegit/Rainbow-Fader-FastLED/blob/master/rainbow.ino
CRGB Scroll(int pos) {
pos = abs(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;
}
/*
Serial.print(pos);
Serial.print(" -> ");
Serial.print("r: ");
Serial.print(color.r);
Serial.print(" g: ");
Serial.print(color.g);
Serial.print(" b: ");
Serial.println(color.b);
*/
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 singleRainbow()
{
for(int i = NUM_LEDS_PER_STRIP - 1; i >= 0; i--)
{
if (i < react)
leds[i] = Scroll((i * 256 / 50 + k) % 256);
else
leds[i] = CRGB(0, 0, 0);
}
FastLED.show();
}
void readMSGEQ7()
// Function to read 7 band equalizers
{
digitalWrite(reset, HIGH);
digitalWrite(reset, LOW);
for(band=0; band <7; band++)
{
digitalWrite(strobe, LOW); // strobe pin on the shield - kicks the IC up to the next band
delayMicroseconds(30); //
left[band] = analogRead(audio1); // store left band reading
right[band] = analogRead(audio2); // ... and the right
digitalWrite(strobe, HIGH);
}
}
void convertSingle()
{
if (left[freq] > right[freq])
audio_input = left[freq];
else
audio_input = right[freq];
if (audio_input > 80)
{
pre_react = ((long)NUM_LEDS_PER_STRIP * (long)audio_input) / 1023L; // TRANSLATE AUDIO LEVEL TO NUMBER OF LEDs
if (pre_react > react) // ONLY ADJUST LEVEL OF LED IF LEVEL HIGHER THAN CURRENT LEVEL
react = pre_react;
Serial.print(audio_input);
Serial.print(" -> ");
Serial.println(pre_react);
}
}
void convertDouble()
{
if (left[freq] > right[freq])
audio_input = left[freq];
else
audio_input = right[freq];
if (audio_input > 80)
{
pre_react = ((long)midway * (long)audio_input) / 1023L; // TRANSLATE AUDIO LEVEL TO NUMBER OF LEDs
if (pre_react > react) // ONLY ADJUST LEVEL OF LED IF LEVEL HIGHER THAN CURRENT LEVEL
react = pre_react;
Serial.print(audio_input);
Serial.print(" -> ");
Serial.println(pre_react);
}
}
// FUNCTION TO VISUALIZE WITH A SINGLE LEVEL
void singleLevel()
{
readMSGEQ7();
convertSingle();
singleRainbow(); // APPLY COLOR
k = k - wheel_speed; // SPEED OF COLOR WHEEL
if (k < 0) // RESET COLOR WHEEL
k = 255;
// REMOVE LEDs
decay_check++;
if (decay_check > decay)
{
decay_check = 0;
if (react > 0)
react--;
}
}
// FUNCTION TO VISUALIZE WITH MIRRORED LEVELS
void doubleLevel()
{
readMSGEQ7();
convertDouble();
// doubleRainbow();
k = k - wheel_speed; // SPEED OF COLOR WHEEL
if (k < 0) // RESET COLOR WHEEL
k = 255;
// REMOVE LEDs
decay_check++;
if (decay_check > decay)
{
decay_check = 0;
if (react > 0)
react--;
}
}
void loop()
{
singleLevel();
// doubleLevel();
//delay(1);
}
It's taken from this
thread, but I have also seen the complete sketch somewhere else on the net. From a youtuber, I think. But then complete with a LCD screen and more.
How ever.. This is the sketch I chose to start learning from..