Étape 6: Le dernier croquis.
- Matrice & touch test de tri-LED (piranha)
- (C) Copyright 2009 qs
- Modules (sélectionnés par progMode)
- 0 - séquence
- 1 - lumière blanche. DIMS lors d’un « hold ».
- 2 - morphing de couleurs. Random s’allume lentement le mélange.
- 3 - firelight. Flammes vacillantes (difficiles à faire quand il n’y a aucun véritable jaune!)
- 4 - lucioles. Émuler le rituel courtiser des espèces.
*
- 20mA intégré couleur LED - COMMON anode!!
- D02 - rouge (bas pour mettre en marche!)
- D03 - vert
- D04 - bleu
- D05 - LED plus à droite (en haut pour allumer)
- D06 - Centre LED
- D07 - LED gauche
*/
int matrice [5] = {}
0660,0626,0466,0,0}
; Affichage de l’arc-en-ciel
int matrix02 [5] [2] = {/ / Morphing de routine et firelight
{
511,7}
,{
511,56}
,{
511 504}
,{
511,0}
,{
511 504}
};
unsigned int Luciole [4] = {}
0xdd42, 0xff00, 0x8a00, 0x2200} ;
/ * Lucioles :
- MSB - (7:5) intensité (0-7)
- Retard (4:2) en unités de 1 / 2sec
- (1:0) type de bogue (1 = femelle, 2, 3 = mâle)
*/
Pour ajuster les séquences de pas à pas
bigDelay long = 300, Yas ;
int fsuitors = 0, i, j, val, LED, c0, c1, r0, g0, b0, r1, g1, b1, blanc = 7 ;
int progMode = 0 ; Le commutateur... affaire sélecteur (99 est TEST)
int controlPin = 12, sw02 = 0 ; État de commutation sur A02
unsigned long dttimer02 = 0, timer02 = 0, ffTimer = 0 ; minuteries de chien de garde
seuil d’int = 100 ; millisecondes pour un « touch », triple pour « hold »
void setup() {}
pour (int i = 2; i < = 7; i ++) {}
pinMode(i,OUTPUT) ;
digitalWrite (j’ai, j’ai < 5) ;
}
randomSeed(analogRead(0)) ;
pinMode(12,OUTPUT) ; Notre commande de commutateur maître touch
digitalWrite(12,LOW) ;
analogReference(INTERNAL) ; Sensibilité de Boost (touch) ! Aref est offlimits !
pour (i = 1; i < 4; i ++) {/ / Set up de routine des lucioles
j = random(2,4) ; Type de mâle
j += ((j + i-3) << 2) ; Endurance (manque de) 0-7
Luciole [i] = (j << 8) | (j << 1) |
((i+3) << 13) ; Énergie (luminosité)
}
}
void loop() {}
bigD = bigDelay+millis() ; Calc timeout
Switch (progMode) {}
case 0 :
{}
pour (LED = 0 ; LED < = 2 ; LED++)
writeLED(LED,matrix[LED]) ;
}
tandis que (bigD > = millis()) ;
Si ((sw02&7) == 0) {/ / Hold est cale !
matrice [0] = matrice [0] ++ & 511 ; drôle mathématiques
J’ai = (matrice [1] + 8) ; Augmentation de vert
Si (j’ai > 511) j’ai = (i & 7) + 1 ;
matrice [1] = i ;
J’ai = (64 + matrice [2]) ; Augmentation bleu
Si (j’ai > 511) j’ai = (j’ai & 63) + 1 ;
matrice [2] = i ;
}
rupture ;
cas 1 :
{
R1 = (blanc << 6) | (blanc << 3) ces ;
tandis que (bigD > =millis())
pour (LED = 0 ; LED < = 2 ; LED++)
writeLED(LED,r1) ;
Si ((sw02&7)! = 0) {}
blanc--;
Si (blanc < = 0) blanc = 7 ;
}
rupture ;
}
cas 2 :
{
pour (LED = 0 ; LED < = 2 ; LED++) {}
Si ((sw02&7) == 0) {/ / Hold est cale !
C0 = matrix02 [LED] [0] ;
C1 = matrix02 [LED] [1] ;
Si (c0! = c1) {}
R0 = c0 & 7 ;
G0 = (c0 >> 3) & 7 ;
B0 = (c0 >> 6) & 7 ;
R1 = c1 & 7 ;
G1 = (c1 >> 3) & 7 ;
B1 = (c1 >> 6) & 7 ;
R1 = constrain(r1-r0,-1,1) ;
G1 = constrain(g1-g0,-1,1) ;
B1 = constrain(b1-b0,-1,1) ;
Matrix02 [LED] [1] = (b1 << 6) | (g1 << 3) | R1 ;
}
d’autre
Matrix02 [LED] [0] = random(0,512) ; Nouveaux voyants de la cible
}
}
tandis que (bigD > =millis())
pour (LED = 0 ; LED < = 2 ; LED++)
writeLED(LED,matrix02[LED][1]) ;
rupture ;
}
case 3: / / Log feu
{
pour (LED = 0 ; LED < = 2 ; LED++) {}
Si ((sw02&7) == 0) {/ / Hold est cale !
C0 = matrix02 [LED] [0] ;
C1 = matrix02 [LED] [1] ;
Si (c0! = c1) {}
R0 = c0 & 7 ;
G0 = (c0 >> 3) & 7 ;
B0 = (c0 >> 6) & 7 ;
R1 = c1 & 7 ;
G1 = (c1 >> 3) & 7 ;
B1 = (c1 >> 6) & 7 ;
R1 = constrain(r1-r0,-1,1) ;
G1 = constrain(g1-g0,-1,1) ;
B1 = constrain(b1-b0,-1,1) ;
Matrix02 [LED] [1] = (b1 << 6) | (g1 << 3) | R1 ;
}
else {}
Si (LED == 1) {}
R1=Random(4,8) ;
G1 = r1-2 ;
B1 = 0 ;
}
else {}
R1 = random(2,7) ;
G1 = r1-2 ;
B1 = 0 ;
}
Matrix02 [LED] [0] = (b1 << 6) | (g1 << 3) | R1 ; Nouvelle cible de lumières rouges * verts
}
}
}
bigD = millis () + 130 ;
{}
pour (LED = 0 ; LED < = 2 ; LED++)
writeLED(LED,matrix02[LED][1]) ;
}
tandis que (bigD > =millis()) ;
rupture ;
}
case 4: / / lucioles
{
Si (ffTimer < millis()) {/ / doit attendre que le temps écoulé
pour (i = 0; i < 4; i ++) {}
ff0 int = Luciole [i] ;
ff1 int = ff0 >> 8 ;
FF0 = ff0 & 127 ;
int ff = ff0 & 7 ;
Si (ff > 0) {/ / Flash sur
j = (ff1 >> 2) & 070 ; Précharge vert
Si ((ff1&3)! = 1) {//A mâle
writeLED(i-1,j) ;
writeLED(i-1,j) ;
Luciole [i]--;
fsuitors ++ ;
}
else / / A femelle !
Si (fsuitors == 0) {}
j += 3 ;
writeLED(0,j) ;
writeLED(1,j) ;
writeLED(2,j) ;
writeLED(0,j) ;
writeLED(1,j) ;
writeLED(2,j) ; Les femelles montrent une impulsion plus longue, plus jaune
Luciole [i]--;
J’ai = 99 ; Sortie précoce
}
}
else {/ / pas de flash
Si (j’ai == 1) fsuitors = 0 ;
j = (ff0 >> 3) & 15 ;
Si (j == 0) //Wait expiré
Luciole [i] = (Luciole [i] & 0xff00) | 0 x 40 | ((FF1&31) << 1) ;
d’autre
Luciole [i]-= 8 ;
}
}
ffTimer = millis () + 450 ;
}
rupture ;
}
99-affaire: / / mode Test...
{
J’ai = ((sw02>1) & 1) << 2 | cocher pour robinet
((SW02>2) & 1) << 6 ;
writeLED(2,i) ; tapez = rouge + tenir = bleu
rupture ;
}
par défaut :
progMode = 0 ;
rupture ;
}
/*
- Cocher pour touche
*/
Si (readTouch(2)) {/ / nous voyons quelque chose sur la broche 2 !
Si ((sw02&1) == 0) {/ / première fois ' tour
digitalWrite(13,HIGH) ; donc nous montrer qch.
SW02 = 1 ; Drapeau au toucher
timer02 = millis() ; Premier contact horloge
}
else {/ / 1-bit set déjà : nous avons déjà connu ça.
unsigned long t = millis ()-timer02 ; mais depuis combien de temps ?
Si ((sw02&2) == 2) {/ / Regardez 'hold' seulement si « presse » est définie
Si (t > 750) {}
SW02 = sw02 | 4 ;
Si (t > 8000) progMode = 99 ;
}
}
ElseIf (t > = 200) sw02 = sw02 | 2 ; La valeur de « Presse », plus de différenciation
}
}
ElseIf (sw02 & & 1) {/ / Process clé hors
Si ((millis()-timer02)>100) / / autoriser certains ' give'before qualifiant se ferme
{
digitalWrite(13,LOW) ; Montrez-le
Si ((sw02&6) == 2) {//Process a 'tap'
unsigned long t = millis ()-dttimer02 ; //
dttimer02 = millis() ; Permet de garder « taper »
Si (t < 600) {/ / 2 pressions dans le temps limitent (600 ms)
SW02 = 0 x 10 ; Ouvrir le robinet double'
progMode ++ ; Le prochain programme
}
}
else {}
SW02 = sw02 & 0xff00 ;
timer02 = 0 ;
}
}
}
}
# define lowThreshold 180 / / Low est 180mV
# define highThreshold 450 / / 450mV [600] - résistance de la peau est 8Meg
Boolean readTouch (int NIP) {}
int i=analogRead(pin) ;
i=analogRead(pin) ; Ignorer la 1ère lecture
Si (j’ai < lowThreshold) i=analogRead(pin) ; Réjection du bruit
Si (j’ai < lowThreshold) {}
digitalWrite(controlPin,HIGH) ;
Si (progMode == 99) writeLED(0,02) ; Test : rouge octal
i=analogRead(pin) ;
digitalWrite(controlPin,LOW) ;
Si (j’ai > highThreshold) {}
Si (progMode == 99) writeLED(0,020) ; Test : jaune octal
retour (analogRead(pin) < lowThreshold) ;
retourne la valeur true ;
}
sinon renvoyer faux ;
} / / Essai passé - touche enfoncée
sinon renvoyer faux ;
}
#define waitFactor 6 / / facteur de luminosité
void writeLED (int LED, int valeur) {/ / LED == 0(D7), 1(D6), 2(D5)
valeur est 3bits pour r [lsb], g, b
digitalWrite(7-LED,HIGH) ; Apporter l’anode haute
int r = valeur & 7 ;
int g = (valeur >> 3) & 7 ;
int b = (valeur >> 6) & 7 ;
Si (r > 0) {}
digitalWrite(2,LOW) ;
delayMicroseconds (waitFactor << r) ;
}
digitalWrite(2,HIGH) ;
delayMicroseconds (waitFactor < <(7-r)) ;
Si (g > 0) {}
digitalWrite(3,LOW) ;
delayMicroseconds (waitFactor << g) ;
}
digitalWrite(3,HIGH) ;
delayMicroseconds (waitFactor < <(7-g)) ;
Si (b > 0) {}
digitalWrite(4,LOW) ;
delayMicroseconds (waitFactor << b) ;
}
digitalWrite(4,HIGH) ;
delayMicroseconds (waitFactor < <(7-b)) ;
digitalWrite(7-LED,LOW) ;
}