Orodha ya maudhui:

Mchezo wa Nyoka wa Arduino OLED: Hatua 3
Mchezo wa Nyoka wa Arduino OLED: Hatua 3

Video: Mchezo wa Nyoka wa Arduino OLED: Hatua 3

Video: Mchezo wa Nyoka wa Arduino OLED: Hatua 3
Video: РАДУЖНЫЕ ДРУЗЬЯ — КАЧКИ?! НЕЗАКОННЫЕ Эксперименты VR! 2024, Julai
Anonim
Mchezo wa Nyoka wa Arduino OLED
Mchezo wa Nyoka wa Arduino OLED

Halo na karibu, kwa mafunzo yetu ya jinsi ya kutengeneza na mchezo wa OLED wa arduino, mradi huu ulitokea wakati tulikuwa tunajaribu kufanya mchezo wetu wa kwanza kabisa na arduino, soooo, tulifikiri ni wapi bora kuanza kuliko Nyoka wa nokia classic (vizuri angalau mwamba wa nyoka:)).

Nini Utahitaji

Vifaa

Arduino UNO au Clone

OLED Onyesho

4 Diode

Kinzani ya 500-1k

Vifungo 4 vya mtawala

Puzzzo ya Piezo isiyo na maana

hiari

Bodi ya Mkate isiyo na Solder

Tafadhali kumbuka viungo hivi ni kwa mfano tu

Hatua ya 1: Mzunguko

Mzunguko
Mzunguko

Katika picha hapo juu unaweza kuona mzunguko wetu, tunatumia pini d3 kwenye arduino kama pini ya ombi la kusumbua ili arduino itoe kipaumbele kwa kusoma pembejeo za mtawala ambazo ni d4 d5 d6 d7. Misingi ya mzunguko ni kwamba kitufe cha mwelekeo kinabanwa ambacho huenda juu 5v hii inamsha pini ya ombi la kukatiza (waya wa zambarau ya d3) na pini ya mwelekeo inayolingana, kazi ya kukatiza inaita kazi ya mwelekeo wa sasisho na nambari hiyo inamwongoza nyoka ipasavyo. Pini 9 hutumiwa kama pini ya sauti kwani ni PWM (~ mpigo wa mpigo wa mpigo) ambayo imeunganishwa moja kwa moja na piezo ya 5v kwenye pini + na - inarudi kwa 0v / chini.

(FYI kwenye arduino uno na clones tu d2 na d3 zinaweza kufanya kama pini za ombi za kukatiza).

Pini za mwelekeo:

d4 Juu ORANGE

d5 Chini PINK

d6 kushoto BLUE

d7 Kulia hudhurungi

d9 sauti KIJIVU

Kila kitufe kina unganisho la unganisho la 5v na pato ambalo limeunganishwa kwanza kwa pembejeo zao za dijiti kwenye arduino, pato hili hilo la kila kitufe linaunganishwa na diode yake mwenyewe, tunatumia diode kukomesha usambazaji wa voltage kurudi kwa vifungo vingine na kuziwasha. Kwenye mwisho wa cathode (-) ya diode zote 4 tunajiunga pamoja ili kuunda makutano ya pato ambayo huunganisha kwa d3 na kisha kupitia kipinga hadi 0v / ardhi kuvuta pini za arduino chini ili usiondoke pini zinazoelea wakati hazipo imeamilishwa.

(FYI pini inayoelea inaweza kupokea voltage ya phantom na kusababisha tabia isiyo ya kawaida)

Pini 2 za Analog hutumiwa kuendesha onyesho, hizi ni pini za vifaa vya arduino i2c.

A5 imeunganishwa na SCL NJANO

A4 imeunganishwa na SDA KIJANI

Pato la + 5v na 0v (ardhi) kutoka kwa arduino hutumiwa kama chanzo cha nguvu kwa mzunguko mzima ambao unaweza kutumiwa na usb au chaja ya simu.

Hatua ya 2: Kanuni

// ------------------------ Michezo ya NYOKA YA ANJAWARE Kwa msaada kutoka kwa watu wavu -------

# pamoja

# pamoja na // https://github.com/adafruit/Adafruit-GFX-Library # pamoja # https://github.com/adafruit/Adafruit-GFX-Library // set set (upana, urefu) Adafruit_SSD1306 onyesho (128, 64); // fafanua pini za kuingiza hizi ni pini kwenye arduino ambazo hazibadiliki hivyo #fafanua #fafanua INTPIN 3 // pini 2 na 3 tu zinaweza kuwa pini za kuingiliana kwenye UNO #fafanua UPPIN 4 // hizi ni pini zilizounganishwa tp switch husika #fafanua DWNPIN 5 #fafanua LFTPIN 6 #fafanua RHTPIN 7 #fafanua SND 9 // fafanua mwelekeo #fafanua DIRUP 1 // maadili haya ndio "nyoka" anaangalia kuamua- #fafanua DIRDOWN 2 // mwelekeo ambao nyoka atasafiri # fafanua DIRLEFT 3 #fafanua KIWANGO 4

// kuweka vigezo vya kifungo

// volitile cos tunahitaji kuisasisha na kuingiliana ili iweze kuwa na thamani yoyote ya mzunguko

// haijawahi kuwa juu kuliko 4 kwa hivyo unahitaji tu 8bit int kuokoa rasilimali zenye uint8_t zilizobanwa = 0; bool butup = 0; kupungua kwa bool = 0; // tunatumia hii kuweka ukweli wa "kugundua" ni mwelekeo upi ulibonyeza bool butleft = 0; bool butright = 0;

// nyoka ints

byte nyokaPosX [30]; // safu ya kutengeneza mwili wa nyoka bytePosY [30];

int nyokaX = 30; // nafasi ya kichwa cha nyoka

int nyokaY = 30; int nyokaSize = 1; // hesabu ya ukubwa wa nyoka imepunguzwa kwa saizi ya safu

// ints ya ulimwengu

uint8_t duniaMinX = 0; // hizi zinaweka mipaka ya eneo la kucheza

uint8_t ulimwenguMaxX = 128; uint8_t worldMinY = 10; uint8_t ulimwenguMaxY = 63;

// kukusanya scran (chakula) na nafasi ya scran

scrol ya boolAte = 0; uint8_t scranPosX = 0; uint8_t scranPosY = 0;

// alama tofauti

playcore ndefu = 0; alama ya juu ndefu = 30; // weka alama ya juu hadi 3 kukusanya kama mahali pa kuanzia

// ------------------ -------------

batili iliyokatizwa () {kucheleweshwa (150); // kuchelewa kidogo kwa kiboreshaji cha ulinzi cha "bounce" (); } // ------------------ sasisha thamani ya mwelekeo kutoka kwa bonyeza kitufe // Serial.println ("uppdatering mwelekeo"); butup = kusoma kwa dijiti (UPPIN); // angalia ni pembejeo gani iliyoenda juu na weka bool husika kweli butdown = digitalRead (DWNPIN); taratibuft = digitalRead (LFTPIN); sawa = digitalRead (RHTPIN); // hizi ikiwa kanuni zinaangalia ni pembejeo gani iliyoenda juu na inaingiza thamani inayofaa katika "kushinikiza kifungo" // kutofautisha, kutofautisha huku kunaelekeza mwelekeo wa harakati ikiwa (butup == true) {buttonpressed = DIRUP; // Serial.println ("UP imeshinikizwa"); // Serial.println (kifungo kilichopigwa); butup = uwongo; toni (SND, 1500, 10); } ikiwa (butdown == kweli) {buttonpressed = DIRDOWN; // Serial.println ("imesisitizwa chini"); // Serial.println (kifungo kilichopigwa); butdown = uwongo; toni (SND, 1500, 10); }

ikiwa (polepole == ni kweli)

{imebanwa = BIDHAA; // Serial.println ("imesisitizwa LEFT"); // Serial.println (kifungo kilichopigwa); taratibuft = uongo; toni (SND, 1500, 10); } ikiwa (butright == true) {buttonpressed = DIRRIGHT; // Serial.println ("HAKI imesisitizwa"); // Serial.println (kifungo kilichopigwa); butright = uongo; toni (SND, 1500, 10); }}

// -------------------------- chora njia za kuonyesha ------------------ -----------------

sasisha batiliDisplay () // chora alama na muhtasari

{// Serial.println ("Sasisha Uonyesho");

onyesha.fillRect (0, 0, onyesha upeo () - 1, 8, NYEUSI);

onyesha.setTextSize (0); onyesha.setTextColor (NYEUPE); // alama za kuchora onyesho.setCursor (2, 1); onyesho.print ("Alama:"); onyesho.print (Kamba (playcore, DEC)); Kuweka Mshale (66, 1); onyesho.print ("Juu:"); onyesho.print (String (highscore, DEC)); // eneo la kucheza // pos 1x, 1y, 2x, 2y, onyesho la rangi. Mchoro (0, 0, 127, 0, NYEUPE); // onyesho la juu sana la mpaka.drawLine (63, 0, 63, 9, WHITE); // alama ya kuonyesha seperator.drawLine (0, 9, 127, 9, NYEUPE); // chini ya onyesho la mpaka wa maandishi.drawLine (0, 63, 127, 63, WHITE); // onyesho la mpaka wa chini.drawLine (0, 0, 0, 63, WHITE); // onyesho la mpaka wa kushoto.drawLine (127, 0, 127, 63, WHITE); // mpaka wa kulia

}

// ----------------------------------- sasisha eneo la kucheza ---------- --------------------

tupu updateGame () // hii inasasisha onyesho la eneo la mchezo

{onyesha. UsafiDisplay ();

onyesha.drawPixel (scranPosX, scranPosY, WHITE);

scranAte = scranFood ();

// kuangalia taratibu za nyoka

ikiwa (outOfArea () || kujibadilisha mwenyewe)

{ shindano limekwisha(); }

// nyoka ya kuonyesha

kwa (int i = 0; i0; i--) {snakePosX = nyokaPosX [i-1]; nyokaPosY = nyokaPosY [i-1]; } // // ongeza pikseli ya ziada kwa nyoka ikiwa (scranAte) {snakeSize + = 1; nyokaPosX [nyokaSize-1] = nyokaX; nyokaPosY [nyokaSize-1] = nyokaY; }

kubadili (kushinikiza kifungo) // ilikuwa nyokaDirection

{kesi DIRUP: nyokaY- = 1; kuvunja; kesi DIRDOWN: nyokaY + = 1; kuvunja; kesi DIRLEFT: nyokaX- = 1; kuvunja; kesi DIRRIGHT: nyokaX + = 1; kuvunja; } nyokaPosX [0] = nyokaX; nyokaPosY [0] = nyokaY; sasishaDisplay (); onyesha.display (); // --------------------- weka skanati -------------------

mahali patupuScran ()

{scranPosX = bila mpangilio (worldMinX + 1, worldMaxX-1); scranPosY = bila mpangilio (worldMinY + 1, worldMaxY-1); } // ------------------------ SCRAN ATE POINT UP ------ {{(snakeX == scranPosX && nyokaY == scranPosY) toni (SND, 2000, 10); sasishaDisplay (); mahaliScran (); kurudi 1; } mwingine {kurudi 0; }} // --------------------- nje ya eneo ---------------------- bool outOfArea () {kurudi nyokaX = worldMaxX || nyokaY = worldMaxY; } //---------------------- shindano limekwisha----------------------- --- mchezo batiliOver () {uint8_t rectX1, rectY1, rectX2, rectY2; rectX1 = 38; rectY1 = 28; rectX2 = 58; rectY2 = 12; onyesha wazi Cleplay (); Kuweka Mshale (40, 30); onyesha.setTextSize (1); toni (SND, 2000, 50); onyesho.print ("MCHEZO"); toni (SND, 1000, 50); onyesho.print ("OVER"); ikiwa (playcore> = alama ya juu) // angalia ikiwa alama iko juu kuliko alama ya juu {highscore = playcore; // single ikiwa ni sheria ya kusasisha alama za juu} kwa (int i = 0; i <= 16; i ++) // hii ni kuchora rectanlges karibu na mchezo juu ya {display.drawRect (rectX1, rectY1, rectX2, rectY2, WHITE); Serial.println ("ikiwa kitanzi"); onyesha.display (); rectX1- = 2; // kuhama juu na saizi 2 rectY1- = 2; rectX2 + = 4; // kuhama juu ya saizi 2 kutoka hatua ya mwisho rectY2 + = 4; toni (SND, i * 200, 3); } onyesha. onyesha (); // Screen Futa baada ya umaarufu juu ya rectX1 = 0; // kuweka nafasi ya kuanza kwa laini rectY1 = 0; rectX2 = 0; rectY2 = 63; kwa (int i = 0; i <= 127; i ++) {uint8_t cnt = 0; kuonyesha.drawLine (rectX1, rectY1, rectX2, rectY2, BLACK); rectX1 ++; rectX2 ++; onyesha.display (); } onyesha. Onyesha wazi (); playcore = 0; // kuweka upya nyoka na maelezo ya mchezaji nyokaSize = 1; nyokaX = onyesha upana () / 2; nyokaY = onyesha. urefu () / 2; subiri kwa habari (); // subiri mchezaji aanze mchezo} // ------------------------- subiri kitanzi cha waandishi ---------- --------------- batili ya kusubiriForPress () {bool waiting = 0; // kitanzi kinamalizika whjen hii ni kweli onyesho. waziDisplay (); wakati (kusubiri == 0) {drawALineForMe (NYEUPE); // chora sare nyeupe ya laini nyeupeALineForMe (NYEUSI); // chora laini nyeusi bila mpangilio ili skrini isijaze kabisa onyesho jeupe. JazaRect (19, 20, 90, 32, NYEUSI); // msingi wazi wa onyesho la maandishi.setTextColor (NYEUPE); Kuweka Mshale (35, 25); onyesha.setTextSize (2); // kubwa ya kuonyesha font.println ("NYOKA"); // x y w h r kol onyesha.drawRoundRect (33, 22, 62, 20, 4, NYEUPE); // onyesho la Nyoka mpaka. RrawRect (19, 20, 90, 32, WHITE); // kisanduku cha mpaka - onyesho 3. Seti Mshale (28, 42); onyesha.setTextSize (0); // font kurudi kwenye onyesho la kawaida.println ("bonyeza kitufe chochote"); onyesha.display (); kusubiri = digitalRead (INTPIN); // angalia kuona ikiwa kitufe cha kusubiri kilichobadilishwa kitabadilika hadi kuishia 1 wakati kifungo kimefungwa = 0; // kitufe cha kuweka upya bonyeza}} // -------------------- - CHORA rangi ya kuingiza laini ya uint8_t -------------- ----- utupu wa kutekaALineForMe (uint8_t clr) {uint8_t line1X, line1Y, line2X, line2Y = 0; // weka uratibu wa nasibu kwa laini kisha uichora // kutofautisha sio chini tena line1X = random (worldMinX + 1, worldMaxX-1); line1Y = nasibu (worldMinY + 1, worldMaxY-1); line2X = bila mpangilio (worldMinX + 1, worldMaxX-1); line2Y = nasibu (worldMinY + 1, worldMaxY-1); onyesha.drawLine (line1X, line1Y, line2X, line2Y, clr); } // ------------------------------------- mgongano wa mgongano ---- -----------------------

kwa (byte i = 4; i <snakeSize; i ++) {if (snakeX == snakePosX && snakeY == snakePosy ) {kurudi 1; toni (SND, 2000, 20); toni (SND, 1000, 20); } kurudi 0; }

// --------------------------------- KUWEKA -------------- -------------------------------

kuanzisha batili () {kuchelewesha (100); // tu toa vitu nafasi ya "boot" // Serial.begin (9600); // ondoa alama hii ikiwa unataka kuona onyesho la matokeo ya serial. anza (SSD1306_SWITCHCAPVCC, 0x3C); onyesha wazi Cleplay (); // anza na onyesho safi la onyesho.setTextColor (NYEUPE); // weka saizi ya mzunguko wa rangi ya maandishi n.k kuonyesha. onyesha.setTextWrap (uwongo); onyesha.dim (0); // kuweka pinMode ya kuonyesha ukali (INTPIN, INPUT); // weka bandari sahihi kwa pembejeo za pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT); // hii ndio amri ya kuingiliana hii "inasimamisha" arduino kusoma pembejeo // amri- kazi- pini-kazi kutekeleza hali ya pini ambatishaInterrupt (digitalPinToInterrupt (INTPIN), kukatizwa, KUPANDA); // Serial.println ("Usanidi Umepita"); subiri kwa habari (); // onyesha mahali pa skrini ya kuanzisha nyokaScran (); // weka chakula cha kwanza} // --------------------- MTANDAO KUU ---- ---------------------- kitanzi batili () {updateGame (); // kazi hii ndiyo inayobeba nambari kuu}

Hatua ya 3:

Ilipendekeza: