Neo Pixel Arduino Vu-Meter (6 / 6 steg)
Steg 6: Koden.
Denna kod lämnade Adafruit för deras LED förstärkare eller-slips. Jag har ändrat några saker i det att passa mitt projekt./*
LED VU mätare för Arduino och Adafruit NeoPixel lysdioder.
Hårdvarukrav:
-De flesta Arduino eller Arduino-kompatibel styrelser (ATmega 328P eller bättre).
-Adafruit Elektret Mikrofonförstärkare (ID: 1063)
-Adafruit Flora RGB Smart pixlar (ID: 1260)
ELLER
-Adafruit NeoPixel Digital LED strip (ID: 1138)
-Tillval: batteri för portabelt bruk (annan ström via USB eller adapter)
Programvarukrav:
-Adafruit NeoPixel bibliotek
Anslutningar:
-3.3V till mic förstärkare +
-GND till mic amp-
-Analog pin till mikrofon-utgång (konfigurerbart nedan)
-Digital pin till LED data ingång (konfigurerbart nedan)
Se anmärkningar i setup() när det gäller 5V vs 3.3V styrelser - det kan finnas en
extra anslutning att göra och en rad med kod för att aktivera eller inaktivera.
Skrivet av Adafruit industrier. Distribueras under BSD-licensen.
Denna punkt måste inkluderas i en omfördelning.
*/
#include < Adafruit_NeoPixel.h >
#define N_PIXELS 30 / / antal pixlar i strand
#define MIC_PIN A5 / / mikrofon är ansluten till denna analoga pin
#define LED_PIN 6 / / NeoPixel LED strand är ansluten till detta stift
#define DC_OFFSET 0 / / DC-offset i mic signal - om unusure, lämna 0
#define buller 20 / / buller/hum/störning i mic signal
#define prover 40 / / längd buffert för dynamisk nivåjustering
#define topp (N_PIXELS + 2) / / tillåt dot att gå något skalan
#define PEAK_FALL 60 / / hastighet av peak faller dot
byte
toppen = 0, / / används för fallande dot
dotCount = 0, / / ram-mätare för att försena dot-falla hastighet
volCount = 0; Bildräkneverket för att lagra förbi volymdata
int
[exempel], Vol / / tidigare volym provtagning
lvl = 20, / / ström "dämpade" ljudnivå.
minLvlAvg = 0, / / för dynamisk justering av grafen låg & hög
maxLvlAvg = 512;
Adafruit_NeoPixel
Strip = Adafruit_NeoPixel (N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Detta behövs bara på 5V Arduinos (Uno, Leonardo, etc.).
Ansluta 3.3V till mic och till AREF på ARDUINO och möjliggöra den här
linje. Ljudsamplingar är "renare" på 3,3 v.
KOMMENTERA BORT RADEN FÖR 3.3V ARDUINOS (FLORA, ETC.):
analogReference(EXTERNAL);
MEMSET (vol, 0, sizeof(vol));
Strip.BEGIN();
}
void loop() {
uint8_t i.
uint16_t minLvl, maxLvl;
int n, höjd;
n = analogRead(MIC_PIN); RAW från mic
n = abs n - 512 - DC_OFFSET. Center på noll
n = (n < = buller)? 0: n - buller. Ta bort brus/hum
lvl = ((lvl * 7) + n) >> 3. "Dämpade" läsning (annars ser ut ryckiga)
Beräkna stapelhöjd baserat på dynamisk min/max nivåer (fast punkt):
höjd = upp * (lvl - minLvlAvg) / (lång) (maxLvlAvg - minLvlAvg);
om (höjd < 0L) höjd = 0; Klipp ut
annat if(height > TOP) höjd = topp;
IF(height > Peak) topp = höjd; Hålla "peak" prick på toppen
Färgpixlar baserat på rainbow lutning
för (jag = 0; jag < N_PIXELS; i ++) {
om (jag > = höjd) strip.setPixelColor (i, 0, 0, 0);
annat strip.setPixelColor(i,Wheel(map(i,0,strip.numPixels()-1,30,150)));
}
Rita peak prick
om (topp > 0 & & topp < = N_PIXELS-1) strip.setPixelColor(peak,Wheel(map(peak,0,strip.numPixels()-1,30,150)));
Strip.show(); Uppdatering strip
Varje par ramar, göra topp pixel förbi 1:
om (++ dotCount > = PEAK_FALL) {//fall ränta
om (peak > 0) peak--;
dotCount = 0;
}
Vol [volCount] = n; Spara provet för dynamisk utjämning
om (++ volCount > = prover) volCount = 0; Advance/rollover prov counter
Få volym spektrum av tidigare ramar
minLvl = maxLvl = vol [0];
för (jag = 1; jag < prover; i ++) {
om (vol [i] < minLvl) minLvl = vol [i];
annars om (vol [i] > maxLvl) maxLvl = vol [i];
}
minLvl och maxLvl anger volymen spänner över tidigare ramar, används
för vertikalt skalning ut grafen (så det ser intressant
oavsett volymnivå). Om de är för nära varandra men
(t.ex. vid mycket låga volymnivåer) blir grafen super grova
och "nervös"... så håll vissa minsta avstånd mellan dem (detta
också kan grafen gå till noll när inget ljud spelas):
om ((maxLvl-minLvl) < topp) maxLvl = minLvl + topp;
minLvlAvg = (minLvlAvg * 63 + minLvl) >> 6. Dämpa min/max nivåer
maxLvlAvg = (maxLvlAvg * 63 + maxLvl) >> 6. (försköna rullande medelvärde)
}
Ange ett värde 0 till 255 att få ett färgvärde.
Färgerna är en övergång r - g - b - tillbaka till r.
uint32_t hjul (byte WheelPos) {
IF(WheelPos < 85) {
returnera strip. Färg (WheelPos * 3, 255 - WheelPos * 3, 0);
} annat if(WheelPos < 170) {
WheelPos-= 85.
returnera strip. Färg (255 - WheelPos * 3, 0, WheelPos * 3);
} annat {
WheelPos-= 170;
returnera strip. Färg (0, WheelPos * 3, 255 - WheelPos * 3);
}
}