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, Juli
Anonim
Arduino - Piano Tiles
Arduino - Piano Tiles

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 za LCD tastaturu (19 USD svaki)

Dugmad 5x

5x 220Ω otpornika

28x žice

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, Uvjerite se da su gumbi pravilno povezani, s utorima A0-4 na prizemnoj strani držača za gumbe, 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:

#include

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 tipke 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 kada unesemo btn1 arduino će 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 portovi 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);

Ono što ovo radi govori arduinu da kada pozovemo 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 koja govori na kakvim je poteškoćama igra // postavlja varijable 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 dugme 5x i izgubi // postaviti varijable za turn int intTick; // broji milione (po petlji) do intDelay int intDelay; // vrijeme čekanja programa do sljedećeg zaokreta u milisima int intGameSpeed; // abit of debug options boolean bolSerialBoard; // kada je true, štampaće ploču na serijskom monitoru

Deklariramo varijablu navodeći tip podataka, a zatim ime varijable, npr. int thisIsAnInteger

Logičke varijable, poput 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 da li treba da se prikaže meni ili da se igra pokrene.

intScore prati rezultat igrača dok je pogađao pločice, intDiff se koristi u glavnom meniju kako bi rekao programu koji dio teksta treba odštampati na LCD -u, intEnter se koristi za obaveštavanje programa ako je pritisnuto dugme za unos (krajnje levo), intInput se koristi da kaže programu koje od ostala 4 dugmeta je pritisnuto.

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

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

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

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

Konačno je vrijeme da našu ploču proglasimo za niz 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, 0, 0}};

Niz je matrica koja označava bilo koju tačku na kojoj se može pozvati radi matematike ili se može promeniti.

Vaš kôd bi sada trebao izgledati otprilike ovako;

// uključuje biblioteke#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 btnUnesite A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

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

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

// postavljanje niza igara

int arrGame [16] [4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {101} {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 dugme 5x i izgubi

// postavljanje varijabli za turn

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

// abit opcija za otklanjanje grešaka

boolean bolSerialBoard; // kada je true, štampaće ploču na serijskom monitoru

Korak 3: Funkcija postavljanja

Petlja za postavljanje je funkcija 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 prilikom njihovog objavljivanja, to radimo ovdje.

Započnite stavljanjem ovog koda u svoj Void Setup.

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

Svaka linija samo postavlja varijablu na vrijednost.

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

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

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

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

intDiff je samo asketska stvar tako da program zna šta treba 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 započne komunikaciju s računarom putem serijskog monitora (vidljivo klikom na gumb u gornjem desnom kutu arduino IDE -a).

Vaša postavka Void sada bi 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 pokreće svaku iteraciju arduina.

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

void loop () {input (); // provjeravamo da li se igra unos 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 dugmadGame (); // provjeravamo unose igrača playBoard (); // premjestiti ploču i dodati novu pločicu clearLcd (); // očistiti LCD -ove prije crtanja drawBoard (); // iscrtajte ploču na dc -u bottomCheck (); intTick = 0; // resetiranje intTick} else {buttonsGame (); // provjeravamo ima li ulaza igrača clearLcd (); // očistite LCD -ove prije crtanja drawBoard (); // nacrtajte ploču na lcd -ovom intTick = intTick + intGameSpeed; // dodaj u oznaku}} else {clearLcd (); // očistiti LCD -ove prije iscrtavanja naslova (); // prikaz naslova i info dugmadiMenu (); // čita unos playera clearBoard (); // osigurati cijelu ploču = 0} kašnjenje (10); // odgodimo 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 dugme da udari u 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 kontroliše šta tasteri rade dok su u igri, a ne u meniju

playBoard dodaje novu ploču 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 je dno arrGame u kvaru

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

Meni dugmadi kontroliše šta unosi korisnika rade u meniju.

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

Korak 5: Funkcija ClearLCD

da bismo stvorili funkciju 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 koristeći 2 odbrojane petlje za prolazak kroz svaku točku na LCD -ima i upis razmaka.

Bez vraćanja na ništa, LCD -i ć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); // postavlja se na drugi stupac (lijevo u sredini) if (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // postavljeno na treći stupac (desno desno) 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.pisati("@");} } }

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

Korak 7: Funkcija PlayBoard

kopirajte ovaj kôd u svoj program.

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // obriši gornji red arrGame [0] [random (0, 4)] = 1; // postavljamo slučajnu tačku u gornjem redu za 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 reda 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 u obrnutom smjeru, od 15 do 1, postavljajući red na jednako 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 osiguralo da je cijela arrGame postavljena na 0 ili bez pločica, koristeći prebrojane petlje za prolazak kroz niz.

Kod također resetira 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 ("Score:"); // pretvara 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 instrukcije 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 da počne pisati pomoću LCD.setCursor, a zatim upisuje niz u LCD.write.

Nova varijabla je također stvorena ovdje, strScore, koristi se za pretvaranje intScore u niz podataka ili niz podataka pomoću funkcije sprintf.

ovdje se koristi i intDiff, na osnovu svojih vrijednosti ispisuje različite opcije težine.

Korak 10: Funkcija menija Buttons

umetnite sljedeći kôd u svoj program

void buttonsMenu () {// kada se pritisne enter započne igru i poništi vrijednost rezultata ako (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // kada se pritisne dugme 3, uključite opciju otklanjanja grešaka za štampanje 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; } // postavite brzinu igre na srednju težinu if (intInput == 1) {Serial.print ("Igra je postavljena na medium ("); Serial.print (intGameSpeedMedium); Serial.println ("ms ubrzanje)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // postavite brzinu igre 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 void 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, prvo dugme s lijeve strane se pritisne, ide gore do 3. Ako je intInput jednako 4, ne pritiska se dugme.

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 grešaka gdje se cijela ploča ispisuje na serijskom monitoru radi lakšeg pronalaženja problema u programu.

Korak 11: Funkcija ButtonsGame

kopirajte sljedeći kôd u svoj program

void buttonsGame () {if (intInput! = 4) {// ako je dugme pritisnuto if (bolTilePressed == false) {// samo ako je bolTilePressed lažna radnja okidača za proveru dugmeta 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 sa najnižom pločicom int intCheckedTile = 15; // da pratimo koje su pločice provjerene dok (intLowestTile == 0) {// sve dok nije postavljeno na bilo šta 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 pritisnuto dugme"); gameOver (); // u protivnom igra je gotova}}}}}

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

Kao i gumbiMenu na osnovu vrijednosti intInput provjerava je li igrač pogodio pločicu ili je promašio.

To se postiže prolaskom kroz arrGame odozdo prema gore pomoću while petlje za traženje reda koji je najniži sa unhit pločicom. Zatim provjerava je li mjesto u tom retku koje odgovara pritisnutom gumbu unhit tile ili nije, ako je unhit 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 dugme pritisnuto i false ako nijedno dugme nije pritisnuto. Ovo služi kako bi se osiguralo da korisnik slučajno ne izgubi igru jer je program mislio da su pritisnuli dugme više puta kada su ga držali pritisnutog.

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

Ovo se pokreće funkcijama checkBottom ili buttonGame i pokreće kraj igre postavljanjem bolPlay na false.

On također ispisuje poruku na serijskom monitoru radi ocjene korisnika, a brzinske pločice dodane su u milisekundama.

Korak 13: Ulazna funkcija

Kopirajte sljedeći kôd u svoj program.

void input () {intEnter = digitalRead (btnEnter); // čitaj enter // čita 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 Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// ako se ne pritisne nijedno dugme reset bolTilePressed bolTilePressed = false; }}

Ovaj kôd se koristi sa funkcijama tasteraIgra i dugmićiMeni. na osnovu dugmadi koje je korisnik pritisnuo postavlja vrijednost intInput ili ako nije pritisnuto nijedno dugme postavlja intInput na 4.

Ako se ne pritisne nijedno dugme, ovdje se bolTilePressed resetira za funkciju dugmeta Igra.

Takođe štampa poruku na serijskom monitoru na kojem je pritisnuto dugme.

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

pomoću petlje ovaj kôd provjerava ima li donji red arrGame -a ima li nepokrivenih pločica (pločice jednake 1), ako postoji unhit pločica pri dnu ekrana, bljeskat će pločicu, a zatim pokrenuti funkciju preko igre.

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 grešaka koja se može omogućiti u funkciji dugmićiMeni. Ako je bolSerialBoard postavljen na true u toj funkciji, on će proći kroz arrGame i ispisati cijelu ploču u serijski monitor radi testiranja pomoću niza.

Korak 16: Završetak

Završetak!
Završetak!

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

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

/ uključi biblioteke

#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 btnUnesite A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

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

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

// postavljanje niza igara

int arrGame [16] [4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {101} {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 dugme 5x i izgubi

// postavljanje varijabli za turn

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

// abit opcija za otklanjanje grešaka

boolean bolSerialBoard; // kada je true, štampaće ploču na 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 da li se igra unos 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 dugmadGame (); // provjeravamo unose igrača playBoard (); // premjestiti ploču i dodati novu pločicu clearLcd (); // očistite LCD -ove prije crtanja drawBoard (); // iscrtajte ploču na dc -u bottomCheck (); intTick = 0; // resetiranje intTick} else {buttonsGame (); // provjeravamo ima li ulaza igrača clearLcd (); // očistite LCD -ove prije crtanja drawBoard (); // nacrtajte ploču na lcd -ovom intTick = intTick + intGameSpeed; // dodaj u oznaku}} else {clearLcd (); // očistiti LCD -ove prije iscrtavanja naslova (); // prikaz naslova i info dugmadiMenu (); // čita unos playera clearBoard (); // osigurati cijelu ploču = 0} kašnjenje (10); // odgodimo arduino za kratki trenutak}

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

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 -ove

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); // postavlja se na drugi stupac (lijevo u sredini) if (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // postavljeno na treći stupac (desno desno) 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.pisati("@");} } }

// 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;} // obriši gornji red arrGame [0] [random (0, 4)] = 1; // postavljamo slučajnu tačku u gornjem redu za 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 meni 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 ("Score:"); // pretvara 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 instrukcije 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čne igru i poništi vrijednost rezultata ako (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // kada se pritisne dugme 3, uključite opciju otklanjanja grešaka za štampanje 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; } // postavite brzinu igre na srednju težinu if (intInput == 1) {Serial.print ("Igra je postavljena na medium ("); Serial.print (intGameSpeedMedium); Serial.println ("ms ubrzanje)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // postavite brzinu igre 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 dok ste u igri

void buttonsGame () {if (intInput! = 4) {// ako je dugme pritisnuto if (bolTilePressed == false) {// samo ako je bolTilePressed lažna radnja okidača za proveru dugmeta 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 sa najnižom pločicom int intCheckedTile = 15; // da pratimo koje su pločice provjerene dok (intLowestTile == 0) {// sve dok nije postavljeno na bilo šta 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 pritisnuto dugme"); gameOver (); // 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); // čitaj enter // čita 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 Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// ako se ne pritisne nijedno dugme 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); gameOver (); }}}

// štampa ploču u 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, postavite ga na svoj arduino i uživajte!

Preporučuje se: