Den LED-matris Panel, eller LMP, för Arduino mikrodator, fortsatte. (1 / 3 steg)
Steg 1: Skissen (LMP_Musicator01)
- VUmeter / ljus orgel (Full db presentation)
- Horisontella presentation - center-out linjära displayen
- (c) Copyright 2009 QS
- Alla rättigheter reserverade
*
- LEDDE matrisen rad: 1-5. Col: 1-6
- Mappa PORTB == D8:D12 - pin [rad + 7]: + v
- PORTD == D2:D7 - pin [8-col]; GND
- Vår produktion: col::D2:D7 - ve (låg) medan row::D8:D13 + ve
*/
char msg [] = {
0x11, 0x0a, 0x0e, 0x0e, 0x0a, 0x11, / / stjärnexplosion
0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
0X11, 0X19, 0X1E, 0X00, 0X1F, 0X10, / / Q U
0X1F, 0X00, 0X1E, 0X05, 0X1E, 0X00, / / A
0X1F, 0X06, 0X0C, 0X1F, 0X00, 0X03, / / N T
0X1F, 0X03, 0X00, 0X12, 0X15, 0X09, / / S
0X00, 0X1F, 0X10, 0X1F, 0X00, 0X1F, / / U F
0X05, 0X05, 0X00, 0X1F, 0X05, 0X05, / / F
0,0,0,0,0,0}. Plus en överskridande buffert
lite mönster, 1 byte per kolumn. Toppen = lsb
char display [6], hdisp [6].
int w10kbuf [2], w1kbuf [20], w100buf [100]; Antar att alla nollställs (: P)
int w10kidx, w1kidx, w100idx;
int w10kmax, w5kmax, w1kmax, w500max, w100max;
långa w, w10ksum = 0, w1ksum = 0, w100sum = 0;
int www, w10k, w1k, w100, meter [5];
int skala = 3; Logga skala (börja på 23)
int recal = 0; AGC kurs
int inPin = 1; analogRead på A01
void setup() / / kör en gång, när skissen startar
{
för (int ledPin = 2; ledPin < = 12; ledPin ++) {
pinMode (ledPin, produktionen); Anger den digitala pin som utdata
digitalWrite (ledPin, (ledPin < = 7)); Inaktivera alla kolumner
}
lmpWrite(msg,0,15); Cykeln är 1/10 SEK
(det är verkligen för att initiera räknarna)
analogReference(INTERNAL); Använd inte standard eller extern!
int jag = digitalRead(inPin); ta bort gamla data
}
void loop() / / kör om och om igen
{
W100 = (w100sum / 23) >> skala; En billig filter @ app 100Hz
W1K = abs ((w1ksum / 3)-w100) >> skala; 1kHz
w10k = (www + w10ksum) >> skala; 10kHz
w = (w100 + w1k + w10k); Total effekt (VU funktion)
om (w < 13) {
RECAL ++;
om (recal > = 15) {//350mS räknar innan omkalibrering av mätare
RECAL = 0;
skala-= (skala > 3);
{}} / / öka res endast om mindre än 1/2 skala
om ((w100>33) || (w1k > 30) || (w10k>33)) {/ / log2
om ((w100 + w1k + w10k) > 83) {/ / toppnotering: göra det mindre känsliga
RECAL = 0;
skala ++;
W100 = w100 >> 1;
W1K = w1k >> 1;
w10k = w10k >> 1;
}
mätaren [0] = min (w100 >> 1,31);
meter [1] = min(abs(w100+w1k-w10k) >> 2,31);
meter [2] = min (w1k >> 2,31);
meter [3] = min(abs(w1k+w10k-w100) >> 2,31);
mätaren [4] = min((w10k*5) >> 3,31);
för (int col = 0; col < 6, col ++) {
int c = 0;
för (int mm = 0; mm < = 4; mm ++) {
c = c << 1;
c + = (mätare [mm] > col);
}
hdisp [col] = c;
}
Visa [0] = hdisp [4].
Visa [1] = hdisp [2].
Visa [2] = hdisp [0];
Visa [3] = hdisp [0];
Visa [4] = hdisp [2].
Visa [5] = hdisp [4].
lmpWrite(display,0,1);
Visa [0] = hdisp [5].
Visa [1] = hdisp [3].
Visa [2] = hdisp [1].
Visa [3] = hdisp [1].
Visa [4] = hdisp [3].
Visa [5] = hdisp [5].
/ * Vertikal display rutin
*
fillVBar(display,0,w100);
fillVBar(display,1,abs(w100+w1k-w10k));
fillVBar(display,2,w1k);
fillVBar(display,3,abs(w1k+w10k-w100));
fillVBar(display,4,w10k);
fillVBar (Visa, 5, w10k >> 1);
fillVBar (display, 5, skala + 1);
int jag = 0;
int s = skala-1;
för (int ii = 0; ii < 5; ii ++) {
jag = jag | (s & 1);
jag = jag << 1;
s = s >> 1;
}
Visa [5] = i.
*
*/
lmpWrite(display,0,1);
}
void fillVBar (char disp [], int o, int val) {
int j = B100000; siffriga mönster
Val = constrain(val,2,127);
medan (val > 2) {
j| = (j >> 1);
Val = val >> 1;
}
Disp [o] = j;
}
void lmpWrite (char disp [], int stchar, int steg)
/ * Användning: laddar lite mönster i disp [], börjar vid stchar,
- 1 byte per kolumn, vänster till höger, uppifrån-och-ner
- Mappa PORTB == D8:D12 - pin [rad + 7]: + v
- PORTD == D2:D7 - pin [8-col]; GND
*/
{
int col, rader, cval, lit = 0, ww = 0;
lång delayStart=millis() + 90*(constrain(steps,1,100));
Display / slinga tid
www = 0;
göra {
för (col = 0; col < 6, col ++) {
cval = disp [col + stchar];
för (rad = 1; rad < = 5; rad ++) {//only 5 nedre bitarna
om (cval & 1) {/ / ljus denna LED
om (lit == 0)
digitalWrite(7-col,LOW); Col behöver aktivera
digitalWrite(row+7,HIGH);
upplysta ++; om vi behöver veta hur många LED lyser
}
Cykla stjäla här, för att läsa VU input
WW=Max(WW,analogRead(inPin)); Rå volymdata (rättas)
www=Max(WW,www); Peak retect
delayMicroseconds(80); Detta gör att panelen är
lit i samma tidsperiod.
digitalWrite(row+7,LOW); Inaktivera LED
cval = cval >> 1; Kolla nästa lite
}
digitalWrite(7-col,HIGH); Inaktivera col
w10ksum += www-w10kbuf [w10kidx]; Detta är vår "kondensatorn"
w10kbuf [w10kidx] = www;
w10kidx ++;
w10kidx = ((w10kidx<1)); 0 eller 1
om (w10kidx > 3) w10kidx = 0;
w10ksum = ww; Öka den high-end Svaren
w1ksum += ww-w1kbuf [w1kidx];
w1kbuf [w1kidx] = ww;
w1kidx ++;
om (w1kidx > 19) w1kidx = 0;
w1kidx = ((w1kidx<19) & & (w1kidx ++)); 0 - 19
w100sum += ww-w100buf [w100idx];
w100buf [w100idx] = ww;
w100idx ++;
om (w100idx > 99) w100idx = 0;
w100idx = ((w100idx<1) & & (w100idx ++)); 0 - 199
lit = 0;
}
}
medan (delayStart > millis());
}