8x8 LED Matrix Animations (12 / 14 steg)
Steg 12: Hårdvara tillägg 1 - knappsats
Problemet med detta är att vi bara har 3 ingångar lämnade på Arduino så med en knappsats i dess normalt sätt brukar fungera. Så efter en del forskning hittade här och på internet, jag en lösning att endast använda en input för att upptäcka vilken knapp har tryckts.
Läs detta utmärkta instructable på hur man upptäcker stiften på din knappsats och howto tråd det upp till endast använda en ingång. När jag hade bygga matrisen resistor, ansluten jag knappsatsen utdata till pin A2. Jag använde en skärbräda samtidigt testa denna hårdvara. Jag lödde också huvudet pins till knappsatsen så jag kan koppla det till och från bakbord lättare. även när jag bygger den slutliga kretsen allt är modulära och kan anslutas lätt.
Därför La jag följande tre förklaringar precis under array definitionerna
int keyboardPin = A2;
int keyboardValue = 0;
int keypressed = 0;
Sedan la jag följande funktion för att tillåta mig att läsa där nyckeln har tryckt på knappsatsen. Observera mina värderingar skiljer sig från den instructable ovan som jag använt olika motstånd värden.
void readkeyboard() {
keyPressed = 0;
keyboardValue = analogRead(keyboardPin);
om (keyboardValue < 25) {keypressed = -1;}
om ((keyboardValue >25) & & (keyboardValue < 45)) {keypressed = 1;}
om ((keyboardValue >45) & & (keyboardValue < 80)) {keypressed = 2;}
om ((keyboardValue >80) & & (keyboardValue < 160)) {keypressed = 3;}
om ((keyboardValue >162) & & (keyboardValue < 253)) {keypressed = 4;}
om ((keyboardValue >253) & & (keyboardValue < 361)) {keypressed = 5;}
om ((keyboardValue >361) & & (keyboardValue < 479)) {keypressed = 6;}
om ((keyboardValue >479) & & (keyboardValue < 585)) {keypressed = 7.}
om ((keyboardValue >585) & & (keyboardValue < 715)) {keypressed = 8;}
om ((keyboardValue >715) & & (keyboardValue < 760)) {keypressed = 9;}
om ((keyboardValue >839) & & (keyboardValue < 880)) {keypressed = 10;}
om ((keyboardValue >760) & & (keyboardValue < 839)) {keypressed = 11.}
om ((keyboardValue >880) & & (keyboardValue < 1000)) {keypressed = 12;}
Delay(50);
}
Denna funktion fungerar genom att upptäcka vilken tangent har tryckts baserat på värdet på tangentbordet ingångsstift och sedan ställa den globala variabeln keypressed till ett antal som motsvarar detta.
Loop funktion sedan ändras för att läsa såhär
void loop() {
int randnumber = 0;
readkeyboard();
om (keypressed > 0 & & keypressed < 12) {
manualEffect = 1;
prevKeyPressed = keypressed;
för (int x = 0; x < 2; x ++) {
(*funcAnimate[keypressed]) ();
Delay(1);
}
} else om (keypressed = 12) {
manualEffect = 0;
Låt loop kör igen och den annan redovisningen löper en slumpmässig effekt
som manualEffect har återställts
} else om (manualEffect = 1) {
för (int x = 0; x < 2; x ++) {
(*funcAnimate[prevKeyPressed]) ();
Delay(1);
}
} annat {
randnumber = random(0,2);
för (int x = 0; x < 2; x ++) {
(*funcAnimate[randnumber]) ();
Delay(1);
}
}
}
Detta fungerar genom att läsa värdet tangentbord.
Då en om sats kontroller för att se om en tangent har tryckts mellan 0 och 11
Om detta är sant då anger manualeffect vara 1, och sedan körs den valda effekten.
Om #-knappen har tryckts då det kommer att ställa manualeffect till 0, så nästa gång loopen körs som ingen nyckel kommer att pressas och manualeffect är satt till 0 så då körs en slumpmässig effekt
Då den om uttalande kontrollerar om manualeffect är lika med 1. Detta händer om en nyckel har pressat tidigare och började köra en manuell effekt. Detta tillåter oss att fortsätta spela den tidigare valda manuella effekten. Denna manuella effekt kommer att fortsätta tills en annan tangent trycks
Den slutliga else-satsen körs om manualeffect är satt till 0, som kommer att hända när enheten slås på eller när slumpmässiga knappen trycks. En slumpmässig effekt kommer då att köras.
Den slutliga justeringen på skissen är att lägga till följande funktion
void dummy() {}
Sedan till utbudet av funktioner ändra att läsa så här
funcAnimate [0] = dummy;
funcAnimate [1] = MakeSadSmileFace;
funcAnimate [2] = MakewinkingFace;
Ändra sedan randNumber = random(0,2); att randnumber = random(1,3);
Dessa förändringar innebär att när du knappsatsen trycker funktionen array position 0 aldrig kör på grund av de varierande uppdrag. Så vi bara lägga till en dummy funktion där som inte gör något. Vi ändrade också den randNumber som har tilldelats ett slumptal starta från 1, igen så array position 0 är aldrig köra.
Hela skissen är nedan.