Étape 1: L’esquisse (LMP_Musicator01)
- Vumètre / Light orgue (présentation complète db)
- Présentation horizontale - Centre écran linéaire
- (c) Copyright 2009 QS
- Tous droits réservés
*
- Matrice de LED rangée: 1-5 ; Col: 1-6
- Carte PORTB == D8:D12 - pin [ligne + 7]: + v
- PORTD == D2:D7 - pin [8-col] ; GND
- Notre sortie : col::D2:D7 - ve (basse), tandis que row::D8:D13 + ve
*/
Char [msg] = {}
0 x 11, 0x0a, 0x0e, 0x0e, 0x0a, 0 x 11, / / starburst
0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0x0e,
0 X 11, 0 X 19, 0X1E, 0 X 00, 0X1F, 0 X 10, / / Q U
0X1F, 0 X 00, 0X1E, 0 X 05, 0X1E, 0 X 00, / / A
0X1F, 0 X 06, 0X0C, 0X1F, 0 X 00, 0 X 03, / / N T
0X1F, 0 X 03, 0 X 00, 0 X 12, 0 X 15, 0 X 09, / / S
0 X 00, 0X1F, 0 X 10, 0X1F, 0 X 00, 0X1F, / / F U
0 X 05, 0 X 05, 0 X 00, 0X1F, 0 X 05, 0 X 05, / / F
0,0,0,0,0,0} ; Ainsi un dépassement de tampon
modèle binaire, 1 octet par colonne. Haut = lsb
affichage de char [6], hdisp [6] ;
int w10kbuf [2], w1kbuf [20], w100buf [100] ; Assumer tous à zéro (: P)
int w10kidx, w1kidx, w100idx ;
int w10kmax, w5kmax, w1kmax, w500max, w100max ;
long w, w10ksum = 0, w1ksum = 0, w100sum = 0 ;
int www, w10k, w1k, w100, mètre [5] ;
échelle d’int = 3 ; Connectez-vous à échelle (commencer à 23)
recal int = 0 ; Taux d’AGC
int inPin = 1 ; analogRead sur A01
void setup() / / exécuter une seule fois, au démarrage de l’esquisse
{
pour (int ledPin = 2; ledPin < = 12 ; ledPin ++) {}
pinMode (ledPin, sortie) ; définit la broche numérique en sortie
digitalWrite (ledPin, (ledPin < = 7)) ; Désactiver tous les cols
}
lmpWrite(msg,0,15) ; Délai du cycle est de 1/10 secondes
(c’est vraiment pour initialiser les compteurs)
analogReference(INTERNAL) ; N’utilisez pas de valeur par défaut ou externe !
int i = digitalRead(inPin) ; supprimer les anciennes données
}
void loop() / / run maintes et maintes fois
{
W100 = (w100sum / 23) >> à l’échelle ; Un filtre bon marché @ app 100Hz
W1K = abs ((w1ksum / 3)-w100) >> à l’échelle ; 1kHz
w10k = (www + w10ksum) >> à l’échelle ; 10kHz
w = (w100, w1k + w10k) ; Puissance totale (fonction VU)
Si (w < 13) {}
ReCAL ++ ;
Si (f > = 15) {//350mS compte avant de ré-étalonnage du compteur
f = 0 ;
= l’échelle (échelle > 3) ;
}} / / augmentation seulement si res inférieure à échelle 1/2
Si ((w100>33) || (w1k > 30) || (w10k>33)) {/ / log2
Si ((w100 w1k + w10k) > 83) {/ / visière : rendre moins sensible
f = 0 ;
échelle ++ ;
W100 = w100 >> 1 ;
W1K = w1k >> 1 ;
w10k = w10k >> 1 ;
}
compteur [0] = min (w100 >> 1,31) ;
compteur [1] = min(abs(w100+w1k-w10k) >> 2,31) ;
compteur [2] = min (w1k >> 2,31) ;
compteur [3] = min(abs(w1k+w10k-w100) >> 2,31) ;
compteur [4] = min((w10k*5) >> 3,31) ;
pour (col int = 0; col < 6; col ++) {}
int c = 0 ;
pour (mm int = 0; mm < = 4; mm ++) {}
c = c << 1 ;
c += (compteur [mm] > col) ;
}
hdisp [col] = c ;
}
afficher [0] = hdisp [4] ;
afficher [1] = hdisp [2] ;
afficher [2] = hdisp [0] ;
afficher [3] = hdisp [0] ;
afficher [4] = hdisp [2] ;
afficher [5] = hdisp [4] ;
lmpWrite(display,0,1) ;
afficher [0] = hdisp [5] ;
afficher [1] = hdisp [3] ;
afficher [2] = hdisp [1] ;
afficher [3] = hdisp [1] ;
afficher [4] = hdisp [3] ;
afficher [5] = hdisp [5] ;
/ * Affichage vertical routine
*
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 (affichage, 5, w10k >> 1) ;
fillVBar (affichage, 5, échelle + 1) ;
int i = 0 ;
s int = échelle-1 ;
pour (ii int = 0; ii < 5; ii ++) {}
J’ai j’ai = | (s-1) ;
i = i << 1 ;
s = s >> 1 ;
}
afficher [5] = i ;
*
*/
lmpWrite(display,0,1) ;
}
void fillVBar (char [] disp, o int, int val) {}
int j = B100000 ; modèle à chiffres
Val = constrain(val,2,127) ;
tandis que (val > 2) {}
j| = (j >> 1) ;
Val = val >> 1 ;
}
DISP [o] = j ;
}
void lmpWrite (char disp [], int stchar, int étapes)
/ * Utilisation : modèle binaire charges dans [disp], en commençant à stchar,
- 1 octet par colonne, de gauche à droite, de haut-bas
- Carte PORTB == D8:D12 - pin [ligne + 7]: + v
- PORTD == D2:D7 - pin [8-col] ; GND
*/
{
int col, rangs, cval, allumé = 0, ww = 0 ;
long delayStart=millis() + 90*(constrain(steps,1,100)) ;
Affichage / boucle de temps
www = 0 ;
{}
pour (col = 0; col < 6; col ++) {}
cval = disp [col + stchar] ;
pour (ligne = 1; rangée < = 5; ligne ++) {//only 5 bits de poids faible
Si (cval & 1) {/ / à la lumière de cette LED
Si (allumé == 0)
digitalWrite(7-col,LOW) ; col a besoin d’activation
digitalWrite(row+7,HIGH) ;
allumée ++ ; dans le cas où nous avons besoin de savoir combien de LED est allumées
}
Cycle de voler ici, pour lire VU entrée
WW=Max(WW,analogRead(inPin)) ; Données de volume brut (rectifiées)
www=Max(WW,www) ; PIC retect
delayMicroseconds(80) ; Cela assure que le panneau est
allumé à la même période de temps.
digitalWrite(row+7,LOW) ; Éteindre la LED
cval = cval >> 1 ; Vérifiez le bit suivant
}
digitalWrite(7-col,HIGH) ; désactiver le col
w10ksum += www-w10kbuf [w10kidx] ; Il s’agit de notre « condensateur »
w10kbuf [w10kidx] = www ;
w10kidx ++ ;
w10kidx = ((w10kidx<1)) ; 0 ou 1
Si (w10kidx > 3) w10kidx = 0 ;
w10ksum = ww ; Augmenter la réponse haut de gamme
w1ksum += ww-w1kbuf [w1kidx] ;
w1kbuf [w1kidx] = ww ;
w1kidx ++ ;
Si (w1kidx > 19) w1kidx = 0 ;
w1kidx = ((w1kidx<19) & & (w1kidx ++)) ; 0 - 19
w100sum += ww-w100buf [w100idx] ;
w100buf [w100idx] = ww ;
w100idx ++ ;
Si (w100idx > 99) w100idx = 0 ;
w100idx = ((w100idx<1) & & (w100idx ++)) ; 0 - 199
allumé = 0 ;
}
}
tandis que (delayStart > millis()) ;
}