Arduino multi-mode lampa med soft touch switch (6 / 6 steg)
Steg 6: Senaste skissen.
- Tri-LED (piranha) matrix & touch test
- (C) Copyright 2009 qs
- Moduler (vald av progMode)
- 0 - sekvens
- 1 - vitt ljus. DIMS samtidigt på "paus".
- 2 - morphing färger. Random lights sakta blandning.
- 3 - Eldskenet. Fladdrande lågor (svårt att göra när det finns ingen riktig gula!)
- 4 - eldflugor. Tävla med uppvaktning ritual av arten.
*
- 20mA integrerad färg LED - gemensam anod!
- D02 - röd (låg aktivera!)
- D03 - grön
- D04 - blå
- D05 - längst till höger LED (hög aktivera)
- D06 - center LED
- D07 - längst till vänster LED
*/
int matrix [5] = {
0660,0626,0466,0,0}
; Rainbow display
int matrix02 [5] [2] = {/ / Morphing rutin & firelight
{
511,7}
,{
511,56}
,{
511,504}
,{
511,0}
,{
511,504}
};
unsigned int firefly [4] = {
0xdd42, 0xff00, 0x8a00, 0x2200};
/ * Eldflugor:
- MSB - (7:5) intensitet (0-7)
- (4:2) försening i 1/2 sek enheter
- (1:0) typ av bugg (1 = kvinna, 2,3 = hanar)
*/
För att justera stegmotor sekvenser
lång bigDelay = 300, bigD;
int fsuitors = 0, i, j, val, LED, c0, c1, r0, g0, b0, r1, g1, b1, vita = 7.
int progMode = 0; Växeln... fall selector (99 är TEST)
int controlPin = 12, sw02 = 0; Switch status på A02
osignerade långa dttimer02 = 0, timer02 = 0, ffTimer = 0; watchdog timer
int tröskel = 100; millisekunder för en "touch", trippel för "paus"
void setup() {
för (int jag = 2; jag < = 7; i ++) {
pinMode(i,OUTPUT);
digitalWrite (jag, jag < 5);
}
randomSeed(analogRead(0));
pinMode(12,OUTPUT); Vår master touch manöverkontakt
digitalWrite(12,LOW);
analogReference(INTERNAL); Boost (touch) känslighet! Aref är offlimits!
för (jag = 1; jag < 4; i ++) {/ / ställa upp eldflugor rutin
j = random(2,4); Typ av manliga
j + = ((j + i-3) << 2); Uthållighet (brist) 0-7
Firefly [i] = (j << 8) | (j << 1) |
((i+3) << 13); Energi (ljusstyrka)
}
}
void loop() {
bigD = bigDelay+millis(); Calc timeout
växel (progMode) {
fall 0:
göra {
för (LED = 0; LED < = 2; LED++)
writeLED(LED,matrix[LED]);
}
medan (bigD > = millis());
om ((sw02&7) == 0) {/ / håll är håll!
Matrix [0] = matrix [0] ++ & 511; rolig matematik
Jag = (matrix [1] + 8); Öka grön
om (jag > 511) jag = (jag & 7) + 1;
Matrix [1] = i.
Jag = (matrix [2] + 64); Öka blå
om (jag > 511) jag = (jag & 63) + 1;
Matrix [2] = i.
}
bryta;
fall 1:
{
R1 = (vit << 6) | (vita << 3) |white;
medan (bigD > =millis())
för (LED = 0; LED < = 2; LED++)
writeLED(LED,r1);
om ((sw02&7)! = 0) {
vit--;
om (vit < = 0) vit = 7.
}
bryta;
}
fall 2:
{
för (LED = 0; LED < = 2; LED++) {
om ((sw02&7) == 0) {/ / håll är håll!
C0 = matrix02 [LED] [0];
C1 = matrix02 [LED] [1].
om (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;
}
annat
matrix02 [LED] [0] = random(0,512); Nya mål lampor
}
}
medan (bigD > =millis())
för (LED = 0; LED < = 2; LED++)
writeLED(LED,matrix02[LED][1]);
bryta;
}
fall 3: / / Log brand
{
för (LED = 0; LED < = 2; LED++) {
om ((sw02&7) == 0) {/ / håll är håll!
C0 = matrix02 [LED] [0];
C1 = matrix02 [LED] [1].
om (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;
}
annat {
om (LED == 1) {
R1=random(4,8);
G1 = r1-2;
B1 = 0;
}
annat {
R1 = random(2,7);
G1 = r1-2;
B1 = 0;
}
matrix02 [LED] [0] = (b1 << 6) | (g1 << 3) | R1; Nytt mål lyser röda * gröna
}
}
}
bigD = millis () + 130;
göra {
för (LED = 0; LED < = 2; LED++)
writeLED(LED,matrix02[LED][1]);
}
medan (bigD > =millis());
bryta;
}
fall 4: / / eldflugor
{
om (ffTimer < millis()) {/ / måste vänta för förfluten tid
för (jag = 0; jag < 4; i ++) {
int ff0 = firefly [i];
int ff1 = ff0 >> 8;
ff0 = ff0 & 127;
int ff = ff0 & 7.
om (ff > 0) {/ / Flash på
j = (ff1 >> 2) & 070; Pre-load grön
om ((ff1&3)! = 1) {//A manliga
writeLED(i-1,j);
writeLED(i-1,j);
Firefly [i]--;
fsuitors ++;
}
annat / / en kvinna!
om (fsuitors == 0) {
j + = 3.
writeLED(0,j);
writeLED(1,j);
writeLED(2,j);
writeLED(0,j);
writeLED(1,j);
writeLED(2,j); Honorna Visa en längre, gulare puls
Firefly [i]--;
Jag = 99. Tidigt utträde
}
}
annat {/ / inte flash
om (jag == 1) fsuitors = 0;
j = (ff0 >> 3) & 15;
om (j == 0) //Wait gått ut
Firefly [i] = (firefly [i] & 0xff00) | 0x40 | ((FF1&31) << 1);
annat
Firefly [i]-= 8.
}
}
ffTimer = millis () + 450;
}
bryta;
}
mål 99: / / Test läge...
{
Jag = ((sw02>1) & 1) << 2 | Kontrollera om tap
((sw02>2) & 1) << 6;
writeLED(2,i); Knacka på = röd + håll = blå
bryta;
}
standard:
progMode = 0;
bryta;
}
/*
- Check för nedtryckt
*/
om (readTouch(2)) {/ / vi se något på pin 2!
om ((sw02&1) == 0) {/ / första gången "runda
digitalWrite(13,HIGH); så vi Visa ngt.
sw02 = 1; Flagga vid beröring
timer02 = millis(); Klockan första touch
}
annat {/ / 1-bitars redan set: vi har varit här förut.
osignerade långa t = millis ()-timer02; men hur länge sedan?
om ((sw02&2) == 2) {/ / titta på "hold" endast om "tryck" är inställt
om (t > 750) {
sw02 = sw02 | 4.
om (t > 8000) progMode = 99.
}
}
annars om (t > = 200) sw02 = sw02 | 2. Ange 'Press', mer differentiering
}
}
annars om (sw02 & & 1) {/ / bearbeta key off
om ((millis()-timer02)>100) / / tillåta att vissa "give'before kalla det avslutas
{
digitalWrite(13,LOW); Visa det
om ((sw02&6) == 2) {//Process "Knacka"
osignerade långa t = millis ()-dttimer02; //
dttimer02 = millis(); Tillåter oss att hålla "Knacka"
om (t < 600) {/ / 2 kranar inom tid gräns (600ms)
sw02 = 0x10; Slå på double tap "
progMode ++; Nästa Program
}
}
annat {
sw02 = sw02 & 0xff00;
timer02 = 0;
}
}
}
}
# definiera lowThreshold 180 / / låg är 180mV
# definiera highThreshold 450 / / 450mV [600] - hud motstånd är 8Meg
booleska readTouch (int pin) {
int i=analogRead(pin);
i=analogRead(PIN); Ignorera 1: a behandlingen
om (jag < lowThreshold) i=analogRead(pin); Brusavvisning
om (jag < lowThreshold) {
digitalWrite(controlPin,HIGH);
om (progMode == 99) writeLED(0,02); Test: oktalt röd
i=analogRead(PIN);
digitalWrite(controlPin,LOW);
om (jag > highThreshold) {
om (progMode == 99) writeLED(0,020); Test: oktalt gul
Return (analogRead(pin) < lowThreshold);
return true;
}
annars returnera falskt;
} / / Test passerade - knappen trycks
annars returnera falskt;
}
#define waitFactor 6 / / ljusstyrka faktor
void writeLED (int LED, int värde) {/ / LED == 0(D7), 1(D6), 2(D5)
värdet är 3bits för r [lsb], g, b
digitalWrite(7-LED,HIGH); Ta med anoden hög
int r = värde & 7.
int g = (värde >> 3) & 7;
int b = (värde >> 6) & 7;
om (r > 0) {
digitalWrite(2,LOW);
delayMicroseconds (waitFactor << r);
}
digitalWrite(2,HIGH);
delayMicroseconds (waitFactor < <(7-r));
om (g > 0) {
digitalWrite(3,LOW);
delayMicroseconds (waitFactor << g);
}
digitalWrite(3,HIGH);
delayMicroseconds (waitFactor < <(7-g));
om (b > 0) {
digitalWrite(4,LOW);
delayMicroseconds (waitFactor << b);
}
digitalWrite(4,HIGH);
delayMicroseconds (waitFactor < <(7-b));
digitalWrite(7-LED,LOW);
}