Stap 3: Code voor schematische 1
Programmering
De code voor dit nieuwe schema in zijn geheel kan worden gevonden hier op mijn pastebin.com profiel. Omwille van deze tutorial gaan we de meeste van de belangrijkste concepten van de syntaxis die ik heb gebruikt. Allereerst de Arduino gebruikt een programmeertaal die object-georiënteerde is; C++. Deze taal is vrij krachtig en bevoegdheden van een heleboel hedendaagse website logica, micro-controllers en nog veel meer!
Toetsenblok
Eerst maken we een twee dimensionale matrix van gehele getallen die wij gebruiken voor het houden van de frequenties zoals aangegeven per cijfer door de Blue Box van de Wikipedia-pagina. We stellen ook een duur als een matrix typedef geheel getal zonder voorteken. Deze gehele getallen zijn afspelen duur perioden.
int bb[16][2] = { // MF 0,1,2,3,4,5,6,7,8,9,kp,st,2400+2600,kp2,st2,ss4 super<br> {1300,1500},{700,900},{700,1100}, // 0,1,2 {900,1100},{700,1300},{900,1300}, // 3,4,5 {1100,1300},{700,1500},{900,1500}, // 6,7,8 {1100,1500},{1100,1700},{1500,1700}, // 9,kp,st {2600,2400},{1300,1700},{900,1700}, // 2400+2600,kp2,st2 {2400,2040}, // ss4 Supervisory }; <p>uint8_t bbdur[2] = {60,100};</p>
Vervolgens maken we een matrix matrix van sleutels als tekens. Deze tekens zal worden gebruikt telkens wanneer die een knop op het toetsenbord wordt ingedrukt. We stellen ook de rijen en pinnen integer matrices.
char keys[4][4] = {<br> {'1','2','3','a'}, {'4','5','6','b'}, {'7','8','9','c'}, {'#','0','*','d'} }; <p>byte rowPins[4] = {5,4,3,2}; //connect to the row pinouts of the keypad<br>byte colPins[4] = {9,8,7,6}; //connect to the column pinouts of the keypad</p>
Vervolgens maken we een toetsenbord-object en een eenvoudige matrix van Toon objecten. Aangezien wij tegelijk tonen uit twee pinnen spelen, maakt dit enkel ons leven eenvoudiger wanneer schrijven en debuggen van de code.
Tone freq[2]; // array of Tone objects, now we can play as freq[0].play(); etc<br>Keypad keypad = Keypad(makeKeymap(keys),rowPins,colPins,4,4);
Knoppen lezen en afspelen van tonen
In de Setup -functie moeten we de freq [0] en freq [1] pennen voor uitvoer ingesteld. Dit is eenvoudig. Wij ook stelt de "pin modus" voor de 2600-knop en een gebeurtenislistener, die is een procButton() knop verwerking aangepaste functie-aanroep. Dit is event-driven programmeren. Dit betekent in feite dat we "Luister" voor de toetsen ingedrukt worden, die zou een "gebeurtenis". De belangrijkste loop -functie is wat behandelt de gebeurtenissen en de listeners voor ons.
freq[0].begin(11); // Initialize our first tone generator<br>freq[1].begin(12); // Initialize our second tone generator pinMode(10, INPUT); // 2600 button keypad.addEventListener(procButton);
We hebben onze belangrijkste loop methode eenvoudig gehouden, dat is goed omdat het voortdurend wordt aangeroepen. De eerste regel,
char button = keypad.getKey();
eigenlijk roept de methode van de getKey() van het toetsenbord-object om te zien of en welke toets werd ingedrukt. De code,
if(digitalRead(10)==HIGH){ // play 2600Hz if top button pressed<br> super(); // supervisory signalling }
gewoon luistert voor spanning op pin 10 en indien gevonden, speelt de 2600 hz frequentie door te bellen naar de aangepaste toezichthoudende super() signaalfunctie. Dit is de allereerste functie gedefinieerd net onder de loop -functie. Het is ook de eerste aan te roepen van de aangepaste enkele frequentie spelen sf() functie als, functie
sf(2600,750);
De argumenten die we aan deze functie doorgeeft zijn de frequentie worden gespeeld, en de duur. Na lexicaal toewijzen van de frequentie en duur aan geheelvariabelen van dezelfde namen, de aangepaste sf() -functie alleen een methode wordt aangeroepen enkel spelen op een enkele pin als,
freq[0].play(frequency,duration);
Dit is onze eerste blik op de Toon synthese play methode van de Tone library. Dus, als u zich spelen twee tonen, voorstellen kunt voor multi-frequency zou lijken, maar met twee pinnen, zoals
freq[0].play(frequency,duration);<br>freq[0].play(frequency,duration);
En dat is precies wat de aangepaste multi-frequency spelen mf() functie heeft.
Dus hoe verwerken we elke toetsaanslag in de procButton() functie? Met behulp van een geval-schakel-logica. De constanten "RELEASED," "PRESSED," en "houden," (niet "HELD" om wat vreemde reden), zijn onderdeel van de bibliotheek van het toetsenblok en we kunnen gebruiken het in een geval-schakel-logica blok als,
switch (keypad.getState()){<br>case RELEASED: // drop right away // do some stuff break; case PRESSED: // momentary // do some stuff break; case HOLD: // HELD (special functions) // do some stuff break; }
En dat is precies wat we doen. Aangezien de procButton() -functie een gebeurtenis-handler aangeroepen door de loop -functie is, krijgen we een keypadevent-object doorgegeven aan de handler procButton(). Dit object kan worden behandeld als een eenvoudige teken - en we doen dat door eenvoudig het gehele getal 48 hieruit te verkrijgen welke toets werd ingedrukt uit 0-9 af te trekken.
void procButton(KeypadEvent b){<br> b -= 48;
Nu we weten welke toets werd ingedrukt en doorgeven aan de functie mf() die gebruik maakt van de multidimensionale array bb [] in te stellen die we eerder te spelen de mf tonen. Je misschien hebt gemerkt dat de KP (*) en de ST (#) niet 0-9 zijn. Dat is juist, als ze via komen en na het aftrekken zijn respectievelijk-13 en -6. De mf() functie vervolgens behandelt deze als,
}else if(digit==-13){<br> digit = 12; // * }else if(digit==-6){ digit = 14; // #
Dan speelt de tonen zoals ze zijn toegewezen in de multi-dimensionale array van bb [] .
We hebben nu bedekt alle van de belangrijkste concepten programmatisch met dit schema (1), laten we gaan naar het tweede schema en hoe we de WAV-bestanden die een volledig ander geluid aan onze blauwe dozen bieden kunt spelen.
Extra functies
Deze code voorziet in een enorme hoeveelheid extra eigenschappen met inbegrip van opname van de cijfers in en matrix afspelen, en verschillende bewerkingsmodi. De code is zeer ongecompliceerd Arduino C++-code. Druk lang op 'A' doorlopen van de verschillende modi. Telkens wanneer we gewijzigd modi die de notifyMode() functie zal pulse uit een code van 440 hz piept te laten weten welke modus die we momenteel gebruiken. Alle modi worden volledig beschreven op mijn weblog hier of op de Wikipedia-pagina voor de specificaties van de blauwe doos.