USB kameleont lampa (färg replikera) (10 / 13 steg)
Steg 10: programmering
Hela programmet är ganska stort och det tog mig flera dagar att skapa biblioteket och få det att fungera.
/ * Här koden är skriven av < en href = " rel = "nofollow" >
< /a >
Projektet finns på samma sida
*/
#include < TriSense.h >
TS_RGB ts(11,10,9);
int S_Tap, dTap_stat, sTap_stat, val, första, andra, last_doubletap, last_tap;
räkna om int = 0, tap, doubletap;
långa tomgång, returnst, tid.
int dly = 100, prevkno = 0, smällar, last_knock, knock_stat, tillstånd, läge, MaxModes = 4, calib_st;
void setup()
{
Serial.BEGIN(9600); ENDAST FÖR FELSÖKNING
TS. SetHue(255,0,0); RÖTT INDIKERAR ATT SENSORN INTE ÄR KALIBRERAD
TS. CalibSeq("Debug"); VITBALANS KALIBRERING AV SENSORN I DEBUG-LÄGE
för (int jag = 0; jag < 5; i ++)
{
TS. SetHue(0,255,0); GRÖNA PULSER ANGER KALIBRERING ÄR FRAMGÅNGSRIKA
Delay(100);
TS. SetHue(0,0,0);
Delay(50);
}
}
void loop()
{
BEHANDLINGEN KNOCK SENSOR / / /
knock_stat=knock(100); VARIABEL som butiker nummer av KNACKAR: knock (tröskelvärde)
TRÖSKELVÄRDET KAN VARIERA BEROENDE PÅ DIN SENSOR
om (knock_stat! = last_knock & & statliga == 0) / / få statliga förändring IN KNOCK
{
Idle=Millis(); ÅTERSTÄLL RÄKNAREN OCH UNDVIKA DRÖJSMÅL
State = 1;
last_knock = knock_stat;
dTap_stat = 0;
sTap_stat = 0;
}
IF(State==1)
{
om (millis ()-inaktiv < 1000 & & knock_stat! = last_knock & & dTap_stat == 0) / / läsa dubbla kranar inom 1 SEK.
{
State = 0;
IF(doubletap<MaxModes)
doubletap ++;
IF(doubletap==MaxModes)
doubletap = 0;
dTap_stat = 1;
}
om (millis ()-inaktiv > 1000 & & sTap_stat == 0 & & dTap_stat! = 1)
{
State = 0;
Tap ++;
sTap_stat = 1;
}
}
DOUBLE TAP att ändra läge / / /
IF(doubletap==0)
{
Sleep(); VILOLÄGE, LÅNGSAM BLUE PWM
}
IF(doubletap==1) / / RGB-färg cykling
{
IF(Tap!=last_tap)
{
last_tap = tryck;
DLY = dly-10; KNACKA PÅ TILL FART UPP ANIMERINGEN
DLY=constrain(DLY,0,100);
}
TS. CycleRGB(dly,1,1);
}
IF(doubletap==2) / / INITIERA färg läsning och REPLICATING sekvens
{
TS. GetColor(50);
TS. WriteColor("ColorCancelling"); Färgen cancelling läget avbryter färgen med minst %
}
Serial.Print(DLY);
Serial.Print("");
Serial.println(doubletap);
}
int PwM (int dly, int start, int finish) / / PWM utan fördröjning
{
IF(restate==0)
{
Val = start;
Idle=Millis();
Upprepa = 1;
}
om (start < avsluta & & val < finish)
{
om (millis ()-inaktiv > dly)
{
Val ++;
Idle=Millis();
}
analogWrite(9,val);
}
om (start > Avsluta & & val > Avsluta)
{
om (millis ()-inaktiv > dly)
{
Val--;
Idle=Millis();
}
analogWrite(9,val);
}
IF(val==finish)
tillbaka 1.
annat
Return 0;
}
int knock (int thr) / / slå funktion
{
int kno = map(analogRead(2),0,thr,0,1);
kno = constrain(kno,0,1);
om (prevkno! = kno & & millis ()-tid > 50)
{
smällar ++;
prevkno = kno;
tid = millis();
}
returnera smällar/2.
}
void sleep() / / sova funktion
{
IF(returnst==0)
först = PwM(1,10,150);
IF(First == 1)
returnst = 1;
IF(returnst==1)
Second=PwM(4,150,10);
IF(Second == 1)
returnst = 0;
}
Det faktum att jag inte har använt delay() funktion i detta program gör det så långa. Om vi använder delay() funktionen, slutar programmet för att viss period innebär detta att alla ingångar, utgångar och andra beräkningar skulle sluta fungera. Detta skulle skapa ett stort problem när du använder knock input.
Jag fick CycleRGB utan dröjsmål programmet från: http://mcviruss.nl/arduino/rgb_rainbow_v2.pde