Satura rādītājs:
- 1. solis: Elektroinstalācija
- 2. darbība. Deklarācijas paziņojumi
- 3. darbība: iestatīšanas funkcija
- 4. darbība: cilpas funkcija
- 5. darbība: ClearLCD funkcija
- 6. darbība: DrawBoard funkcija
- 7. darbība: PlayBoard funkcija
- 8. darbība: ClearBoard funkcija
- 9. darbība: virsraksta funkcija
- 10. solis: ButtonsMenu funkcija
- 11. darbība: funkcija ButtonsGame
- 12. darbība. GameOver funkcija
- 13. darbība: ievades funkcija
- 14. darbība. BottomCheck funkcija
- 15. solis: WriteSerial funkcija
- 16. solis: pabeigšana
Video: Arduino - klavieru flīzes: 16 soļi (ar attēliem)
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:56
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
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
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:
Kā: Raspberry PI 4 bez galvas (VNC) instalēšana ar RPI attēlu un attēliem: 7 soļi (ar attēliem)
Kā: Raspberry PI 4 bez galvas (VNC) instalēšana ar Rpi-imager un Pictures: Es plānoju izmantot šo Rapsberry PI daudzos jautros projektos savā emuārā. Jūtieties brīvi to pārbaudīt. Es gribēju atkal izmantot savu aveņu PI, bet manā jaunajā vietā nebija tastatūras vai peles. Pagāja laiks, kopš es izveidoju aveņu
Arduino Halloween Edition - zombiju uznirstošais ekrāns (soļi ar attēliem): 6 soļi
Arduino Helovīna izdevums - zombiju uznirstošais ekrāns (soļi ar attēliem): Vai vēlaties Helovīnā nobiedēt savus draugus un radīt kliedzošu troksni? Vai arī vienkārši gribi uztaisīt labu palaidnību? Šis zombiju uznirstošais ekrāns to var izdarīt! Šajā pamācībā es iemācīšu jums, kā viegli izveidot izlecošus zombijus, izmantojot Arduino. HC-SR0
Lētākais Arduino -- Mazākais Arduino -- Arduino Pro Mini -- Programmēšana -- Arduino Neno: 6 soļi (ar attēliem)
Lētākais Arduino || Mazākais Arduino || Arduino Pro Mini || Programmēšana || Arduino Neno: …………………………. Lūdzu, abonējiet manu YouTube kanālu, lai iegūtu vairāk videoklipu ……. Šis projekts ir par to, kā sasaistīt mazāko un lētāko arduino. Mazākais un lētākais arduino ir arduino pro mini. Tas ir līdzīgs arduino
Kamera atvieglotiem laika intervāla attēliem: 22 soļi (ar attēliem)
Kamera atvieglotiem laika intervāla attēliem: es pārbaudīju vienu no citām instrukcijām par laika nobīdes filmu veidošanu. Viņš diezgan labi aptvēra filmas daļu. Viņš pastāstīja par bezmaksas programmatūru, kuru varat lejupielādēt, lai izveidotu filmas. Es sev teicu: domāju, ka redzēšu, vai varu
Lodēšanas flīzes (AKA - galda aizsargs): 3 soļi
Lodēšanas flīze (AKA The Table Protector): Mani vecāki sāk kliegt uz mani, ka uz baltā flīžu galda ir izkusis lodmetāls un plūsmas atlikumi. Tas nāk nost, bet dažkārt ir mazliet grūts. Tas bija ļoti vienkāršs projekts. Tas maksā zem 10 USD, un to var izgatavot mazāk nekā 5 minūtēs. S