Stap 12: Hardware Add-on 1 - toetsenbord
Probleem daarbij is dat we alleen 3 ingangen links op de Arduino hebben, zodat met behulp van een toetsenbord op de normale wijze niet werken. Dus na wat onderzoek vond hier en op internet, ik een oplossing met slechts één ingang te detecteren welke knop is ingedrukt.
Lees dit uitstekende instructable op welke manier voor speurder de pinnen op uw toetsenbord en howto draad het tot enige gebruiken één ingang. Zodra ik had het opbouwen van de weerstand-matrix, ik de output van het toetsenbord aangesloten op pin A2. Ik gebruikte een breadboard terwijl deze hardware testen. Ik ook gesoldeerd kop pinnen aan het toetsenbord zodat ik het project van en naar het breadboard gemakkelijker loskoppelen kunt. ook wanneer ik het opbouwen van het slotcircuit alles is modulair en gemakkelijk kan worden aangesloten.
Dus voegde ik de volgende drie verklaringen net onder de definities van de matrix
int keyboardPin = A2;
int keyboardValue = 0;
int keypressed = 0;
Vervolgens voegde ik de volgende functie zodat me om te lezen in die toets is ingedrukt op het toetsenbord. Opmerking mijn waarden zijn verschillend van de instructable boven als ik vroeger de weerstand van de verschillende waarden.
ongeldig readkeyboard() {}
keypressed = 0;
keyboardValue = analogRead(keyboardPin);
Als (keyboardValue < 25) {keypressed = -1;}
Als ((keyboardValue >25) & & (keyboardValue < 45)) {keypressed = 1;}
Als ((keyboardValue >45) & & (keyboardValue < 80)) {keypressed = 2;}
Als ((keyboardValue >80) & & (keyboardValue < 160)) {keypressed = 3;}
Als ((keyboardValue >162) & & (keyboardValue < 253)) {keypressed = 4;}
Als ((keyboardValue >253) & & (keyboardValue < 361)) {keypressed = 5;}
Als ((keyboardValue >361) & & (keyboardValue < 479)) {keypressed = 6;}
Als ((keyboardValue >479) & & (keyboardValue < 585)) {keypressed = 7;}
Als ((keyboardValue >585) & & (keyboardValue < 715)) {keypressed = 8;}
Als ((keyboardValue >715) & & (keyboardValue < 760)) {keypressed = 9;}
Als ((keyboardValue >839) & & (keyboardValue < 880)) {keypressed = 10;}
Als ((keyboardValue >760) & & (keyboardValue < 839)) {keypressed = 11;}
Als ((keyboardValue >880) & & (keyboardValue < 1000)) {keypressed = 12;}
delay(50);
}
Deze functie werkt door het detecteren van welke toets is ingedrukt op basis van de waarde op de toetsenbord invoer pin en vervolgens stellen de globale variabele keypressed naar een nummer dat overeenkomt met dit.
De functie van de lus wordt vervolgens gewijzigd om te lezen als dit
void loop {}
int randnumber = 0;
readkeyboard();
Als (keypressed > 0 & & keypressed < 12) {}
manualEffect = 1;
prevKeyPressed = keypressed;
voor (int x = 0; x < 2; x ++) {}
(*funcAnimate[keypressed]) ();
delay(1);
}
} else if (keypressed = 12) {}
manualEffect = 0;
Laat de lus opnieuw doorlopen en de laatste instructie else zal dan lopen van een willekeurige effect
Als de manualEffect zijn hersteld
} else if (manualEffect = 1) {}
voor (int x = 0; x < 2; x ++) {}
(*funcAnimate[prevKeyPressed]) ();
delay(1);
}
} else {}
randnumber = random(0,2);
voor (int x = 0; x < 2; x ++) {}
(*funcAnimate[randnumber]) ();
delay(1);
}
}
}
Dit werkt door het lezen van de waarde van het toetsenbord.
Dan een als instructie controleert om te zien als een toets tussen 0 en 11
Als dit waar is dan het manualeffect 1 ingesteld en dan loopt het gekozen effect.
Als de #-toets is ingedrukt dan het manualeffect wordt ingesteld op 0, dan wordt dus de volgende keer lus wordt uitgevoerd als geen toets zal worden ingedrukt en manualeffect is ingesteld op 0 wordt dus dan een willekeurige effect uitgevoerd
Dan is de als instructie controleert als manualeffect gelijk aan 1 is. Dit gebeurt als een sleutel is eerder gedrukt en gestart met een handmatige effect. Hierdoor is ons om te blijven spelen op het eerder gekozen handmatige effect. Dit handmatige effect blijft draaien totdat een andere toets wordt ingedrukt
De laatste instructie else wordt uitgevoerd als manualeffect is ingesteld op 0, wat gebeuren zal wanneer het apparaat is ingeschakeld of als u de willekeurige toets indrukt. Vervolgens op een willekeurige effect zal uitvoeren.
De definitieve aanpassing van de schets is het toevoegen van de volgende functie
ongeldig dummy() {}
Vervolgens aan de matrix van functies om te lezen, zoals dit
funcAnimate [0] = dummy;
funcAnimate [1] = MakeSadSmileFace;
funcAnimate [2] = MakewinkingFace;
Wijzig de randNumber = random(0,2); = & randnumber = random(1,3);
Deze wijzigingen betekenen dat wanneer het toetsenbord wordt ingedrukt de functie op matrixpositie 0 wordt nooit uitgevoerd als gevolg van de variabele toewijzingen. Dus we voeg gewoon een dummy functie er dat niet. Wij veranderde ook de randNumber een willekeurig getal tussen 1, om opnieuw te beginnen zodat matrixpositie 0 wordt nooit uitgevoerd wordt toegewezen.
De volledige schets is hieronder.