Satura rādītājs:

Arduino - klavieru flīzes: 16 soļi (ar attēliem)
Arduino - klavieru flīzes: 16 soļi (ar attēliem)

Video: Arduino - klavieru flīzes: 16 soļi (ar attēliem)

Video: Arduino - klavieru flīzes: 16 soļi (ar attēliem)
Video: Электронное пианино своими руками с помощью Arduino #шорты 2024, Jūlijs
Anonim
Arduino - klavieru flīzes
Arduino - klavieru flīzes

Sveiki, interneta ļaudis! Šis būs jautājums par to, kā padarīt to, kas PATIESI NAV mobilās spēles pārrāvums arduino uno r3.

lai sāktu, jums būs vajadzīgas visas detaļas, kas ir šādas! 1x Arduino Uno r3 (42 ASV dolāri)

2x LCD tastatūras vairogs (katrs 19 USD)

5x pogas

5x 220Ω rezistori

28x vadi

Labi, kad esat ieguvis visas detaļas, ir pienācis laiks sākt!

1. solis: Elektroinstalācija

Elektroinstalācija
Elektroinstalācija
Elektroinstalācija
Elektroinstalācija
Elektroinstalācija
Elektroinstalācija

Sāciet ar arduino un draugu pieslēgšanu, kā parādīts diagrammā, Pārliecinieties, vai pogas ir savienotas pareizi, un A0-4 spraugas pogu sliedes zemes pusē, pretējā gadījumā arduino domās, ka pogas tiek turētas pastāvīgi, nevis tikai nospiežot.

2. darbība. Deklarācijas paziņojumi

Visam kodam šeit vajadzētu būt pirms jūsu tukšuma iestatīšanas un tukšuma cilpas, jo visi šie mainīgie un objekti tiek izmantoti vairākās funkcijās, kuras mēs iestatīsim.

Sāciet, ievietojot:

#iekļaut

koda augšdaļā tas liek arduino izmantot bibliotēku "LiquidCrystal.h" un funkcijas, kas ir tās sastāvdaļa.

Nākamais solis ir definēt tapas, kuras mēs izmantojam savām pogām, ievietojot šo kodu zem mūsu #include:

#define btn Ievadiet A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

Mēs definējam terminus btnEnter un btn1 līdz btn 4, lai mums būtu vieglāk kodu nolasīt vai vajadzības gadījumā mainīt. Tas nozīmē, ka, ierakstot btn1, arduino zinās, ka mēs patiesībā domājam pogu 15. Lai gan mēs nosaucam ostas par portu 15, 16, 17 un 18, tās arduino ir apzīmētas kā A1 A2 A3 un A4, tāpēc tie ir porti, kurus izmanto īpaši analogām ieejām, lai gan mēs tos izmantojam tikai digitālajām ieejām.

Tālāk mēs izveidosim objektus, kas kontrolēs šķidro kristālu displejus. Lai to izdarītu, ievietojiet šo kodu zem mūsu definīcijas

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

Tas dara arduino, ka, zvanot lcdLeft vai lcdRight, mēs atsaucamies uz objektu LiquidCrystal. Skaitļi pievienotajās iekavās norāda arduino, kuras portus objektam vajadzētu izmantot, lai nosūtītu ziņojumus uz LCD, kad mēs izmantojam to funkcijas.

Tagad mums ir jādeklarē mainīgie, ievietojot nākamo koda bitu zem objektu deklarācijām:

// šie mainīgie ir iespējas, kuras varat mainīt - lielāki skaitļi = ātrāks spēles ātrums upint intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// iestatīt mainīgos spēles boolean bolPlay; // dziesmas, ja atskaņotājs int intScore; // izseko spēlētāja rezultātu int intDiff; // tikai estētiska lieta, lai pateiktu, ar kādām grūtībām spēle ir saistīta // iestatīt mainīgos ievadam int intEnter; // izseko, ja lietotājs nospiež ievadīšanas pogu int intInput; // izseko, kuras pogas lietotājs nospiež boolean bolTilePressed; // pārliecinieties, ka spēlētājs nejauši nenospiež pogu 5x un nepazaudē // iestatiet mainīgos turn int intTick; // saskaita milijas (vienā cilpā) līdz intDelay int intDelay; // laiks, kad programma gaida līdz nākamajam pagriezienam milis int intGameSpeed; // abit of debug options boolean bolSerialBoard; // kad true, izdrukās tāfeli sērijas monitorā

Mēs deklarējam mainīgo, norādot datu tipu un pēc tam mainīgā nosaukumu, piem. int thisIsAnInteger

Būla mainīgajiem, piemēram, bolSerialBoard un bolPlay, var būt tikai viena no divām vērtībām - patiesa vai nepatiesa.

Vesela skaitļa mainīgais (int), piemēram, intScore un intInput, var ņemt veselus skaitļus kā vērtības, piemēram, 1, 5 vai 100.

Daži citi ievērojami datu veidi, kurus mēs šeit neizmantojam, ir virkne, kas ir teksta daļa, un pludiņš, kas ir decimālskaitlis.

Katru no mainīgajiem šeit programma izmanto vairākās dažādās vietās, šeit ir kopsavilkums par katra darbību

bolPlay paziņo programmai, vai izvēlne ir jāparāda, vai arī jāsākas faktiskajai spēlei.

intScore izseko spēlētāja rezultātu, kad viņš sit pa flīzēm, intDiff tiek izmantots galvenajā izvēlnē, lai programmai pateiktu, kādu teksta daļu drukāt uz LCD displejiem, intEnter tiek izmantots, lai informētu programmu, ja ir nospiesta ievadīšanas poga (vistālāk pa kreisi), intInput tiek izmantots, lai programmai pateiktu, kura no pārējām 4 pogām ir nospiesta.

bolTilePressed tiek izmantots, lai pārliecinātos, ka programma tiek lasīta tikai tad, kad tiek nospiesta poga, nevis tad, kad tā tiek turēta.

intGameSpeed, intGameSpeedEasy, intGameSpeedMedium un intGameSpeedHard tiek izmantoti, lai kontrolētu, cik ātri spēlei vajadzētu paātrināties, pamatojoties uz izvēlētajām grūtībām.

intTick un intDelay tiek izmantoti, lai apturētu programmas kustību uz tāfeles katru reizi, kad tā cilpas.

bolSerialBoard tiek izmantots, lai ļautu programmai testēšanas nolūkos nosūtīt dēli uz arduino sērijas monitoru kā ciparu sēriju.

Beidzot ir pienācis laiks pasludināt mūsu dēli par masīvu, izmantojot šo kodu:

// iestatīt spēles masīvu 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}};

Masīvs ir matrica, kurā jebkuru punktu var izsaukt matemātikā vai mainīt.

Tagad jūsu kodam vajadzētu izskatīties apmēram šādi;

// iekļaut bibliotēkas#include

// šie mainīgie ir iespējas, kuras varat mainīt - lielāki skaitļi = ātrāka spēles paātrināšana

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

// Definējiet tapas

#define btn Ievadiet A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

// izveidot LCD objektus (n, ~, n, ~, ~, n)

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

// iestatīt spēļu masīvu

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

// iestatīt spēles mainīgos

Būla bolPlay; // dziesmas, ja atskaņotājs int intScore; // izseko spēlētāja rezultātu int intDiff; // tikai estētiska lieta, lai pateiktu, ar kādām grūtībām spēle ir saistīta

// iestatīt ievades mainīgos

int intEnter; // izseko, ja lietotājs nospiež ievadīšanas pogu int intInput; // izseko, kuras pogas lietotājs nospiež boolean bolTilePressed; // pārliecinieties, ka spēlētājs nejauši 5x nenospiež pogu un nezaudē

// iestatīt mainīgos pagriezienam

int intTick; // saskaita milijas (vienā cilpā) līdz intDelay int intDelay; // laiks, kad programma gaida līdz nākamajam pagriezienam milis int intGameSpeed;

// atkļūdošanas iespēju abit

Būla bolSerialBoard; // kad true, izdrukās tāfeli sērijas monitorā

3. darbība: iestatīšanas funkcija

Iestatīšanas cilpa ir funkcija, ko arduino lasa tikai vienu reizi, kad tā sākotnēji sākas.

Iestatīšanas ciklā mēs vienkārši iestatām dažu mūsu mainīgo vērtības, jo tā vietā, lai tos iestatītu, deklarējot, mēs to darām šeit.

Sāciet, ievietojot šo kodu savā Void Setup.

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

Katra rinda vienkārši nosaka mainīgo uz vērtību.

Lai spēle netiktu sākta, bolPlay ir iestatīts uz false.

intScore ir iestatīts uz 0, jo dabiski jūsu rezultāts sākas ar 0.

intTick sākas ar 0, jo programma pašlaik neko neskaita.

intDelay ir iestatīts uz 1000, jo tas ir flīžu sākuma ātrums.

intDiff ir tikai askētiska lieta, lai programma zinātu, ko rakstīt spēles grūtībām.

intGameSpeed ir iestatīts uz jebkuru intGameSpeedMedium, kas nozīmē, ka tas ir iestatīts uz vidējām grūtībām.

Pēc tam ievietojiet šo kodu tukšuma iestatījumos zem koda, kuru tikko ievietojāt.

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

Sērijas sākums (9600);

Tas liek arduino sākt sazināties ar datoru, izmantojot seriālo monitoru (redzams, noklikšķinot uz pogas arduino IDE augšējā labajā stūrī).

Tagad jūsu Void iestatījumam vajadzētu izskatīties apmēram šādi!

void setup () {Serial.begin (9600); // sākt sērijas monitoru // iestatīt mainīgos bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // sākt lcd lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

4. darbība: cilpas funkcija

Cilpas funkciju arduino vada katru arduino atkārtojumu.

Kopējiet šo kodu savā Void Loop.

void loop () {input (); // pārbaudiet, vai tiek ievadīta atskaņošanas ievade, ja (bolPlay == true) {if (intTick> = intDelay) {// pārbaudiet, vai spēlei vajadzētu spēlēt kārtu vai turpināt gaidīt Serial.println ("~~~~~~~ ~~ "); // drukāt, lai apzīmētu tāfeles virzību uz priekšu // writeSerial (); // ja opcija ir iespējota, rakstiet tāfeli sērijas pogāsGame (); // pārbaudīt atskaņotāja ievadi playBoard (); // pārvietot dēli un pievienot jaunu flīzi clearLcd (); // notīriet LCD pirms zīmēšanas drawBoard (); // uzzīmējiet tāfeli uz lcd apakšasCheck (); intTick = 0; // atiestatīt intTick} else {buttonsGame (); // pārbaudīt atskaņotāja ievadi clearLcd (); // notīriet LCD pirms zīmēšanas drawBoard (); // uzzīmējiet tāfeli uz LCD intTick = intTick + intGameSpeed; // pievienot ērcei}} else {clearLcd (); // pirms virsraksta zīmēšanas notīriet LCD (); // rādīt nosaukuma un rezultātu informācijas pogasMenu (); // lasīt atskaņotāja ievadi clearBoard (); // nodrošināt visu dēli = 0} kavēšanās (10); // uz īsu brīdi aizkavējiet arduino}

ja bolPlay ir vienāds ar true, tas nozīmē, ka spēle tiek spēlēta, un viss spēles laikā esošais kods ir jāpalaiž, bet mēs tikai vēlamies, lai tāfele pievienotu jaunu elementu un pārietu uz leju, kad intTick ir lielāks par mūsu intDelay, pretējā gadījumā mēs joprojām vēlamies ļaut lietotājam nospiest pogu, lai sasniegtu flīzi, un lai intTick palielinātu ātrumu.

Lielākā daļa no šī koda izmanto funkcijas, kuras mums vēl nav jāizveido, un mēs tās veiksim turpmākajās darbībās. Šo funkciju mērķis ir šāds.

Ievadot tiek nolasīts, kuras pogas lietotājs ir nospiedis.

buttonGame kontrolē to, ko pogas dara spēles laikā, nevis izvēlnē

playBoard pievieno jaunu flīžu pie tāfeles un pēc tam pārvieto visu tāfeles leju par vienu vietu

clearLCD notīra LCD, lai pārliecinātos, ka aiz flīzēm nav palikuši spoki

drawBoard iet caur arrGame un izdrukā to uz LCD

clearBoard notīra visu arrGame, kad spēle netiek spēlēta

bottomCheck pārbauda, vai arrGame apakšā nav kļūmes stāvokļa

nosaukums parāda spēles nosaukumu un rezultātu informāciju, atrodoties izvēlnē

pogu izvēlne kontrolē to, ko lietotāja ievades dara, atrodoties izvēlnē.

gameOver ir vēl viena funkcija, lai gan šeit tā netiek saukta, jo tā tiek dēvēta apakšā Pārbaudiet un pogas Spēļu funkcijas.

5. darbība: ClearLCD funkcija

lai izveidotu funkciju, mēs sākam, pievienojot šo kodu

void functionName () {

}

"functionName" var būt jebkas, ja vien tas vēl nepastāv.

Kopējiet šo kodu savā programmā:

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

tas iet cauri visam masīvam, izmantojot 2 saskaitītas cilpas, lai izietu cauri katram LCD ekrāna punktam un ierakstītu atstarpi.

Ja nekas netiks atiestatīts, LCD saglabās visu iepriekš rakstīto

6. darbība: DrawBoard funkcija

iekopējiet šo kodu savā programmā

void drawBoard () {for (int i = 1; i <= 15; i ++) {// izdarīt kolu 1 un 2 kreisajā LCD // ja flīze = 0 neko neraksta, = 1 raksta "#", = 2 uzrakstiet "@" lcdLeft.setCursor (i, 1); // iestatīt uz pirmo sleju (vistālāk pa kreisi), ja (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // iestatīt uz otro sleju (centrā pa kreisi), ja (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // iestatīt uz trešo sleju (centrā pa labi), ja (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // iestatīt uz ceturto sleju (vistālāk pa labi), ja (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.write ("@");}}}

tas izmanto cilpu, lai izietu cauri katrai tāfeles rindai, un pēc tam pārbauda, vai kāda rindas kolonna ir vienāda ar 1 vai 2, pamatojoties uz to, ka pēc tam tā LCD ekrānā izdrukā atsauci, lai vēl nebūtu trāpījums vai @ par trāpījuma elementu.

7. darbība: PlayBoard funkcija

iekopējiet šo kodu savā programmā.

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // notīrīt augšējo rindu arrGame [0] [nejauši (0, 4)] = 1; // iestatiet nejaušu punktu augšējā rindā, lai tā būtu flīze (int i = 15; i> = 1; i-) {// kas strādā no tāfeles apakšas uz augšu (int ii = 0; ii <= 3; ii ++) {// katram kolumam arrGame [ii] = arrGame [i - 1] [ii]; }}}

šis kods sākas, notīrot visu augšējo rindu līdz 0 vai bez flīzes, un pēc tam vienu nejaušu elementu iestata par 1 un unhit flīzi.

Pēc tam tas iet caur saskaitītu cilpu pretēji, no 15 līdz 1, iestatot rindu vienādu neatkarīgi no rindas virs tā, un tāfele pārvietojas lejup pa LCD

8. darbība: ClearBoard funkcija

iekopējiet šo kodu savā programmā.

void clearBoard () {// atiestatīt ērču un aizkaves vērtības intTick = 0; intDelay = 1000; // ejiet cauri tāfelei un iestatiet visu uz 0 (int i = 0; i <= 15; i ++) {priekš (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

Šis kods tiek palaists, kad spēle netiek atskaņota, lai pārliecinātos, ka visa arrGame ir iestatīta uz 0 vai nav nevienas flīzes, izmantojot saskaitītās cilpas, lai iet cauri masīvam.

Kods arī atiestata intDelay un intTick vērtības.

9. darbība: virsraksta funkcija

kopējiet tālāk norādīto kodu savā programmā

void title () {// ierakstiet virsrakstu uz LCD un atstarpes rezultātam lcdRight.setCursor (0, 0); lcdRight.write ("Klavieru flīzes"); lcdRight.setCursor (0, 1); lcdRight.write ("Rezultāts:"); // pārvērst rezultātu virknē char strScore [3]; sprintf (strScore, "%d", intScore); // parādīt rezultātu uz LCD lcdRight.write (strScore); // pievienot sarežģīti lcdRight.setCursor (10, 1); ja (intDiff == 0) {lcdRight.write ("Viegli"); } ja (intDiff == 1) {lcdRight.write ("Medium"); } ja (intDiff == 2) {lcdRight.write ("Ciets"); } // Nospiediet nedaudz instrukcijas lcdLeft.setCursor (0, 0); lcdLeft.write ("Nospiediet Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("lai sāktu!"); }

Šis kods uzraksta spēles nosaukumu un rezultātu uz LCD, tas tiek darīts, LCD ekrānam norādot, kur sākt rakstīt, izmantojot LCD.setCursor, un pēc tam ierakstot virkni LCD.write.

Šeit tiek izveidots arī jauns mainīgais, strScore, to izmanto, lai intScore pārvērstu par virknes vai char datu tipu, izmantojot funkciju sprintf.

Šeit tiek izmantots arī intDiff, pamatojoties uz tā vērtībām, tas izdrukā dažādas grūtības iespējas.

10. solis: ButtonsMenu funkcija

ievietojiet savā programmā šādu kodu

void buttonsMenu () {// kad tiek nospiests enter, sāciet spēli un atiestatiet rezultāta vērtību, ja (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // kad tiek nospiesta poga 3, ieslēdziet atkļūdošanas opciju, izdrukājot kartonu sērijveidā, ja (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = true; } else {Serial.println ("Serial Board Disabled"); bolSerialBoard = nepatiess; }} // iestatīt spēles ātrumu uz vieglām grūtībām, ja (intInput == 0) {Serial.print ("Spēle iestatīta uz vieglu ("); Serial.print (intGameSpeedEasy); Serial.println ("ms paātrinājums)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // iestatiet spēles ātrumu uz vidējām grūtībām, ja (intInput == 1) {Serial.print ("Spēle iestatīta uz vidēju ("); Serial.print (intGameSpeedMedium); Serial.println ("ms paātrinājums)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // iestatiet spēles ātrumu uz lielām grūtībām, ja (intInput == 2) {Serial.print ("Spēle iestatīta uz cieto ("); Serial.print (intGameSpeedHard); Serial.println ("ms paātrinājums)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

šis kods tiek palaists tikai tad, ja bolPlay ir vienāds ar false tukšajā cilpā

ja intEnter ir iestatīts uz 1, tas nozīmē, ka ievadīšanas poga ir nospiesta; ja tiek nospiesta, programma nosaka bolPlay uz true un spēle sākas.

Pēc tam programma nolasa, kam intInput ir vienāds. ja tas ir vienāds ar 0, tiek nospiesta pirmā poga no kreisās puses, augšup pa labi līdz 3. Ja intInput ir vienāds ar 4, neviena poga netiek nospiesta.

nospiežot pogas 0-2, spēle maina grūtības, kā arī pielāgo spēles ātruma vērtību, kas nozīmē, ka tā paātrinās ātrāk.

nospiežot pogu 3, spēle aktivizēs vai deaktivizēs atkļūdošanas režīmu, kur visa tāfele ir izdrukāta sērijas monitorā, lai palīdzētu atrast problēmas programmā.

11. darbība: funkcija ButtonsGame

kopējiet tālāk norādīto kodu savā programmā

void buttonsGame () {if (intInput! = 4) {// ja poga tiek nospiesta, ja (bolTilePressed == false) {// tikai tad, ja bolTilePressed ir nepatiesa sprūda darbība, lai pārbaudītu pogas nospiešanu bolTilePressed = true; // pēc tam iestatiet bolTilePressed uz true, lai pārliecinātos, ka tas nejauši netiek atkal iedarbināts int intLowestTile = 0; // jāiestata uz flīzes ar zemāko flīzi int intCheckedTile = 15; // lai izsekotu, kuras flīzes ir pārbaudītas, kamēr (intLowestTile == 0) {// kamēr nav iestatīts nekas, pārbaudiet flīzes (int i = 0; i 100) {// tik ilgi, kamēr int kavēšanās nav mazāka par 100 intDelay = intDelay - 20; // ņemt no tā vērtību}} else {Serial.println ("Nospiesta nepareiza poga"); spēle beigusies(); // citādi spēle beigusies}}}}}

Kods tiek palaists tikai tad, ja bolPlay ir vienāds ar true tukšajā cilpā.

Tāpat kā pogas Izvēlne, pamatojoties uz intInput vērtību, tā pārbauda, vai spēlētājs ir trāpījis vai nav nokavējis flīzi.

Tas tiek darīts, ejot caur arrGame no apakšas uz augšu, izmantojot cilpu while, lai meklētu, kura rinda ir zemākā ar nepārspējamu flīzi. Pēc tam tā pārbauda, vai vieta šajā rindā, kas atbilst nospiestajai pogai, ir vai nav flīze, ja tā ir vienota, tā nosaka to kā 2, nevis 1, tas nozīmē, ka tas tiks parādīts kā @, pretējā gadījumā tas aktivizē spēli funkcija, kas mums vēl jāizveido.

Šī funkcija izmanto arī mainīgo bolTilePressed, iestatot to uz true, kad tiek nospiesta poga, un uz false, ja netiek nospiesta neviena poga. Tas tiek darīts, lai nodrošinātu, ka lietotājs nejauši nepazaudē spēli, jo programma domāja, ka, turot to nospiestu, vairākas reizes nospieda pogu.

12. darbība. GameOver funkcija

Kopējiet tālāk norādīto kodu savā programmā

void gameOver () {Serial.println ("Spēle beigusies!"); Serial.print ("Jūsu rezultāts bija:"); Serial.println (intScore); Serial.print ("Tavs ātrums bija:"); Serial.println (intDelay); bolPlay = nepatiess; }

To aktivizē vai nu checkBottom, vai buttonsGame funkcijas, un aktivizē spēles beigas, iestatot bolPlay kā nepatiesu.

Tas arī izdrukā ziņojumu sērijas monitorā par lietotāju rezultātiem, un ātruma flīzes tika pievienotas milisekundēs.

13. darbība: ievades funkcija

Kopējiet tālāk norādīto kodu savā programmā.

tukša ievade () {intEnter = digitalRead (btnEnter); // lasiet ievadiet // lasiet, kura no citām ievadēm vai ja neviena nav iestatīta uz 4, ja (digitalRead (btn1) == HIGH) {intInput = 0;} cits {if (digitalRead (btn2) == HIGH) {intInput = 1;} cits {if (digitalRead (btn3) == HIGH) {intInput = 2;} else {if (digitalRead (btn4) == HIGH) {intInput = 3;} else {intInput = 4; }}}} // sērijveidā izdrukājiet ievades, ja (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } cits {// ja netiek nospiesta neviena poga reset bolTilePressed bolTilePressed = false; }}

Šo kodu izmanto ar pogāmSpēle un pogas Izvēlnes funkcijas. pamatojoties uz lietotāja nospiestajām pogām, tā nosaka intInput vērtību, vai, ja neviena poga netiek nospiesta, intInput tiek iestatīta kā 4.

Ja netiek nospiesta neviena poga, tad pogasGame funkcijai tiek atiestatīts bolTilePressed.

Tas arī izdrukā ziņojumu seriālajam monitoram, uz kura tiek nospiesta poga.

14. darbība. BottomCheck funkcija

nokopējiet šādu kodu savā programmā.

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 kolonnām, ja (arrGame [15] == 1) {// ja flīze atrodas apakšā Serial.println ("Flīze apakšā"); arrGame [15] = 2; drawBoard (); kavēšanās (400); arrGame [15] = 1; drawBoard (); kavēšanās (400); arrGame [15] = 2; drawBoard (); kavēšanās (400); arrGame [15] = 1; drawBoard (); kavēšanās (400); spēle beigusies(); }}}

izmantojot cilpu, šis kods pārbauda arrGame apakšējo rindu, lai redzētu, vai nav nevienas flīzes (flīzes, kas vienādas ar 1), ja ekrāna apakšdaļā ir neviena flīze, tā mirgos un pēc tam aktivizēs spēli.

15. solis: WriteSerial funkcija

kopējiet tālāk norādīto kodu savā programmā

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

Šī ir funkcija, kurai seko atkļūdošanas opcija, kuru var iespējot, izmantojot pogas Izvēlne. Ja šajā funkcijā bolSerialBoard ir iestatīts uz true, tas izies cauri arrGame un drukās visu kartonu sērijas monitorā, lai veiktu testēšanu, izmantojot masīvu.

16. solis: pabeigšana

Pabeigšana!
Pabeigšana!

Visam jūsu kodam nevajadzētu būt pilnīgam un izskatīties apmēram šādi!

/ * * Nosaukums - Klavieru flīzes; Arduino * Līdz - Domenic Marulli * Datums - 11/ *

/ iekļaut bibliotēkas

#iekļaut

// šie mainīgie ir iespējas, kuras varat mainīt - lielāki skaitļi = ātrāka spēles paātrināšana

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

// Definējiet tapas

#define btn Ievadiet A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

// izveidot LCD objektus (n, ~, n, ~, ~, n)

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

// iestatīt spēļu masīvu

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

// iestatīt spēles mainīgos

Būla bolPlay; // dziesmas, ja atskaņotājs int intScore; // izseko spēlētāja rezultātu int intDiff; // tikai estētiska lieta, lai pateiktu, ar kādām grūtībām spēle ir saistīta

// iestatīt ievades mainīgos

int intEnter; // izseko, ja lietotājs nospiež ievadīšanas pogu int intInput; // izseko, kuras pogas lietotājs nospiež boolean bolTilePressed; // pārliecinieties, ka spēlētājs nejauši 5x nenospiež pogu un nezaudē

// iestatīt mainīgos pagriezienam

int intTick; // saskaita milijas (vienā cilpā) līdz intDelay int intDelay; // laiks, kad programma gaida līdz nākamajam pagriezienam milis int intGameSpeed;

// atkļūdošanas iespēju abit

Būla bolSerialBoard; // kad true, izdrukās tāfeli sērijas monitorā

// iestatīšana, kas tiks palaista vienu reizi

void setup () {Serial.begin (9600); // sākt sērijas monitoru // iestatīt mainīgos bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // sākt lcd lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

// cilpa, kas tiks palaista ik pēc 10 milisekundēm

void loop () {input (); // pārbaudiet, vai tiek ievadīta atskaņošanas ievade, ja (bolPlay == true) {if (intTick> = intDelay) {// pārbaudiet, vai spēlei vajadzētu spēlēt kārtu vai turpināt gaidīt Serial.println ("~~~~~~~ ~~ "); // drukāt, lai apzīmētu tāfeles virzību uz priekšu // writeSerial (); // ja opcija ir iespējota, rakstiet tāfeli sērijas pogāsGame (); // pārbaudīt atskaņotāja ievadi playBoard (); // pārvietot dēli un pievienot jaunu flīzi clearLcd (); // notīriet LCD pirms zīmēšanas drawBoard (); // uzzīmējiet tāfeli uz lcd apakšasCheck (); intTick = 0; // atiestatīt intTick} else {buttonsGame (); // pārbaudīt atskaņotāja ievadi clearLcd (); // notīriet LCD pirms zīmēšanas drawBoard (); // uzzīmējiet tāfeli uz LCD intTick = intTick + intGameSpeed; // pievienot ērcei}} else {clearLcd (); // pirms virsraksta zīmēšanas notīriet LCD (); // rādīt nosaukuma un rezultātu informācijas pogasMenu (); // lasīt atskaņotāja ievadi clearBoard (); // nodrošināt visu dēli = 0} kavēšanās (10); // uz īsu brīdi aizkavējiet arduino}

// attīra LCD, tāpēc visas neievietotās šūnas tur netiek atstātas

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

// uzzīmē dēli uz LCD diska

void drawBoard () {for (int i = 1; i <= 15; i ++) {// izdarīt kolu 1 un 2 kreisajā LCD // ja flīze = 0 neko neraksta, = 1 raksta "#", = 2 uzrakstiet "@" lcdLeft.setCursor (i, 1); // iestatīt uz pirmo sleju (vistālāk pa kreisi), ja (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // iestatīt uz otro sleju (centrā pa kreisi), ja (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // iestatīt uz trešo sleju (centrā pa labi), ja (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // iestatīt uz ceturto sleju (vistālāk pa labi), ja (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.write ("@");}}}

// pārvieto tablo uz leju un ievieto izlases vērtību kā flīzi

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // notīrīt augšējo rindu arrGame [0] [nejauši (0, 4)] = 1; // iestatiet nejaušu punktu augšējā rindā, lai tā būtu flīze (int i = 15; i> = 1; i-) {// kas strādā no tāfeles apakšas uz augšu (int ii = 0; ii <= 3; ii ++) {// katram kolumam arrGame [ii] = arrGame [i - 1] [ii]; }}}

// iestata visu dēli uz 0 un atiestata mainīgos uz iepriekšējo spēli

void clearBoard () {// atiestatīt ērču un aizkaves vērtības intTick = 0; intDelay = 1000; // ejiet cauri tāfelei un iestatiet visu uz 0 (int i = 0; i <= 15; i ++) {priekš (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

// LCD ekrānā parāda galveno izvēlni

void title () {// ierakstiet virsrakstu uz LCD un atstarpes rezultātam lcdRight.setCursor (0, 0); lcdRight.write ("Klavieru flīzes"); lcdRight.setCursor (0, 1); lcdRight.write ("Rezultāts:"); // pārvērst rezultātu virknē char strScore [3]; sprintf (strScore, "%d", intScore); // parādīt rezultātu uz LCD lcdRight.write (strScore); // pievienot sarežģīti lcdRight.setCursor (10, 1); ja (intDiff == 0) {lcdRight.write ("Viegli"); } ja (intDiff == 1) {lcdRight.write ("Medium"); } ja (intDiff == 2) {lcdRight.write ("Ciets"); } // Nospiediet nedaudz instrukcijas lcdLeft.setCursor (0, 0); lcdLeft.write ("Nospiediet Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("lai sāktu!"); }

// pārbauda pogas un to, ko viņiem darīt, atrodoties ārpus spēles

void buttonsMenu () {// kad tiek nospiests enter, sāciet spēli un atiestatiet rezultāta vērtību, ja (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // kad tiek nospiesta poga 3, ieslēdziet atkļūdošanas opciju, izdrukājot kartonu sērijveidā, ja (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = true; } else {Serial.println ("Serial Board Disabled"); bolSerialBoard = nepatiess; }} // iestatīt spēles ātrumu uz vieglām grūtībām, ja (intInput == 0) {Serial.print ("Spēle iestatīta uz vieglu ("); Serial.print (intGameSpeedEasy); Serial.println ("ms paātrinājums)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // iestatiet spēles ātrumu uz vidējām grūtībām, ja (intInput == 1) {Serial.print ("Spēle iestatīta uz vidēju ("); Serial.print (intGameSpeedMedium); Serial.println ("ms paātrinājums)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // iestatiet spēles ātrumu uz lielām grūtībām, ja (intInput == 2) {Serial.print ("Spēle iestatīta uz cieto ("); Serial.print (intGameSpeedHard); Serial.println ("ms paātrinājums)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

// pārbauda pogas un to, ko viņiem darīt spēles laikā

void buttonsGame () {if (intInput! = 4) {// ja poga tiek nospiesta, ja (bolTilePressed == false) {// tikai tad, ja bolTilePressed ir nepatiesa sprūda darbība, lai pārbaudītu pogas nospiešanu bolTilePressed = true; // pēc tam iestatiet bolTilePressed uz true, lai pārliecinātos, ka tas nejauši netiek atkal iedarbināts int intLowestTile = 0; // jāiestata uz flīzes ar zemāko flīzi int intCheckedTile = 15; // lai izsekotu, kuras flīzes ir pārbaudītas, kamēr (intLowestTile == 0) {// kamēr nav iestatīts nekas, pārbaudiet flīzes (int i = 0; i 100) {// tik ilgi, kamēr int kavēšanās nav mazāka par 100 intDelay = intDelay - 20; // ņemt no tā vērtību}} else {Serial.println ("Nospiesta nepareiza poga"); spēle beigusies(); // citādi spēle beigusies}}}}}

void gameOver () {

Serial.println ("Spēle beigusies!"); Serial.print ("Jūsu rezultāts bija:"); Serial.println (intScore); Serial.print ("Tavs ātrums bija:"); Serial.println (intDelay); bolPlay = nepatiess; }

// pārbauda atskaņotāja ievadi

tukša ievade () {intEnter = digitalRead (btnEnter); // lasiet ievadi // lasiet, kura no citām ievadēm vai ja neviena nav iestatīta uz 4, ja (digitalRead (btn1) == HIGH) {intInput = 0;} cits {if (digitalRead (btn2) == HIGH) {intInput = 1;} cits {if (digitalRead (btn3) == HIGH) {intInput = 2;} else {if (digitalRead (btn4) == HIGH) {intInput = 3;} else {intInput = 4; }}}} // sērijveidā izdrukājiet ievades, ja (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } cits {// ja netiek nospiesta neviena poga reset bolTilePressed bolTilePressed = false; }}

// pārbauda tāfeles apakšdaļu, vai nav kļūmju

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 kolonnām, ja (arrGame [15] == 1) {// ja flīze atrodas apakšā Serial.println ("Flīze apakšā"); arrGame [15] = 2; drawBoard (); kavēšanās (400); arrGame [15] = 1; drawBoard (); kavēšanās (400); arrGame [15] = 2; drawBoard (); kavēšanās (400); arrGame [15] = 1; drawBoard (); kavēšanās (400); spēle beigusies(); }}}

// izdrukā tāfeli sērijas monitorā, ja bolSerialBoard ir patiess

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

Kad viss kods ir ievadīts, augšupielādējiet savā arduino un izbaudiet!

Ieteicams: