Sisällysluettelo:

Arduino - pianolaatat: 16 vaihetta (kuvilla)
Arduino - pianolaatat: 16 vaihetta (kuvilla)

Video: Arduino - pianolaatat: 16 vaihetta (kuvilla)

Video: Arduino - pianolaatat: 16 vaihetta (kuvilla)
Video: Драм-секвенсор Arduino: 8 дорожек, 16 шагов на такт, 8 тактов на паттерн 2024, Heinäkuu
Anonim
Arduino - pianolaatat
Arduino - pianolaatat

Hei Internet -ihmiset, tässä on kyse siitä, kuinka tehdä se, mikä EI KIINTÄNÄ ole mobiilipelin kopiointia arduino uno r3: lla.

joten aluksi tarvitset kaikki osat, jotka ovat seuraavat! 1x Arduino Uno r3 (42 dollaria)

2x LCD -näppäimistön suoja (19 dollaria kukin)

5x painikkeet

5x 220Ω vastukset

28x johdot

Okei, kun olet saanut kaikki osat, on aika aloittaa!

Vaihe 1: Johdotus

Johdotus
Johdotus
Johdotus
Johdotus
Johdotus
Johdotus

Aloita johdotamalla arduino ja ystävät kaavion mukaisesti, Varmista, että painikkeet on kytketty oikein päin, ja A0-4-aukot painikekiskojen pohjapuolella, tai arduino luulee sen sijaan, että painikkeita pidetään jatkuvasti painettuina.

Vaihe 2: Ilmoituslausumat

Kaikkien tässä olevien koodien pitäisi mennä ennen tyhjiöasetustasi ja tyhjäkäyntiä, koska kaikkia näitä muuttujia ja objekteja käytetään useissa toiminnoissa, jotka asetamme.

Aloita laittamalla:

#sisältää

koodisi yläosassa tämä kertoo arduinoa käyttämään kirjastoa "LiquidCrystal.h" ja sen toimintoja.

Seuraava askel on määritellä nappeihimme käyttämämme nastat asettamalla tämä koodi #include: n alle:

#define btnAde A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

Määrittelemme termit btnEnter ja btn1 - btn 4 helpottaaksemme koodin lukemista tai muuttaaksemme sitä tarvittaessa. Se tarkoittaa, että kun kirjoitamme btn1, arduino tietää, että me itse asiassa tarkoitamme painiketta 15. Vaikka kutsumme portteja portteiksi 15, 16, 17 ja 18, ne on merkitty arduinoon nimellä A1 A2 A3 ja A4, koska ne ovat portteja, joita käytetään erityisesti analogisille tuloille, vaikka käytämme niitä vain digitaalituloihin.

Seuraavaksi aiomme luoda objekteja, jotka ohjaavat nestekidenäyttöjä. Voit tehdä tämän asettamalla tämän koodin määritelmämme alle

LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);

Tämä kertoo arduinolle, että kun kutsumme lcdLeft tai lcdRight, viittaamme LiquidCrystal -objektiin. Oheisissa suluissa olevat numerot kertovat arduinolle, mitä portteja objekti käyttää viestien lähettämiseen nestekidenäyttöön, kun käytämme niiden toimintoja.

Nyt meidän on ilmoitettava muuttujat asettamalla seuraava koodibitti objektideklaraatioiden alle:

// nämä muuttujat ovat vaihtoehtoja, joita voit muuttaa - suurempia numeroita = nopeampi pelin nopeus upint intameGeSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// asetetaan muuttujia pelin boolean bolPlay; // kappaleet jos soitin int intScore; // seuraa pelaajan pistettä intDiff; // vain esteettinen asia kertoakseen, kuinka vaikeassa pelissä on kyse // asetetaan muuttujat syötteelle int intEnter; // seuraa, jos käyttäjä painaa enter -painiketta int intInput; // seuraa mitä painikkeita käyttäjä painaa boolean bolTilePressed; // varmista, että pelaaja ei vahingossa paina painiketta 5x ja häviä // aseta muuttujia turn int intTick; // laskee milliä (silmukkaa kohden) asti intDelay int intDelay; // aika, jonka ohjelma odottaa seuraavaan kierrokseen millis int intGameSpeed; // abit of debug options boolean bolSerialBoard; // kun true, tulostaa levyn sarjamonitorissa

Ilmoitamme muuttujan ilmoittamalla tietotyypin ja sitten muuttujan nimen, esim. int thisIsAnInteger

Boolen muuttujilla, kuten bolSerialBoard ja bolPlay, voi olla vain yksi kahdesta arvosta, tosi tai epätosi.

Kokonaislukumuuttuja (int), kuten intScore ja intInput, voi ottaa kokonaislukuja arvoina, kuten 1, 5 tai 100.

Jotkut muut merkittävät tietotyypit, joita emme käytä tässä, ovat merkkijono, joka on tekstinpala, ja kelluva, joka on desimaaliluku.

Ohjelma käyttää kaikkia muuttujia useissa eri paikoissa, tässä on tiivistelmä siitä, mitä kukin tekee

bolPlay kertoo ohjelmalle, onko valikko näytettävä vai onko varsinainen peli käynnissä.

intScore seuraa pelaajan pisteitä, kun he osuvat laattoihin, intDiff -toimintoa käytetään päävalikossa kertomaan ohjelmalle, minkä verran tekstiä tulostetaan nestekidenäytöille, intEnter -ohjelmaa käytetään ilmoittamaan ohjelmalle, jos Enter -painiketta (kauimpana vasemmalla) painetaan, intInput -ohjelmaa käytetään ilmoittamaan ohjelmalle, mitä neljästä muusta painikkeesta painetaan.

bolTilePressed -ohjelmaa käytetään varmistamaan, että ohjelma lukee vain painiketta painettaessa eikä sitä pidettäessä.

intGameSpeed, intGameSpeedEasy, intGameSpeedMedium ja intGameSpeedHard käytetään ohjaamaan kuinka nopeasti peli nopeutuu valitun vaikeuden perusteella.

intTick- ja intDelay -ohjelmia käytetään estämään ohjelma siirtämästä taulua joka kerta, kun se silmukoidaan.

bolSerialBoardin avulla voit saada ohjelman lähettämään levyn arduinon sarjamonitorille numerosarjana testausta varten.

Lopuksi on aika julistaa aluksemme taulukkona käyttämällä tätä koodia:

// aseta pelimatriisi arrGame [16] [4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};

Matriisi on matriisi, joka tahansa piste, josta voidaan kutsua matematiikkaa tai muuttaa.

Koodisi pitäisi nyt näyttää tältä;

// sisällytä kirjastoja#include

// nämä muuttujat ovat vaihtoehtoja, joita voit muuttaa - suuremmat luvut = nopeampi pelin nopeus

int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// Määritä nastat

Syötä A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

// luo LCD -objekteja (n, ~, n, ~, ~, n)

LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);

// aseta peliryhmä

int arrGame [16] [4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};

// asettaa muuttujia pelille

boolean bolPlay; // kappaleet, jos pelaaja int intScore; // seuraa pelaajan pistettä intDiff; // vain esteettinen asia kertomaan, kuinka vaikeaa peli on

// määritä muuttujat syötettäväksi

int intEnter; // seuraa, jos käyttäjä painaa enter -painiketta int intInput; // seuraa mitä painikkeita käyttäjä painaa boolean bolTilePressed; // Varmista, että pelaaja ei vahingossa paina painiketta 5x ja häviä

// aseta muuttujat käännökselle

int intTick; // laskee milliä (silmukkaa kohden) asti intDelay int intDelay; // aika, jonka ohjelma odottaa seuraavaan kierrokseen millis int intGameSpeed;

// virheenkorjausvaihtoehtojen lopettaminen

boolean bolSerialBoard; // kun true, tulostaa levyn sarjamonitorissa

Vaihe 3: Asennustoiminto

Asetussilmukka on funktio, jonka arduino lukee vain kerran, kun se aluksi käynnistyy.

Asetussilmukassa asetamme vain muutamien muuttujien arvoja, koska sen sijaan, että asetamme heille arvon ilmoittaessamme ne, teemme sen täällä.

Aloita lisäämällä tämä koodi Void -asetukseesi.

bolPlay = epätosi; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium;

Jokainen rivi asettaa vain muuttujan arvoksi.

bolPlay on asetettu arvoon false, jotta peli ei käynnisty.

intScore on asetettu arvoon 0, koska pisteet alkavat luonnollisesti nollasta.

intTick alkaa nollasta, koska ohjelma ei tällä hetkellä laske mitään.

intDelay -arvoksi on asetettu 1000, koska ruutujen aloitusnopeus on tämä.

intDiff on vain askeettinen asia, jotta ohjelma tietää mitä kirjoittaa pelin vaikeuden vuoksi.

intGameSpeed on asetettu mihin tahansa intGameSpeedMedium on, eli se on asetettu keskivaikeuteen.

Seuraavaksi laita tämä koodi Void Setupiin juuri syöttämäsi koodin alle.

lcdLeft.begin (16, 2); lcdRight.begin (16, 2);

Sarja.alku (9600);

Tämä käskee arduinoa aloittamaan viestinnän tietokoneen kanssa sarjamonitorin kautta (näkyy napsauttamalla arduino IDE: n oikeassa yläkulmassa olevaa painiketta).

Void -asennuksesi pitäisi nyt näyttää tältä!

void setup () {Serial.begin (9600); // sarjamonitorin käynnistäminen // muuttujien määrittäminen bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // aloita lcd: n lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

Vaihe 4: Silmukkatoiminto

Silmukotoiminto suoritetaan arduinon toimesta joka kerta.

Kopioi seuraava koodi Void Loopiin.

tyhjä silmukka () {input (); // tarkista pelinsyöttö jos (bolPlay == true) {if (intTick> = intDelay) {// tarkista onko pelin pelattava vuoro vai odotettava edelleen Serial.println ("~~~~~~~ ~~ "); // tulosta merkitsemään taulun siirtymistä // writeSerial (); // jos vaihtoehto on käytössä, kirjoita levy sarjapainikkeisiinGame (); // tarkista pelaajatulot playBoard (); // siirrä levyä ja lisää uusi ruutu clearLcd (); // puhdista nestekidenäytöt ennen piirtämistä drawBoard (); // piirrä levy LCD -näytön pohjaanCheck (); intTick = 0; // nollaa intTick} else {buttonsGame (); // tarkista pelaajatulot clearLcd (); // puhdista nestekidenäytöt ennen piirtämistä drawBoard (); // piirrä taulu lcd: n intTick = intTick + intGameSpeed; // lisää rasti}} else {clearLcd (); // puhdista nestekidenäytöt ennen otsikon () piirtämistä; // näytä otsikko- ja pistetiedot -painikkeetValikko (); // lukea soittimen tulo clearBoard (); // varmista koko levy = 0} viive (10); // viivyttää arduinoa lyhyellä hetkellä}

kun bolPlay on yhtä kuin tosi, se tarkoittaa, että peliä pelataan, ja kaikki pelin pelaamiseen tarvittavat koodit on suoritettava, mutta haluamme vain, että lauta lisää uuden laatan ja siirtyy alas, kun intTick on suurempi kuin intDelay, muutoin haluamme edelleen sallia käyttäjän painaa painiketta osuakseen ruutuun ja intTickin nopeuden lisäämiseksi.

Suurin osa tästä koodista käyttää toimintoja, joita olemme vielä tekemättä, ja teemme ne seuraavissa vaiheissa. Näiden toimintojen tarkoitus on seuraava.

Syöttö lukee mitä painikkeita käyttäjä on painanut.

buttonGame ohjaa, mitä painikkeet tekevät pelissä, ei valikossa

playBoard lisää uuden laatan laudalle ja siirtää sitten kaikki pelilaudan yhden tilan alaspäin

clearLCD puhdistaa nestekidenäytöt varmistaakseen, ettei aaveita jää laattojen taakse

drawBoard käy läpi arrGame ja tulostaa sen nestekidenäytöille

clearBoard tyhjentää koko arrGame, kun peli ei ole pelissä

bottomCheck tarkistaa arrGamen pohjan vikatilanteen varalta

otsikko näyttää pelin otsikon ja tulokset, kun se on valikossa

-painikkeiden valikko ohjaa, mitä käyttäjän syötteet tekevät valikossa.

gameOver on toinen toiminto, vaikka sitä ei kutsuta täällä, koska sitä kutsutaan alhaalla Tarkista ja painikkeetPelitoiminnot.

Vaihe 5: ClearLCD -toiminto

funktion luomiseksi aloitamme lisäämällä tämän koodiin

void functionName () {

}

"functionName" voi olla mikä tahansa, kunhan sitä ei ole jo olemassa.

Kopioi tämä koodi ohjelmaan:

void clearLcd () {for (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 1; ii ++) {lcdLeft.setCursor (i, ii); lcdLeft.write (""); lcdRight.setCursor (i, ii); lcdRight.write (""); }}}

tämä kulkee koko taulukon läpi käyttämällä 2 laskettua silmukkaa kulkemaan jokaisen nestekidenäytön pisteen läpi ja kirjoittamaan välilyönti.

Ilman nollaus mitään nestekidenäytöt säilyttävät sen, mitä aiemmin on kirjoitettu

Vaihe 6: DrawBoard -toiminto

kopioi tämä koodi ohjelmaan

void drawBoard () {for (int i = 1; i <= 15; i ++) {// piirrä kollot 1 ja 2 vasemmalla nestekidenäytöllä // jos ruutu = 0 kirjoita mitään, = 1 kirjoita "#", = 2 kirjoita "@" lcdLeft.setCursor (i, 1); // aseta ensimmäiseen sarakkeeseen (kauimpana vasemmalla), jos (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // aseta toiseen sarakkeeseen (keskellä vasemmalla), jos (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // aseta kolmanteen sarakkeeseen (keskellä oikealla) if (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // asetetaan neljännelle sarakkeelle (kauimpana oikealla) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.write ("@");}}}

tämä käyttää silmukkaa kulkemaan taulun jokaisen rivin läpi ja tarkistaa sitten, onko rivin sarake yhtä kuin 1 tai 2, minkä perusteella se tulostaa nestekidenäytölle joko hashtagin, jotta ruutu on vielä osuma tai @ osumatilaatalle.

Vaihe 7: PlayBoard -toiminto

kopioi tämä koodi ohjelmaan.

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // tyhjennä ylärivi arrGame [0] [satunnainen (0, 4)] = 1; // aseta yläriville satunnainen piste ruutuksi (int i = 15; i> = 1; i-) {// joka toimii levyn alareunasta ylöspäin (int ii = 0; ii <= 3; ii ++) {// kullekin kollumille arrGame [ii] = arrGame [i - 1] [ii]; }}}

tämä koodi alkaa tyhjentämällä koko ylärivin 0: ksi tai ei ollenkaan laattaksi ja asettaa sitten yhden satunnaisen ruudun 1: ksi.

Sitten se kulkee lasketun silmukan läpi taaksepäin, 15: stä 1: een, asettamalla rivin yhtä suureksi sen yläpuolella olevan rivin kanssa, jolloin levy siirtyy LCD -näytön alaspäin

Vaihe 8: ClearBoard -toiminto

kopioi tämä koodi ohjelmaan.

void clearBoard () {// nollaa rasti- ja viivearvot intTick = 0; intDelay = 1000; // käy läpi lauta ja aseta kaikki arvoksi 0 (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

Tämä koodi ajetaan, kun peliä ei pelata, jotta varmistetaan, että koko arrGame on asetettu arvoon 0 tai ei yhtään laattaa, käyttämällä laskettuja silmukoita matriisin läpi.

Koodi nollaa myös intDelay- ja intTick -arvot.

Vaihe 9: Otsikkotoiminto

kopioi seuraava koodi ohjelmaan

void title () {// kirjoita otsikko nestekidenäyttöön ja tilaa pisteille lcdRight.setCursor (0, 0); lcdRight.write ("Piano Laatat"); lcdRight.setCursor (0, 1); lcdRight.write ("Pisteet:"); // muuntaa pisteet merkkijonoksi char strScore [3]; sprintf (strScore, "%d", intScore); // näyttää pisteet nestekidenäytölle lcdRight.write (strScore); // lisää vaikeasti lcdRight.setCursor (10, 1); if (intDiff == 0) {lcdRight.write ("Helppo"); } jos (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Kova"); } // Paina hieman käskyä lcdLeft.setCursor (0, 0); lcdLeft.write ("Paina Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("aloittaa!"); }

Tämä koodi kirjoittaa pelin nimen ja pistemäärän nestekidenäytöille. Se tekee tämän kertomalla nestekidenäytölle, mistä aloittaa kirjoittaminen LCD.setCursorilla ja kirjoittamalla merkkijono LCD.write -muodossa.

Täällä luodaan myös uusi muuttuja, strScore, jota käytetään muuntamaan intScore merkkijonoksi tai char -tietotyypiksi sprintf -funktion avulla.

Tässä käytetään myös intDiffia, joka tulostaa eri vaikeusvaihtoehdot arvojensa perusteella.

Vaihe 10: ButtonsMenu -toiminto

lisää seuraava koodi ohjelmaan

void buttonsMenu () {// kun enter -näppäintä painetaan, aloita peli ja nollaa pistearvo, jos (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // kun painiketta 3 painetaan, ota käyttöön virheenkorjausmahdollisuus tulostaa levy sarjana, jos (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = tosi; } else {Serial.println ("Serial Board Disabled"); bolSerialBoard = epätosi; }} // aseta pelin nopeus vaikeaksi, jos (intInput == 0) {Serial.print ("Game set to easy ("); Serial.print (intGameSpeedEasy); Serial.println ("ms kiihdytys" "); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // aseta pelin nopeus keskivaikeaksi, jos (intInput == 1) {Serial.print ("Game set to medium ("); Serial.print (intGameSpeedMedium); Serial.println ("ms kiihdytys" "); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // aseta pelin nopeus vaikeaksi, jos (intInput == 2) {Serial.print ("Game set to hard ("); Serial.print (intGameSpeedHard); Serial.println ("ms kiihdytys" "); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

tämä koodi suoritetaan vain, kun bolPlay on yhtä kuin epätosi silmukassa

jos intEnter on asetettu arvoon 1, se tarkoittaa, että enter -painiketta on painettu, ja jos sitä painetaan, ohjelma asettaa bolPlay -asetukseksi tosi ja peli alkaa.

Ohjelma lukee sitten, mitä intInput on yhtä suuri. jos se on 0, ensimmäistä painiketta vasemmalta painetaan, oikealle ylöspäin 3. Jos intInput on 4, mitään painiketta ei paineta.

Jos painat painikkeita 0-2, peli muuttaa vaikeutta ja muuttaa myös pelin nopeusarvoa, mikä tarkoittaa, että se kiihtyy nopeammin.

Jos painiketta 3 painetaan, peli aktivoi tai poistaa käytöstä virheenkorjaustilan, jossa koko levy on tulostettu sarjamonitoriin helpottamaan ohjelman ongelmien löytämistä.

Vaihe 11: ButtonsGame -toiminto

kopioi seuraava koodi ohjelmaan

void buttonsGame () {if (intInput! = 4) {// jos painiketta painetaan, jos (bolTilePressed == false) {// vain jos bolTilePressed on väärä laukaisutoiminto painikkeen painamisen tarkistamiseksi bolTilePressed = true; // aseta sitten bolTilePressed arvoon true, jotta se ei käynnisty vahingossa uudelleen int intLowestTile = 0; // asetetaan ruutuun, jossa on alin ruutu int intCheckedTile = 15; // seurataksesi mitä ruutuja on tarkistettu (intLowestTile == 0) {// niin kauan kuin se ei ole asetettu mihinkään tarkista ruudut (int i = 0; i 100) {// niin kauan kuin int viive on vähintään 100 intDelay = intDelay - 20; // ota siitä arvo}} else {Serial.println ("Väärää painiketta painettu"); peli ohi(); // muuten peli ohi}}}}}

Koodi suoritetaan vain, kun bolPlay on yhtä kuin tyhjä silmukka.

Kuten painikkeetValikko intInput -arvon perusteella tarkistaa, onko pelaaja osunut ruutuun vai ohittanut sen.

Se tekee tämän käymällä arrGame alhaalta ylös käyttämällä while -silmukkaa etsimään, mikä rivi on alin unhit -ruudun kanssa. Sitten se tarkistaa, onko kyseisellä rivillä oleva kohta, joka vastaa painettua painiketta, unhi laatta vai ei, jos se on unhit, se asettaa sen arvoksi 2 eikä 1, mikä tarkoittaa, että se näkyy @: na, muuten se käynnistää pelin toiminto, jota emme ole vielä luoneet.

Tämä toiminto käyttää myös bolTilePressed -muuttujaa asettamalla sen arvoksi true, kun painiketta painetaan, ja false, kun mitään painiketta ei paineta. Tällä varmistetaan, että käyttäjä ei vahingossa menetä peliä, koska ohjelma luuli painavansa painiketta useita kertoja pitäessään sitä painettuna.

Vaihe 12: GameOver -toiminto

Kopioi seuraava koodi ohjelmaan

void gameOver () {Serial.println ("Game Over!"); Serial.print ("Pisteesi oli:"); Sarja.println (intScore); Serial.print ("Nopeutesi oli:"); Serial.println (intDelay); bolPlay = epätosi; }

Tämä käynnistyy joko checkBottom- tai painikepeli -toiminnoilla ja laukaisee pelin päättymisen asettamalla bolPlay -arvon vääriksi.

Se tulostaa myös viestin sarjamonitoriin käyttäjien pisteistä ja nopeusruudut lisättiin millisekunteina.

Vaihe 13: Tulotoiminto

Kopioi seuraava koodi ohjelmaan.

void input () {intEnter = digitalRead (btnEnter); // read enter // lue, mitkä muut tulot, tai jos mikään ei ole asetettu arvoon 4, jos (digitalRead (btn1) == HIGH) {intInput = 0;} else {if (digitalRead (btn2) == HIGH) {intInput = 1;} else {if (digitalRead (btn3) == HIGH) {intInput = 2;} else {if (digitalRead (btn4) == HIGH) {intInput = 3;} else {intInput = 4; }}}} // sarja tulostaa syötteet if (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Sarja.println (intInput); } else {// jos mitään painiketta ei paineta, nollaa bolTilePressed bolTilePressed = false; }}

Tätä koodia käytetään painikkeiden Peli ja painikkeet Valikkotoimintojen kanssa. Käyttäjä on painanut painikkeiden perusteella intInput -arvon tai jos mitään painiketta ei paineta, intInput -arvoksi tulee 4.

Jos mitään painiketta ei paineta, bolTilePressed nollataan painikkeilleGame -toiminto.

Se tulostaa myös viestin sarjamonitorille, jossa painiketta painetaan.

Vaihe 14: BottomCheck -toiminto

kopioi seuraava koodi ohjelmaan.

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 sarakkeelle if (arrGame [15] == 1) {// jos ruutu on alareunassa Sarja.println ("Laatta alareunassa"); arrGame [15] = 2; drawBoard (); viive (400); arrGame [15] = 1; drawBoard (); viive (400); arrGame [15] = 2; drawBoard (); viive (400); arrGame [15] = 1; drawBoard (); viive (400); peli ohi(); }}}

silmukan avulla tämä koodi tarkistaa arrGame -rivin alimman rivin mahdollisten unhit -laattojen varalta (laatat yhtä suuret kuin 1). Jos näytön alareunassa on unhit -laatta, se vilkuttaa ruutua ja käynnistää pelin.

Vaihe 15: WriteSerial -toiminto

kopioi seuraava koodi ohjelmaan

void writeSerial () {if (bolSerialBoard == true) {for (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {Serial.print (arrGame [ii]); Serial.print (","); } Sarja.println (""); }}}

Tätä toimintoa seuraa debug -vaihtoehto, joka voidaan ottaa käyttöön painikkeilla Valikko. Jos bolSerialBoard on asetettu arvoon true tässä toiminnossa, se käy läpi arrGame -ohjelman ja tulostaa koko kortin sarjamonitoriksi testausta varten taulukon avulla.

Vaihe 16: Valmistuminen

Valmistuminen!
Valmistuminen!

Koko koodisi ei pitäisi olla täydellinen ja näyttää tältä!

/ * * Nimi - pianolaatat; Arduino * By - Domenic Marulli * Päivämäärä - 11/ *

/ sisältää kirjastoja

#sisältää

// nämä muuttujat ovat vaihtoehtoja, joita voit muuttaa - suuremmat luvut = nopeampi pelin nopeus

int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// Määritä nastat

Syötä A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

// luo LCD -objekteja (n, ~, n, ~, ~, n)

LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);

// aseta peliryhmä

int arrGame [16] [4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};

// asettaa muuttujia pelille

boolean bolPlay; // kappaleet, jos pelaaja int intScore; // seuraa pelaajan pistettä intDiff; // vain esteettinen asia kertomaan, kuinka vaikeaa peli on

// määritä muuttujat syötettäväksi

int intEnter; // seuraa, jos käyttäjä painaa enter -painiketta int intInput; // seuraa mitä painikkeita käyttäjä painaa boolean bolTilePressed; // Varmista, että pelaaja ei vahingossa paina painiketta 5x ja häviä

// aseta muuttujat käännökselle

int intTick; // laskee milliä (silmukkaa kohden) asti intDelay int intDelay; // aika, jonka ohjelma odottaa seuraavaan kierrokseen millis int intGameSpeed;

// virheenkorjausvaihtoehtojen lopettaminen

boolean bolSerialBoard; // kun true, tulostaa levyn sarjamonitorissa

// asetus, joka suoritetaan kerran

void setup () {Serial.begin (9600); // sarjamonitorin käynnistäminen // muuttujien määrittäminen bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // aloita lcd: n lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

// silmukka, joka suoritetaan 10 millisekunnin välein

tyhjä silmukka () {input (); // tarkista pelinsyöttö jos (bolPlay == true) {if (intTick> = intDelay) {// tarkista onko pelin pelattava vuoro vai odotettava edelleen Serial.println ("~~~~~~~ ~~ "); // tulosta merkitsemään taulun siirtymistä // writeSerial (); // jos vaihtoehto on käytössä, kirjoita levy sarjapainikkeisiinGame (); // tarkista pelaajatulot playBoard (); // siirrä levyä ja lisää uusi ruutu clearLcd (); // puhdista nestekidenäytöt ennen piirtämistä drawBoard (); // piirrä levy LCD -näytön pohjaanCheck (); intTick = 0; // nollaa intTick} else {buttonsGame (); // tarkista pelaajatulot clearLcd (); // puhdista nestekidenäytöt ennen piirtämistä drawBoard (); // piirrä taulu lcd: n intTick = intTick + intGameSpeed; // lisää rasti}} else {clearLcd (); // puhdista nestekidenäytöt ennen otsikon () piirtämistä; // näytä otsikko- ja pistetiedot -painikkeetValikko (); // lukea soittimen tulo clearBoard (); // varmista koko levy = 0} viive (10); // viivyttää arduinoa lyhyellä hetkellä}

// puhdistaa lcd: n, joten kaikki syöttämättömät solut eivät jää sinne

void clearLcd () {for (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 1; ii ++) {lcdLeft.setCursor (i, ii); lcdLeft.write (""); lcdRight.setCursor (i, ii); lcdRight.write (""); }}}

// vetää taulun lcd: n päälle

void drawBoard () {for (int i = 1; i <= 15; i ++) {// piirrä kollot 1 ja 2 vasemmalla nestekidenäytöllä // jos ruutu = 0 kirjoita mitään, = 1 kirjoita "#", = 2 kirjoita "@" lcdLeft.setCursor (i, 1); // aseta ensimmäiseen sarakkeeseen (kauimpana vasemmalla), jos (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // aseta toiseen sarakkeeseen (keskellä vasemmalla), jos (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // aseta kolmanteen sarakkeeseen (keskellä oikealla) if (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // asetetaan neljännelle sarakkeelle (kauimpana oikealla) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.write ("@");}}}

// siirtää taulua alaspäin ja asettaa satunnaisen arvon laattaksi

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // tyhjennä ylärivi arrGame [0] [satunnainen (0, 4)] = 1; // aseta yläriville satunnainen piste ruutuksi (int i = 15; i> = 1; i-) {// joka toimii levyn alareunasta ylöspäin (int ii = 0; ii <= 3; ii ++) {// kullekin kollumille arrGame [ii] = arrGame [i - 1] [ii]; }}}

// asettaa koko kortin 0: ksi ja palauttaa muuttujat esipeliksi

void clearBoard () {// nollaa rasti- ja viivearvot intTick = 0; intDelay = 1000; // käy läpi lauta ja aseta kaikki arvoksi 0 (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

// näyttää päävalikon nestekidenäytöissä

void title () {// kirjoita otsikko nestekidenäyttöön ja tilaa pisteille lcdRight.setCursor (0, 0); lcdRight.write ("Piano Laatat"); lcdRight.setCursor (0, 1); lcdRight.write ("Pisteet:"); // muuntaa pisteet merkkijonoksi char strScore [3]; sprintf (strScore, "%d", intScore); // näyttää pisteet nestekidenäytölle lcdRight.write (strScore); // lisää vaikeasti lcdRight.setCursor (10, 1); if (intDiff == 0) {lcdRight.write ("Helppo"); } jos (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Kova"); } // Paina hieman käskyä lcdLeft.setCursor (0, 0); lcdLeft.write ("Paina Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("aloittaa!"); }

// tarkistaa painikkeet ja mitä tehdä niille pelin ulkopuolella

void buttonsMenu () {// kun enter -näppäintä painetaan, aloita peli ja nollaa pistearvo, jos (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // kun painiketta 3 painetaan, ota käyttöön virheenkorjausmahdollisuus tulostaa levy sarjana, jos (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = tosi; } else {Serial.println ("Serial Board Disabled"); bolSerialBoard = epätosi; }} // aseta pelin nopeus vaikeaksi, jos (intInput == 0) {Serial.print ("Game set to easy ("); Serial.print (intGameSpeedEasy); Serial.println ("ms kiihdytys" "); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // aseta pelin nopeus keskivaikeaksi, jos (intInput == 1) {Serial.print ("Game set to medium ("); Serial.print (intGameSpeedMedium); Serial.println ("ms kiihdytys" "); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // aseta pelin nopeus vaikeaksi, jos (intInput == 2) {Serial.print ("Game set to hard ("); Serial.print (intGameSpeedHard); Serial.println ("ms kiihdytys" "); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

// tarkistaa painikkeet ja mitä tehdä niille pelin aikana

void buttonsGame () {if (intInput! = 4) {// jos painiketta painetaan, jos (bolTilePressed == false) {// vain jos bolTilePressed on väärä laukaisutoiminto painikkeen painamisen tarkistamiseksi bolTilePressed = true; // aseta sitten bolTilePressed arvoon true, jotta se ei käynnisty vahingossa uudelleen int intLowestTile = 0; // asetetaan ruutuun, jossa on alin ruutu int intCheckedTile = 15; // seurataksesi mitä ruutuja on tarkistettu (intLowestTile == 0) {// niin kauan kuin se ei ole asetettu mihinkään tarkista ruudut (int i = 0; i 100) {// niin kauan kuin int viive on vähintään 100 intDelay = intDelay - 20; // ota siitä arvo}} else {Serial.println ("Väärää painiketta painettu"); peli ohi(); // muuten peli ohi}}}}}

void gameOver () {

Serial.println ("Peli ohi!"); Serial.print ("Pisteesi oli:"); Sarja.println (intScore); Serial.print ("Nopeutesi oli:"); Serial.println (intDelay); bolPlay = epätosi; }

// tarkistaa pelaajan syötteen

void input () {intEnter = digitalRead (btnEnter); // read enter // lue, mitkä muut tulot, tai jos mikään ei ole asetettu arvoon 4, jos (digitalRead (btn1) == HIGH) {intInput = 0;} else {if (digitalRead (btn2) == HIGH) {intInput = 1;} else {if (digitalRead (btn3) == HIGH) {intInput = 2;} else {if (digitalRead (btn4) == HIGH) {intInput = 3;} else {intInput = 4; }}}} // sarja tulostaa syötteet if (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Sarja.println (intInput); } else {// jos mitään painiketta ei paineta, nollaa bolTilePressed bolTilePressed = false; }}

// tarkistaa levyn pohjan vikojen varalta

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 sarakkeelle if (arrGame [15] == 1) {// jos ruutu on alareunassa Sarja.println ("Laatta alareunassa"); arrGame [15] = 2; drawBoard (); viive (400); arrGame [15] = 1; drawBoard (); viive (400); arrGame [15] = 2; drawBoard (); viive (400); arrGame [15] = 1; drawBoard (); viive (400); peli ohi(); }}}

// tulostaa levyn sarjamonitoriin, jos bolSerialBoard on tosi

void writeSerial () {if (bolSerialBoard == true) {for (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {Serial.print (arrGame [ii]); Serial.print (","); } Sarja.println (""); }}}

Kun kaikki koodi on syötetty, lataa arduinoosi ja nauti!

Suositeltava: