Disco LED Party Cup! (3 / 5 steg)
Steg 3: Programmera Arduino
Vi behöver att programmera Arduino så man vet vad man ska göra med våra mic och lysdioder. Jag har ändrat Adafruit koden något för våra 5v Arduino. Bara Anslut din Arduino Nano till datorn och ladda upp här koden!
Kom ihåg att slå på den så att dess fungerar bra!
/*
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
#define N_PIXELS 12 / / antal pixlar i strand
#define MIC_PIN A0 / / 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 10 / / buller/hum/störning i mic signal
#define prover 60 / / längd buffert för dynamisk nivåjustering
#define topp (N_PIXELS + 2) / / tillåt dot att gå något skalan
#define PEAK_FALL 40 / / 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 = 10, / / 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 = 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 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);
}
}