Sadržaj:

Arduino - Klavirske pločice: 16 koraka (sa slikama)
Arduino - Klavirske pločice: 16 koraka (sa slikama)

Video: Arduino - Klavirske pločice: 16 koraka (sa slikama)

Video: Arduino - Klavirske pločice: 16 koraka (sa slikama)
Video: Книга - Моя первая схема ArduMikron 2024, Srpanj
Anonim
Arduino - Piano Piano
Arduino - Piano Piano

Pozdrav internet ljudi, ovo će biti o tome kako napraviti ono što DEFINITIVNO nije otmica mobilne igre na arduino uno r3.

pa za početak trebat će vam svi dijelovi koji su sljedeći! 1x Arduino Uno r3 (42 USD)

2x štitnik LCD tipkovnice (19 USD svaki)

5x tipki

5x 220Ω otpornika

28x žica

U redu, kad dobijete sve dijelove, vrijeme je za početak!

Korak 1: Ožičenje

Ožičenje
Ožičenje
Ožičenje
Ožičenje
Ožičenje
Ožičenje

Počnite povezivanjem arduina i prijatelja kako je prikazano na dijagramu, Provjerite jesu li gumbi pravilno povezani, s utorima A0-4 na prizemnoj strani vodilica gumba, ili će arduino umjesto toga pomisliti da se tipke drže pritisnute, a ne samo pritiskom.

Korak 2: Izjave o deklaraciji

Sav kôd ovdje bi trebao proći prije vašeg void postavljanja i void petlje, to je zato što se sve ove varijable i objekti koriste u nekoliko funkcija koje ćemo postaviti.

Započnite stavljanjem:

#uključi

na vrhu vašeg koda, ovo govori arduinu da koristi biblioteku "LiquidCrystal.h" i funkcije koje su njen dio.

Sljedeći korak je definiranje pinova koje koristimo za naše gumbe stavljanjem ovog koda ispod našeg #include:

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

Definiramo pojmove btnEnter i btn1 do btn 4 kako bismo olakšali čitanje koda ili ga po potrebi promijenili. To znači da će, kada upišemo btn1, arduino znati da zapravo mislimo na gumb 15. Iako portove nazivamo portima 15, 16, 17 i 18, oni su na arduinu označeni kao A1 A2 A3 i A4, to je zato što to su priključci koji se koriste posebno za analogne ulaze, iako ih koristimo samo za digitalne ulaze.

Zatim ćemo stvoriti objekte koji će kontrolirati zaslone s tekućim kristalima. Da biste to učinili, stavite ovaj kôd ispod naših definicija

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

Ovo govori arduinu da kada zovemo lcdLeft ili lcdRight mislimo na objekt LiquidCrystal. Brojevi u zagradama govore arduinu koji portovi objekt treba koristiti za slanje poruka na LCD kada koristimo njihove funkcije.

Sada moramo deklarirati varijable stavljanjem sljedećeg bita koda ispod deklaracija objekta:

// ove varijable su opcije koje možete promijeniti - veći brojevi = veća brzina igre upint intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// postavljanje varijabli za gameboolean bolPlay; // prati ako je igrač int intScore; // prati rezultat igrača int intDiff; // samo estetska stvar za reći na kakvoj je poteškoći igra // postavljanje varijabli za unos int intEnter; // prati ako korisnik pritisne tipku enter int intInput; // prati koje tipke korisnik pritisne boolean bolTilePressed; // osigurati da igrač slučajno ne pritisne gumb 5x i izgubi // postavlja varijable za turn int intTick; // broji milione (po petlji) do intDelay int intDelay; // vrijeme čekanja programa do sljedećeg zavoja u milisima int intGameSpeed; // abit of debug options boolean bolSerialBoard; // kada je true, ploča će se ispisati u serijskom monitoru

Varijablu deklariramo navođenjem tipa podataka, a zatim imenom varijable, npr. int thisIsAnInteger

Logičke varijable, kao što su bolSerialBoard i bolPlay, mogu imati samo jednu od dvije vrijednosti, true ili false.

Cijela varijabla (int) kao što su intScore i intInput mogu uzeti cijele brojeve kao vrijednosti, poput 1, 5 ili 100.

Neki drugi značajni tipovi podataka koje ovdje ne koristimo su niz, koji je komad teksta, i float, koji je decimalni broj.

Svaka od varijabli ovdje se koristi na nekoliko različitih mjesta u programu, evo sinopsisa onoga što svaka od njih radi

bolPlay govori programu treba li se prikazati izbornik ili treba li se igrati stvarna igra.

intScore prati rezultat igrača dok je pogađao pločice, intDiff se koristi u glavnom izborniku kako bi rekao programu koji dio teksta treba ispisati na LCD -u, intEnter se koristi za javljanje programu ako je pritisnuta tipka za unos (krajnje lijevo), intInput se koristi kako bi rekao programu koja je od ostale 4 tipke pritisnuta.

bolTilePressed se koristi kako bi se osiguralo da program čita samo kada je gumb pritisnut, a ne i kada ga držite.

intGameSpeed, intGameSpeedEasy, intGameSpeedMedium i intGameSpeedHard koriste se za kontrolu brzine igre koja bi se trebala ubrzati na temelju odabrane težine.

intTick i intDelay koriste se za zaustavljanje programa pri pomicanju ploče svaki put kad se petlja.

bolSerialBoard koristi se kako bi vam omogućio da program pošalje ploču na arduinov serijski monitor kao niz brojeva za potrebe testiranja.

Konačno je vrijeme da našu ploču proglasimo nizom pomoću ovog koda:

// postavljanje niza igara 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}};

Niz je matrica koja označava bilo koju točku na kojoj se matematika može pozvati ili promijeniti.

Vaš bi kod sada trebao izgledati otprilike ovako;

// uključuje knjižnice#include

// ove varijable su opcije koje možete promijeniti - veći brojevi = brže ubrzanje igre

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

// Definiranje pinova

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

// izrada LCD objekata (n, ~, n, ~, ~, n)

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

// postavljanje polja igara

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}};

// postavljanje varijabli za igru

boolean bolPlay; // prati ako je igrač int intScore; // prati rezultat igrača int intDiff; // samo estetska stvar koja govori na kakvoj je poteškoći igra

// postavljanje varijabli za unos

int intEnter; // prati ako korisnik pritisne tipku enter int intInput; // prati koje tipke korisnik pritisne boolean bolTilePressed; // osigurati da igrač slučajno ne pritisne gumb 5x i izgubi

// postavljanje varijabli za skretanje

int intTick; // broji milione (po petlji) do intDelay int intDelay; // vrijeme čekanja programa do sljedećeg zavoja u milisima int intGameSpeed;

// abit mogućnosti otklanjanja pogrešaka

boolean bolSerialBoard; // kada je true, ploča će se ispisati u serijskom monitoru

Korak 3: Funkcija postavljanja

Petlja postavljanja funkcija je koju arduino čita samo jednom pri pokretanju.

U petlji za postavljanje samo postavljamo vrijednosti nekoliko naših varijabli jer umjesto da ih postavljamo kao vrijednost pri njihovom proglašavanju, to radimo ovdje.

Započnite stavljanjem ovog koda u svoj Void Setup.

bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium;

Svaki redak samo postavlja varijablu na vrijednost.

bolPlay je postavljen na false tako da se igra ne počinje igrati.

intScore je postavljen na 0 jer vaš rezultat naravno počinje s 0.

intTick počinje s 0 jer program trenutno ne broji ništa.

intDelay je postavljen na 1000 jer je to stopa kojom pločice počinju.

intDiff je samo asketska stvar tako da program zna što napisati za poteškoće u igri.

intGameSpeed je postavljen na bilo koji intGameSpeedMedium, što znači da je postavljen na srednjoj težini.

Zatim stavite ovaj kôd u Postavljanje praznina ispod koda koji ste upravo unijeli.

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

Serial.begin (9600);

Ovo govori arduinu da počne komunicirati s računalom putem serijskog monitora (vidljivo klikom na gumb u gornjem desnom kutu arduino IDE -a).

Vaša bi postavka Void sada trebala izgledati otprilike ovako!

void setup () {Serial.begin (9600); // pokretanje serijskog monitora // postavljanje varijabli bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // započinjemo lcd -ov lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

Korak 4: Funkcija petlje

Funkciju petlje arduino izvodi svakom iteracijom arduina.

Kopirajte sljedeći kôd u svoju Void petlju.

void loop () {input (); // provjeravamo igra li se input if (bolPlay == true) {if (intTick> = intDelay) {// provjeravamo treba li igra odigrati potez ili nastaviti čekati Serial.println ("~~~~~~~ ~~ "); // ispis za označavanje kretanja ploče // writeSerial (); // ako je opcija omogućena, upišite ploču u serijske tipkeGame (); // provjeravamo unose igrača playBoard (); // premjestiti ploču i dodati novu pločicu clearLcd (); // očistite LCD -ove prije crtanja drawBoard (); // nacrtajte ploču na donji dio lcd -aCheck (); intTick = 0; // resetiranje intTick} else {buttonsGame (); // provjeravamo unose igrača player clearLcd (); // očistite LCD -ove prije crtanja drawBoard (); // nacrtajte ploču na lcd -ovom intTick = intTick + intGameSpeed; // dodaj kvačici}} else {clearLcd (); // očistiti LCD -ove prije iscrtavanja naslova (); // prikaz naslova i rezultata info gumbiMenu (); // čitanje unosa playera clearBoard (); // osigurati cijelu ploču = 0} kašnjenje (10); // odgoditi arduino za kratki trenutak}

kada je bolPlay jednako true, to znači da se igra i svi kodovi za vrijeme igranja trebaju biti pokrenuti, ali samo želimo da ploča doda novu pločicu i pomakne se prema dolje kada je intTick veći od našeg intDelay, u protivnom i dalje želimo dopustiti korisniku da pritisne gumb kako bi pogodio pločicu i da intTick poveća brzinu.

Većina ovog koda koristi funkcije koje tek trebamo izraditi, a mi ćemo ih napraviti u sljedećim koracima. Svrha ovih funkcija je sljedeća.

Unos čita tipke koje je korisnik pritisnuo.

buttonGame kontrolira rad gumba u igri, a ne u izborniku

playBoard dodaje novu pločicu na ploču, a zatim pomiče sve na ploči za jedan razmak

clearLCD čisti LCD -e kako bi se pobrinuo da ne ostanu duhovi iza pločica

drawBoard prolazi kroz arrGame i ispisuje ga na LCD -u

clearBoard briše cijelu arrGame kada igra nije u igri

bottomCheck provjerava da li dno arrGame ima greške

title prikazuje naslov igre i podatke o rezultatima kada se nalazi na izborniku

Izbornici gumba kontroliraju što unosi korisnika rade u izborniku.

gameOver je još jedna funkcija, iako se ovdje ne poziva jer se umjesto toga poziva u funkcijama bottomCheck i buttonsGame.

Korak 5: Funkcija ClearLCD

za stvaranje funkcije započinjemo dodavanjem ovoga kodu

void functionName () {

}

"functionName" može biti bilo što, sve dok već ne postoji.

Kopirajte ovaj kôd u svoj program:

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 (""); }}}

ovo prolazi kroz cijeli niz pomoću 2 odbrojane petlje za prolazak kroz svaku točku na LCD -ima i upis razmaka.

Bez poništavanja na ništa, LCD će zadržati sve što je prethodno napisano

Korak 6: Funkcija DrawBoard

kopirajte ovaj kôd u svoj program

void drawBoard () {for (int i = 1; i <= 15; i ++) {// nacrtajte dogovore 1 i 2 na lijevom LCD -u // ako je pločica = 0 ništa ne napišite, = 1 upišite "#", = 2 upišite "@" lcdLeft.setCursor (i, 1); // postavljeno na prvi stupac (krajnje lijevo) if (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // postavljeno na drugi stupac (ulijevo u sredini) if (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // postavljeno na treći stupac (desno u sredini) if (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // postavljeno na četvrti stupac (najdalje desno) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.write ("@");}}}

ovo koristi petlju za prolazak kroz svaki redak ploče, a zatim provjerava je li bilo koji stupac u retku jednak 1 ili 2, na temelju toga zatim ispisuje na LCD -u bilo hashtag, za pločicu koja tek treba biti hit, ili @ za hit pločicu.

Korak 7: Funkcija PlayBoard

kopirajte ovaj kôd u svoj program.

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // očisti gornji red arrGame [0] [random (0, 4)] = 1; // postavljamo slučajnu točku u gornjem retku kao pločicu (int i = 15; i> = 1; i-) {// koja radi od dna ploče do vrha za (int ii = 0; ii <= 3; ii ++) {// za svaki collum arrGame [ii] = arrGame [i - 1] [ii]; }}}

ovaj kôd započinje brisanjem cijelog gornjeg retka na 0 ili bez pločice, a zatim postavlja jednu slučajnu pločicu na 1 i poništava pločicu.

Zatim prolazi kroz prebrojanu petlju unatrag, od 15 do 1, postavljajući red na jednak onoliko koliko je redak iznad njega jednak, čineći da se ploča pomakne prema dolje LCD -a

Korak 8: Funkcija ClearBoard

kopirajte ovaj kôd u svoj program.

void clearBoard () {// resetiranje vrijednosti klika i kašnjenja intTick = 0; intDelay = 1000; // prođite kroz ploču i postavite sve na 0 za (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

Ovaj kôd se pokreće kada se igra ne igra kako bi se provjerilo da li je cijela arrGame postavljena na 0 ili bez pločica, koristeći prebrojane petlje za prolazak kroz niz.

Kod također poništava vrijednosti intDelay i intTick.

Korak 9: Naslovna funkcija

kopirajte sljedeći kôd u svoj program

void title () {// upis naslova na LCD i prostor za rezultat lcdRight.setCursor (0, 0); lcdRight.write ("Piano Tiles"); lcdRight.setCursor (0, 1); lcdRight.write ("Bodovi:"); // pretvoriti rezultat u niz char strScore [3]; sprintf (strScore, "%d", intScore); // prikaz rezultata na LCD -u lcdRight.write (strScore); // dodamo teškoće lcdRight.setCursor (10, 1); if (intDiff == 0) {lcdRight.write ("Lako"); } if (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Hard"); } // Pritisnite malo upute lcdLeft.setCursor (0, 0); lcdLeft.write ("Pritisnite Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("za početak!"); }

Ovaj kôd zapisuje naslov igre i rezultat na LCD -e, to radi govoreći LCD -u gdje treba početi tipkati pomoću LCD.setCursor, a zatim zapisuje niz u LCD.write.

Ovdje se također stvara nova varijabla, strScore, koristi se za pretvaranje intScore u niz podataka ili niz podataka pomoću funkcije sprintf.

intDiff se također koristi ovdje, na temelju svojih vrijednosti ispisuje različite opcije težine.

Korak 10: Funkcija izbornika ButtonsMenu

umetnite sljedeći kôd u svoj program

void buttonsMenu () {// kada se pritisne enter, započnite igru i poništite vrijednost rezultata ako (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // kada se pritisne tipka 3, uključite opciju ispravljanja ispisa ploče serijski if (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serijska ploča aktivna"); bolSerialBoard = true; } else {Serial.println ("Serijska ploča onemogućena"); bolSerialBoard = false; }} // brzinu igre postavite na laku poteškoću if (intInput == 0) {Serial.print ("Igra je postavljena na easy ("); Serial.print (intGameSpeedEasy); Serial.println ("ms ubrzanje)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // brzinu igre postavite na srednju težinu if (intInput == 1) {Serial.print ("Igra je postavljena na srednju ("); Serial.print (intGameSpeedMedium); Serial.println ("ms ubrzanje)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // brzinu igre postavite na tešku poteškoću if (intInput == 2) {Serial.print ("Igra je postavljena na tvrdu ("); Serial.print (intGameSpeedHard); Serial.println ("ms ubrzanje)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

ovaj kôd se pokreće samo ako je bolPlay jednako false u praznoj petlji

ako je intEnter postavljeno na 1, to znači da je tipka enter pritisnuta, ako je pritisnuta, program postavlja bolPlay na true i igra počinje.

Program tada čita čemu je intInput jednak. ako je jednako 0, prva tipka s lijeve strane se pritisne, ide gore do 3. Ako je intInput jednak 4, ne pritiska se tipka.

ako se pritisnu gumbi 0-2 igra mijenja težinu, također prilagođavajući vrijednost brzine igre, što znači da će se ubrzati brže.

ako se pritisne tipka 3 igra će aktivirati ili deaktivirati način otklanjanja pogrešaka gdje se cijela ploča ispisuje na serijskom monitoru kako bi se pomoglo u pronalaženju problema u programu.

Korak 11: Funkcija igre ButtonsGame

kopirajte sljedeći kôd u svoj program

void buttonsGame () {if (intInput! = 4) {// ako je gumb pritisnut if (bolTilePressed == false) {// samo ako je bolTilePressed lažna akcija okidača za provjeru gumba pritisnite bolTilePressed = true; // zatim postavite bolTilePressed na true kako biste bili sigurni da se ne aktivira ponovo akcidilly int intLowestTile = 0; // postavlja se na pločicu s najnižom pločicom int intCheckedTile = 15; // za praćenje koje su pločice provjerene while (intLowestTile == 0) {// sve dok nije postavljeno na bilo što provjerava pločice (int i = 0; i 100) {// sve dok je int kašnjenje nije manje od 100 intDelay = intDelay - 20; // preuzimamo vrijednost iz nje}} else {Serial.println ("Pogrešno pritisnuta tipka"); igra je gotova(); // u protivnom igra je gotova}}}}}

Kôd se pokreće samo ako je bolPlay jednako true u void petlji.

Kao i gumbiMenu na temelju vrijednosti intInput provjerava je li igrač pogodio pločicu ili je propustio.

To čini prolaskom kroz arrGame odozdo prema gore pomoću while petlje za traženje redaka koji je najniži s otkrivenom pločicom. Zatim provjerava je li mjesto u tom retku koje odgovara pritisnutom gumbu nepotpuna pločica ili nije, ako je nepotpuno postavlja ga na jednako 2 umjesto 1, što znači da će se prikazati kao @, u protivnom pokreće igru Over funkciju koju tek trebamo stvoriti.

Ova funkcija također koristi varijablu bolTilePressed postavljajući je na true kada je gumb pritisnut i false ako nijedan gumb nije pritisnut. Time se želi osigurati da korisnik slučajno ne izgubi igru jer je program mislio da su pritisnuli tipku više puta kad su je držali pritisnutu.

Korak 12: Funkcija GameOver

Kopirajte sljedeći kôd u svoj program

void gameOver () {Serial.println ("Igra je završena!"); Serial.print ("Vaš rezultat je bio:"); Serial.println (intScore); Serial.print ("Vaša brzina je bila:"); Serial.println (intDelay); bolPlay = false; }

To se aktivira funkcijama checkBottom ili buttonGame i aktivira kraj igre postavljanjem bolPlay na false.

Također ispisuje poruku na serijski monitor radi ocjene korisnika, a pločice brzine dodane su u milisekundama.

Korak 13: Ulazna funkcija

Kopirajte sljedeći kôd u svoj program.

void input () {intEnter = digitalRead (btnEnter); // čitanje unos // čitanje koji od ostalih ulaza, ili ako nijedan nije postavljen na 4 if (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; }}}} // serijski ispis ulaza if (intEnter == 1) {Serial.println ("Enter Presssed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// ako se ne pritisne nijedan gumb reset bolTilePressed bolTilePressed = false; }}

Ovaj se kôd koristi s funkcijama gumbiIgra i gumbiMeni. na temelju gumba koje je korisnik pritisnuo postavlja vrijednost intInput ili ako nije pritisnuta nijedna tipka postavlja intInput na 4.

Ako nije pritisnuta nijedna tipka, ovdje se bolTilePressed resetira za funkcije buttonGame.

Također ispisuje poruku serijskom monitoru na kojem je pritisnuta tipka.

Korak 14: Funkcija BottomCheck

kopirajte sljedeći kôd u svoj program.

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// za 4 stupca if (arrGame [15] == 1) {// ako je pločica na dnu Serial.println ("Pločica na dnu"); arrGame [15] = 2; drawBoard (); kašnjenje (400); arrGame [15] = 1; drawBoard (); kašnjenje (400); arrGame [15] = 2; drawBoard (); kašnjenje (400); arrGame [15] = 1; drawBoard (); kašnjenje (400); igra je gotova(); }}}

pomoću petlje ovaj kôd provjerava ima li u donjem retku arrGame skrivenih pločica (pločice jednake 1), ako postoji unhit pločica pri dnu zaslona, bljeskat će pločicu, a zatim pokrenuti igru preko funkcije.

Korak 15: Funkcija WriteSerial

kopirajte sljedeći kôd u svoj program

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 (","); } Serial.println (""); }}}

Ovo je funkcija koju prati opcija otklanjanja pogrešaka koja se može omogućiti u funkciji gumbiMeni. Ako je bolSerialBoard postavljen na true u toj funkciji, proći će kroz arrGame i ispisati cijelu ploču u serijski monitor radi testiranja pomoću niza.

Korak 16: Dovršetak

Završetak!
Završetak!

Sav vaš kôd ne bi trebao biti potpun i izgledati ovako!

/ * * Naziv - Piano Piano; Arduino * Autor - Domenic Marulli * Datum - 11/ *

/ uključi knjižnice

#uključi

// ove varijable su opcije koje možete promijeniti - veći brojevi = brže ubrzanje igre

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

// Definiranje pinova

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

// izrada LCD objekata (n, ~, n, ~, ~, n)

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

// postavljanje polja igara

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}};

// postavljanje varijabli za igru

boolean bolPlay; // prati ako je igrač int intScore; // prati rezultat igrača int intDiff; // samo estetska stvar koja govori na kakvoj je poteškoći igra

// postavljanje varijabli za unos

int intEnter; // prati ako korisnik pritisne tipku enter int intInput; // prati koje tipke korisnik pritisne boolean bolTilePressed; // osigurati da igrač slučajno ne pritisne gumb 5x i izgubi

// postavljanje varijabli za skretanje

int intTick; // broji milione (po petlji) do intDelay int intDelay; // vrijeme čekanja programa do sljedećeg zavoja u milisima int intGameSpeed;

// abit mogućnosti otklanjanja pogrešaka

boolean bolSerialBoard; // kada je true, ploča će se ispisati u serijskom monitoru

// postavljanje koje će se jednom pokrenuti

void setup () {Serial.begin (9600); // pokretanje serijskog monitora // postavljanje varijabli bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // započinjemo lcd -ov lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

// petlja koja će se izvoditi svakih 10 milisekona

void loop () {input (); // provjeravamo igra li se input if (bolPlay == true) {if (intTick> = intDelay) {// provjeravamo treba li igra odigrati potez ili nastaviti čekati Serial.println ("~~~~~~~ ~~ "); // ispis za označavanje kretanja ploče // writeSerial (); // ako je opcija omogućena, upišite ploču u serijske tipkeGame (); // provjeravamo unose igrača playBoard (); // premjestiti ploču i dodati novu pločicu clearLcd (); // očistite LCD -ove prije crtanja drawBoard (); // nacrtajte ploču na donji dio lcd -aCheck (); intTick = 0; // resetiranje intTick} else {buttonsGame (); // provjeravamo unose igrača player clearLcd (); // očistite LCD -ove prije crtanja drawBoard (); // nacrtajte ploču na lcd -ovom intTick = intTick + intGameSpeed; // dodaj kvačici}} else {clearLcd (); // očistiti LCD -ove prije iscrtavanja naslova (); // prikaz naslova i rezultata info gumbiMenu (); // čitanje unosa playera clearBoard (); // osigurati cijelu ploču = 0} kašnjenje (10); // odgoditi arduino za kratki trenutak}

// čisti LCD, tako da sve unete ćelije nisu ostavljene

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 (""); }}}

// izvlači ploču na LCD

void drawBoard () {for (int i = 1; i <= 15; i ++) {// nacrtajte dogovore 1 i 2 na lijevom LCD -u // ako je pločica = 0 ništa ne napišite, = 1 upišite "#", = 2 upišite "@" lcdLeft.setCursor (i, 1); // postavljeno na prvi stupac (krajnje lijevo) if (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // postavljeno na drugi stupac (ulijevo u sredini) if (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // postavljeno na treći stupac (desno u sredini) if (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // postavljeno na četvrti stupac (najdalje desno) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.write ("@");}}}

// pomiče ploču prema dolje i postavlja slučajnu vrijednost kao pločicu

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // očisti gornji red arrGame [0] [random (0, 4)] = 1; // postavljamo slučajnu točku u gornjem retku kao pločicu (int i = 15; i> = 1; i-) {// koja radi od dna ploče do vrha za (int ii = 0; ii <= 3; ii ++) {// za svaki collum arrGame [ii] = arrGame [i - 1] [ii]; }}}

// postavlja cijelu ploču na 0 i vraća varijable na predigru

void clearBoard () {// resetiranje vrijednosti klika i kašnjenja intTick = 0; intDelay = 1000; // prođite kroz ploču i postavite sve na 0 za (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

// prikazuje glavni izbornik na LCD -u

void title () {// upis naslova na LCD i prostor za rezultat lcdRight.setCursor (0, 0); lcdRight.write ("Piano Tiles"); lcdRight.setCursor (0, 1); lcdRight.write ("Bodovi:"); // pretvoriti rezultat u niz char strScore [3]; sprintf (strScore, "%d", intScore); // prikaz rezultata na LCD -u lcdRight.write (strScore); // dodamo teškoće lcdRight.setCursor (10, 1); if (intDiff == 0) {lcdRight.write ("Lako"); } if (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Hard"); } // Pritisnite malo upute lcdLeft.setCursor (0, 0); lcdLeft.write ("Pritisnite Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("za početak!"); }

// provjerava gumbe i što učiniti s njima dok je izvan igre

void buttonsMenu () {// kada se pritisne enter, započnite igru i poništite vrijednost rezultata ako (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // kada se pritisne tipka 3, uključite opciju ispravljanja ispisa ploče serijski if (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serijska ploča aktivna"); bolSerialBoard = true; } else {Serial.println ("Serijska ploča onemogućena"); bolSerialBoard = false; }} // brzinu igre postavite na laku poteškoću if (intInput == 0) {Serial.print ("Igra je postavljena na easy ("); Serial.print (intGameSpeedEasy); Serial.println ("ms ubrzanje)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // brzinu igre postavite na srednju težinu if (intInput == 1) {Serial.print ("Igra je postavljena na srednju ("); Serial.print (intGameSpeedMedium); Serial.println ("ms ubrzanje)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // brzinu igre postavite na tešku poteškoću if (intInput == 2) {Serial.print ("Igra je postavljena na tvrdu ("); Serial.print (intGameSpeedHard); Serial.println ("ms ubrzanje)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

// provjerava gumbe i što učiniti s njima tijekom igre

void buttonsGame () {if (intInput! = 4) {// ako je gumb pritisnut if (bolTilePressed == false) {// samo ako je bolTilePressed lažna radnja okidača za provjeru gumba pritisnite bolTilePressed = true; // zatim postavite bolTilePressed na true kako biste bili sigurni da se ne aktivira ponovo akcidilly int intLowestTile = 0; // postavlja se na pločicu s najnižom pločicom int intCheckedTile = 15; // za praćenje koje su pločice provjerene while (intLowestTile == 0) {// sve dok nije postavljeno na bilo što provjerava pločice (int i = 0; i 100) {// sve dok je int kašnjenje nije manje od 100 intDelay = intDelay - 20; // preuzimamo vrijednost iz nje}} else {Serial.println ("Pogrešno pritisnuta tipka"); igra je gotova(); // u protivnom igra je gotova}}}}}

void gameOver () {

Serial.println ("Igra je završena!"); Serial.print ("Vaš rezultat je bio:"); Serial.println (intScore); Serial.print ("Vaša brzina je bila:"); Serial.println (intDelay); bolPlay = false; }

// provjerava unos igrača

void input () {intEnter = digitalRead (btnEnter); // čitanje unos // čitanje koji od ostalih ulaza, ili ako nijedan nije postavljen na 4 if (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; }}}} // serijski ispis ulaza if (intEnter == 1) {Serial.println ("Enter Presssed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// ako se ne pritisne nijedan gumb reset bolTilePressed bolTilePressed = false; }}

// provjerava greške na dnu ploče

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// za 4 stupca if (arrGame [15] == 1) {// ako je pločica na dnu Serial.println ("Pločica na dnu"); arrGame [15] = 2; drawBoard (); kašnjenje (400); arrGame [15] = 1; drawBoard (); kašnjenje (400); arrGame [15] = 2; drawBoard (); kašnjenje (400); arrGame [15] = 1; drawBoard (); kašnjenje (400); igra je gotova(); }}}

// ispisuje ploču na serijski monitor ako je bolSerialBoard istina

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 (","); } Serial.println (""); }}}

Nakon što unesete sav kôd, prenesite ga na svoj arduino i uživajte!

Preporučeni: