Ljud aktiverat LED spektrumanalysator (7 / 8 steg)
Steg 7: kod
Anslut Arduino till din PC. Ta din audio splitter och koppla den till din PC. Använd en ljudkabel för att ansluta till VU sköld och den andra att ansluta till en högtalare. Anslut nätadaptern till ett vägguttag.
När du har allt, kör testprogrammet från steg 0 att dubbelkolla allt lyser upp.
Hämta projekt koden från Github och lägger till i biblioteket Arduino. Öppna Arduino IDE och ladda upp.
#include "fix_fft.h"
#include "HSBColor.h"
#include "LPD8806.h"
#include "SPI.h"
Välj 2 stift för Arduino utgång
#define DATA_PIN 2
#define CLOCK_PIN 3
Definierar antalet och anordningen av lysdioder i bildeffekter. För en vertikal installation, kommer att detta avgöra utrymme att ljus förhållande som de wrap
#define NUM_BARS 12
#define BAR_LENGTH 12
Skillnaden i nyans för varje bar efter först.
#define BAR_HUE_DIFF 8
Skapa en förekomst av LPD8806 för att styra remsan
LPD8806 strip = LPD8806 (NUM_BARS * BAR_LENGTH, DATA_PIN, CLOCK_PIN);
Den nuvarande nyansen av den första remsan av bar
int curHue = 0;
FFT datalagring
char im [NUM_BARS * 2], data [NUM_BARS * 2];
int prev [NUM_BARS];
HSB/RGB databuffert
int rColor [3].
Konverterar en 2d visualizer punkt till dess läge på strip
int getStripLocation (int col, int rad)
{
Styr remsan i omväxlande riktningar. Detta möjliggör kedja räck end-to-end
om (col % 2 == 0)
rad = BAR_LENGTH - ror - 1.
returnera col * BAR_LENGTH + rad;
}
void setup()
{
analogReference(DEFAULT);
Strip.BEGIN();
Strip.show();
}
void loop()
{
uint16_t i, j, k;
uint32_t färg;
Läs analog ingång
för (jag = 0; jag < NUM_BARS * 2; i ++)
{
int val = (analogRead(3) + analogRead(2)) / 2;
data [i] = val * 2;
im [i] = 0;
Delay(1);
}
Ställa in bakgrundsfärgen på lysdioderna när de inte får musik data
för (jag = 0; jag < NUM_BARS * BAR_LENGTH; i ++)
strip.setPixelColor (i, 20, 20, 40);
Ange korrekt pixlar i varje stapel
för (jag = 0; jag < NUM_BARS; i ++)
{
Varje LED bar har 2 FFT frekvenser som summeras ihop
int fft_start = jag * 2;
int fft_count = 2;
Få en positiv datapunkt från FFTEN
int curData = 0;
för (k = 0; k < fft_count; k ++)
curData + = sqrt (data [fft_start + k] * data [fft_start + k] + im [fft_start + k] * im [fft_start + k]);
Konto för ShiftyVU filtrering
om (jag == 0 || jag == 7)
curData = 2;
Smidigt släppa från topparna genom att endast tillåta datapunkter vara en ledde lägre än den föregående iterationen.
Detta förhindrar beslag-inducerande blixtar som kan orsakas av den ShiftyVU filtrering (?)
om (prev [i] > BAR_LENGTH & & curData < prev [i] - BAR_LENGTH)
curData = prev [i] - BAR_LENGTH;
Basfärg för varje bar
H2R_HSBtoRGB ((curHue + i * 8) % 360, 99, 99, rColor);
färg = remsa. Färg (rColor [0] / 2, rColor [1] / 2, rColor [2] / 2);
Om bara första LED lyser, men inte helt. Detta är utanför den for-loop eftersom subtraktion av
BAR_LENGTH orsakar värdet att linda runt till ett mycket högt.
om (curData < BAR_LENGTH)
{
int ljusstyrka = curData * 99 / BAR_LENGTH;
H2R_HSBtoRGB ((curHue + i * BAR_HUE_DIFF) % 360, 99, ljusstyrka, rColor);
Färgen på basen av varje stapel. Ändra detta så att den matchar bakgrundsfärgen på lysdioderna
strip.setPixelColor (i, 20, 20, 40);
}
annat
{
för (j = 0; j < BAR_LENGTH; j ++)
{
Lyser upp varje fullt upplysta ledde på samma sätt.
om (curData - BAR_LENGTH > j * BAR_LENGTH)
strip.setPixelColor (getStripLocation (i, j), färg);
annars om (curData > j * BAR_LENGTH)
{
Tonas ned den sista LED i baren baserat på hur nära datapunkten är till nästa LED.
int ljusstyrka = (j * BAR_LENGTH - curData) * 99 / BAR_LENGTH;
H2R_HSBtoRGB ((curHue + i * BAR_HUE_DIFF) % 360, 99, ljusstyrka, rColor);
strip.setPixelColor (getStripLocation (i, j), band. Color(rColor[0] / 2, rColor[1] / 2, rColor[2] / 2));
}
}
}
Lagra alla datapunkterna för filtrering av nästa iteration.
Prev [i] = curData;
}
Gå igenom alla färger.
om (curHue == 359)
curHue = 0;
annat
curHue ++;
Visa remsan.
Strip.show();
}