Arduino skattjakt (7 / 12 steg)
Steg 7: Tangentbordet...
För dem som aldrig har använt en matris typ knappsats är hur de fungerar.
I ett försök att minska antalet kablar som kommer ut från en knappfunktion, fastställs ledare i rader och kolumner. Denna typ av knappsatsen tar vissa Kung Fu att få dem att fungera men det minskar också antalet stift som du behöver använda.
I en standard fast knappfunktion har du en gemensam tråd och en tråd för varje knapp. I detta fall det skulle vara totalt 17 ledningar.
I en matris fast tangentbordet du har endast 8. Här är fångsten. Mikrokontrollanter har 4 stift som utgångar (rader) och 4 stift som insatsvaror (kolumnerna) kan du bara läsa 4 knappar på en gång.
"Vad???!!! Vad bra är att jag köpte en 12 knapp knappsats till mig!"
Bara en i raden är påslagen i taget. Om exempelvis den första raden är aktiverat sätter detta makt på ena sidan av varje knapp på den översta raden (1,2,3, A) om 1 trycks då vet du makt flödar från utgång till ingång 1 1. Om 2 trycks då vet du att makt flödar från resultat 1 till ingång 2. Om 3 trycks sedan makt flödar från 1 utgång till ingång 3, och om A trycks sedan flödar makt från 1 utgång till ingång 4.
Om du skulle vända utgång skulle 2 på som sätta makt på ena sidan av varje knapp på andra raden (4,5,6, B) om 4 trycks energiflöden från utgång till ingång 1 2. Om 5 trycks energiflöden från utgång 2 till ingång 2. Om 6 är pressade då makt flöden från utgång 2 till ingång 3 och slutligen om B trycks energiflöden från utgång 2 till ingång 4.
Hur läser jag hela tangentbordet du frågar. En annan bra fråga gräshoppa. Här är hur det fungerar. Micro controller tänker mycket snabbt, så vad som händer är detta. Ro en aktiveras som är ansluten till 1,2,3, A och alla fyra ingångarna är undersökt. Om ingen makt är som finns vid någon av ingångarna då den raden är avstängd och sedan ror 2 är påslagen som är knuten till 4,5,6, B. Sedan är alla fyra ingångar tittade på igen. Om ingen makt noteras på ingångarna så att raden är avstängd och rad tre är påslagen som är knuten till 7,8,9, är C och ingångarna igen tittade på. Om ingen makt noteras igen på ingångarna så att raden bort och den fjärde raden är påslagen som är ansluten till *, 0, #, D. och igen ingångarna är tittade på för makt. Om ingen makt noteras sedan rad 4 är avstängd och processer startar över igen med ro en.
* Viktig del - om du slår på mer än en rad och en knapp trycks då det kunde vara två möjligheter om vilken knapp trycks eftersom det finns mer än en källa makt kommer från två olika rader. Säga du slår på rad 1 och rad 2. Om du trycker på knappen 1 kommer sedan makt att ses på ingång 1. Om du trycker på knappen 4 sedan se input 1 makt igen. Jag fattar?
Här är där det blir coolt. Micro controller rör sig så snabbt oavsett hur snabbt du skjuta knappen Skanna visas som fingret på en knapp en massa gånger innan du kan få ditt finger av knappen. I programmet du skriver en if sats. "Om mitt finger som syns på en knapp och sedan stoppa sökningen och vänta på knappen vara släppt (här håller dig från att komma in 5000 knapp pressar innan du kan få finger.) När fingret släpper knappen sedan använda på rad och kolumndiagram som en variabel för att återspegla vad många trycktes. Gå sedan tillbaka till scanning knappsatsen igen väntar ett annat tryck på knapp. En om uttalande måste skrivas för varje kombination av rad och kolumn.
Jag kan höra några av er säger "Det finns ett bibliotek för som redan gjorts, dess kallas keypad.h" som är korrekt, det finns, men jag ville inte att ständigt vara skanning för en knapptryckning, endast vid vissa tider och på så sätt är det lite lättare för mig att kontrollera, eller åtminstone i mitt huvud är det. Skanningen är skriven till en separat funktion från loop funktion. Vid vissa tider under slingan om jag vill leta efter pressar nyckel då jag skicka programmet till den funktion som sedan körs på scan en gång. Jag har skrivit min loop för att gå vidare i stegen och ignorera resten. Så när slingan kommer runt den och att steget är aktiv sedan sökningen kallas för. Mestadels lätt squeezy.