Digital LED blomma (7 / 9 steg)
Steg 7: Fler sekvenser
Vi har en serie som börjar på stift 3 och lyser upp varje LED genom stift 10, sedan börjar på pin 3 igen. Antar att du ville lysdioderna att lysa i sekvens och returnera motsatt riktning? Vi kan lägga denna bordtennis effekt genom att lägga en annan slinga efter den första öglan och gör här en räkna ner.
för (jag = 7; jag > = 0; i--) {
digitalWrite (posPins [i], hög);
delay_(t_delay);
digitalWrite (posPins [i], låg);
Delay(t_delay);
}
Nu har vi två sekvenser, så vår andra ordnar ping-pongs genom räknar sedan räknar ner. Hur vi väljer var och en när knappen trycks, är att välja dem från en lista med sekvenser med uttrycket "switch".
Switch-sats används en variabel, som vi, den jämför värdet för den variabeln till en uppsättning värden, som flera villkor uttalanden, om villkoret är uppfyllt det utför de uttalanden som är omfattas av case-sats. Det sker i följande form:
Switch(Variable) {
fall 1:
koduttryck
bryta;
fall 2:
koduttryck
bryta;
standard:
koduttryck
bryta;
}
Switch-sats är gått en variabel, sedan värdet för den variabeln kontrolleras mot värdena för varje case-sats, kommer den sedan att köra kod uttalanden inom ramen för den fall utvärderingen och dess avslutande avbrott;.
När vi har ett sätt att köra olika sekvenser, behöver vi några sätt att ta emot indata från användaren att ändra staterna; Det är där knappen kommer in.
Vi har fäst en knapp till stift 11. Knappen är i ett normalt öppen stift 11 är knuten till marken genom en strömbegränsande motstånd på 10K ohm. När knappen trycks, det binder stift 11, till V ++ som är den + 5V som tillhandahålls av den Mini power regulator. Vägen kommer att vara från V ++ till stift 11 och inte genom resistorn till marken när knappen trycks eftersom vägen mellan + 5V och jord kommer att vara minsta motståndets väg.
När knappen trycks och vi läser att det finns en hög på stift 11, vi lägger till en till variabeln sekvens. Efter att vi ökar värdet för variabeln sekvens, kontrollerar vi för att se till att dess värde inte är större än antalet sekvenser (fall uttalanden) vi har. Om det är större, återställa vi det om du vill referera det första case-uttrycket, börja sekvenserna om.
Obs: Jag använder inte den standard case-sats så det finns uttalanden inom dess räckvidd, så det gör inget annat än slutet med en break-sats.
Nu för att sätta ihop allt, har följande kod två sekvenser, först är den linjära sekvensen som vi började med och andra är bordtennis sekvensen.
/ * Blomma LED
* Skriven av Mark S. Drummond, (Gravity Boy) 2009
* Du är fri att använda, distribuera, modifiera, denna kod.
* Någon kredit skulle uppskattas
*
int num = 255;
int temp = 0;
int binNum [8].
int maxLED = 8;
int maxSequence = 6;
int seqButton = 11;
int sekvens = 1;
int buttonVal = låg;
int negPin = 2;
int posPins [] = {3,4,5,6,7,8,9,10}.
int i, t;
int t_delay = 100;
int p_offset = 0;
int n_offset = 0;
int tSTEP = 50;
/ * setup() initiering funktion, ordet "void" före funktionsnamnet betyder att funktionen inte returnera ett värde. */
void setup() {
Serial.BEGIN(9600);
pinMode (negPin, produktionen);
digitalWrite (negPin, låg);
för (jag = 0; jag < maxLED; i ++) {
pinMode (posPins [i], produktionen);
digitalWrite (posPins [i], låg);
}
}
/ * Detta är den viktigaste loopen efter alla variabler deklareras och setup() körs, denna funktion kommer att slinga om och om igen. */
void loop() {
buttonVal = digitalRead(seqButton);
IF(buttonVal == High) {/ / läsa pin värde och kontrollera om hög
sekvensen ++; ökningsvärdet sekvens
Delay(t_delay * 10); STOP-knappen från inspelningen
flera pressar
om (sekvens > maxSequence) {sekvens = 1;}
}
Växla (sekvens) {
fall 1: //straight sekvens
för (jag = 0; jag < maxLED; i ++) {
digitalWrite (posPins [i], hög);
Delay(t_delay);
digitalWrite (posPins [i], låg);
Delay(t_delay);
}
bryta;
fall 2: //Ping pong
riktning framåt
för (jag = 0; jag < maxLED; i ++) {
digitalWrite (posPins [i], hög);
Delay(t_delay);
digitalWrite (posPins [i], låg);
Delay(t_delay);
}
omvänd riktning
för (jag = (maxLED - 1); Jag > = 0; i--) {/ / vi räknar till noll, totalt - 1
digitalWrite (posPins [i], hög);
Delay(t_delay);
digitalWrite (posPins [i], låg);
Delay(t_delay);
}
bryta;
fall 3: / / alla andra växla
t_delay = 60.
för (jag = 0; jag < = maxLED; i ++) {
digitalWrite (posPins [i], t);
Delay(t_delay);
digitalWrite (posPins [i], låg);
Delay(t_delay);
Toggle t
om (t == 0) {
t = 1;
}
annat {
t = 0;
}
}
t_delay = 30.
bryta;
fall 4: / / denna sekvens tänds lysdioderna från centrum ut
p_offset = 4;
n_offset = 3;
för (jag = 0; jag < (maxLED/2); i ++) {//start på center och räkningen till ändarna
digitalWrite (posPins [p_offset], hög);
digitalWrite (posPins [n_offset], hög);
Delay(t_delay);
digitalWrite (posPins [p_offset], låg);
digitalWrite (posPins [n_offset], låg);
Delay(t_delay);
++ p_offset; lätta dem i en riktning
--n_offset; medan belysning dem i den andra riktningen
}
bryta;
fall 5: / / random blinkande lysdioder
för (jag = 0; jag < maxLED; i ++) {
srand(rand()); Ställa in utsäde med hjälp av funktionen slump
int randomNumber = (rand()%maxLED); slumptal mellan 0 och maxLEDs
digitalWrite (posPins [randomNumber], hög);
Delay(t_delay/4); fart upp förseningen så att det skimrar
digitalWrite (posPins [randomNumber], låg);
Delay(t_delay/4);
}
bryta;
mål 6: / / start snabbt och avsluta långsamt, kan använda den här med olika mönster.
för (jag = 0; jag < maxLED; i ++) {
digitalWrite (posPins [i], hög);
Delay((t_delay/2) + (jag * tSTEP));
digitalWrite (posPins [i], låg);
Delay(t_delay);
}
bryta;
fall 7: //Binary, inkluderar i binär 8 lysdioder
Använd detta när du har rätt motstånd för varje LED
för (jag = 0; jag < 255; i ++) {
int counter = 0;
heltal index = maxLED - 1;
NUM = i.
Temp = num;
medan (num > 0) {
++ motverka;
om (num % 2 == 0) {binNum [index] = 0;}
annat {binNum [index] = 1;}
NUM = num / 2;
--index;
} / / efter medan loop bryter, resten av binNum [] är fylld med 0s (MSB -> LSB)
/ * Förlåta infogade format för den för loopar, när du vet dem, de är ett lätt läsa * /
för (t = 0; t < (maxLED - counter); t ++) {binNum [t] = 0;}
för (t = 0; t < maxLED -1; t ++) {digitalWrite (posPins [t], binNum[t]);}
Delay(t_delay/2);
för (t = 0; t < maxLED - 1; t ++) {digitalWrite (posPins [t], låg);}
}
Delay(t_delay * 10);
bryta;
standard:
bryta;
} / / end switch-sats
} / / end huvudsakliga loop() funktion
Kopiera koden och när programmet startar, tryck på knappen Ändra den linjära sekvensen till bordtennis sekvensen. Vi kan fortsätta att lägga till nya sekvenser genom att lägga till fler fall uttalanden innan den standard case-sats. Switch-sats kan användas för att testa ett värde från en int, röding eller Boolean. Du kan även kapsla programsatsen switch om du ville lägga till några inställda hastigheten variationer i en sekvens.
Det finns en annan tillsats kodblock i början av den huvudsakliga loop() funktionen och innan programsatsen Switch; Detta används för att läsa värdet på knappen och öka våra sekvens variabel, det testar också variabeln för att vara säker på att det inom spänna innan programsatsen Switch; om variabeln är högre än antalet fall uttalanden, återställa till 1, som är den första case-satsen.
buttonVal = digitalRead(seqButton); Läs knappläge
IF(buttonVal == High) {/ / läsa pin värde och kontrollera om hög
sekvensen ++; ökningsvärdet sekvens
Delay(t_delay * 10); STOP-knappen från inspelningen
flera pressar
om (sekvens > maxSequence || sekvens < 0) {sekvens = 1;}
}
Förseningen var satt att driva tiden till 1000 ms eller 1 sekund att redovisa den! hastighet av människan trycka på knappen. Observera att jag till andra villkorssatsen sekvens < 0 i exemplet ovan och inte i koden. De två barerna || är ett booleskt värde eller, så antingen uttalande att vara sant skulle uppfylla villkoret och fastställa sekvens = 1. Om den första sekvens > 2 är sant, kommer då sekvens < 0 inte ens att utvärderas.
Ett knep för att lägga till fler sekvenser är att ställa sekvens rätt efter den knapp checken i början av den huvudsakliga loop(), ange värdet för sekvens för att referera till fallet du arbetar på. Om du arbetar på en ny sekvens för fall 3: och du vill köra testet, men vill inte trycka på knappen varje gång för att se sekvensen du arbetar på, sedan använda brute force som visas nedan.
buttonVal = digitalRead(seqButton);
IF(buttonVal == High) {
sekvensen ++;
Delay(t_delay * 10);
om (sekvens > maxSequence) {sekvens = 1;}
}
sekvens = 3; åsidosätta koden ovan och tvinga den sekvens som vi arbetar med
Detta anger uttryckligen värdet av sekvens 3 efter knappen läst. Jag kommer att omfatta extra sekvenser för blomman i PDF-filen i slutet av detta Instructable. Jag var leka med de analoga värdena av analoga stiften att några av lysdioderna är bundna till, med spridning och en långsam tona in och ut, var en fin effekt. Ramp upp och ner kan åstadkommas med en för loop och öka och minska värden mellan + 0V och + 5V.