Sisukord:

Arduino OLED madu mäng: 3 sammu
Arduino OLED madu mäng: 3 sammu

Video: Arduino OLED madu mäng: 3 sammu

Video: Arduino OLED madu mäng: 3 sammu
Video: Автоматический Дозатор флюса на Ардуино! 2024, Juuli
Anonim
Arduino OLED madu mäng
Arduino OLED madu mäng

Tere ja tere tulemast, meie juhendite järgi, kuidas teha ja arduino OLED -mängu, see projekt sündis, kui me üritasime oma esimest mängu arduinoga teha, niiii, mõtlesime, kust alustada paremini kui nokia klassikaline Snake (noh vähemalt madukloon:)).

Mida vajate

Tarvikud

Arduino UNO või kloon

OLED -ekraan

4 dioodi

500-1k takisti

4 juhtnuppu

Passiivne Piezo summer

vabatahtlik

Jooteta leivaplaat

Pange tähele, et need lingid on ainult näiteks

1. samm: vooluring

Ringkond
Ringkond

Ülaltoodud pildil näete meie vooluringi, me kasutame arduino tihvti d3 katkestamise taotluspistikuna, nii et arduino eelistab kontrolleri sisendite lugemist, mis on d4 d5 d6 d7. Vooluahela põhitõed on see, et vajutatakse suunanuppu, mis läheb kõrgele 5v, see aktiveerib katkestamise taotluse tihvti (d3 lilla traat) ja vastava suunaga tihvti, katkestusfunktsioon kutsub esile värskendussuuna funktsiooni ja see kood liigutab madu vastavalt. Tihvti 9 kasutatakse helipistikuna, kuna see on PWM (~ impulsi laiuse modulatsioon), mis on ühendatud otse + pinti 5v pieso külge ja - läheb tagasi 0v/maapinnale.

(FUI arduino uno ja kloonide puhul ainult d2 ja d3 võivad toimida katkestusnõuetena).

Suuna tihvtid:

d4 ÜLES oranž

d5 alla roosa

d6 Vasak sinine

d7 Paremale Pruun

d9 heli HALL

Igal nupul on 5 V ühenduse sisend ja väljund, mis on kõigepealt ühendatud nende vastava digitaalsisendiga arduino'is, iga nupu sama väljund ühendatakse seejärel oma dioodiga, me kasutame dioode, et peatada pinge tagasivool muud nupud ja nende aktiveerimine. Kõigi nelja dioodi katoodi (-) otsas ühendame need kokku, et luua väljundühendus, mis ühendub d3-ga ja seejärel läbi takisti 0v/maanduseni, et tõmmata arduino tihvtid madalale, et mitte jätta ujuvaid kontakte, kui neid pole aktiveeritud.

(FYI ujuv tihvt võib saada fantoompinget ja põhjustada ebatavalist käitumist)

Ekraani juhtimiseks kasutatakse 2 analoog -tihvti, need on arduino riistvara i2c tihvtid.

A5 on ühendatud SCL YELLOW -ga

A4 on ühendatud SDA GREENiga

Arduino +5v ja 0v (maandus) väljundit kasutatakse kogu vooluahela toiteallikana, mida saab toita USB- või telefonilaadijaga.

2. samm: kood

// ------------------------ ANJAWARE SNAKE Mängud Võrgurahvaste abiga --------------- -------

#kaasake

#include // https://github.com/adafruit/Adafruit-GFX-Library #include // https://github.com/adafruit/Adafruit-GFX-Library // kuva komplekt (laius, kõrgus) Adafruit_SSD1306 kuva (128, 64); // defineerige sisendpoldid need on arduino nööpnõelad, mida nad kunagi ei muuda, nii et #define #define INTPIN 3 // ainult nööpnõelad 2 ja 3 võivad olla katkestatud nööpnõelad UNO #define UPPIN 4 // need on ühendatud tihvtidega tp asjakohane lüliti #define DWNPIN 5 #define LFTPIN 6 #define RHTPIN 7 #define SND 9 // määratlege juhised #define DIRUP 1 // need väärtused on see, mida "madu" otsustab, et otsustada- #define DIRDOWN 2 // madu liikumissuund # määratle DIRLEFT 3 #define DIRRIGHT 4

// määrake nuppude muutujad

// volitile cos me vajame seda koos katkestusega värskendamiseks, nii et see võib olla mis tahes tsükli väärtus

// ei ole kunagi kõrgem kui 4, seega on ressursside säästmiseks vaja ainult 8 -bitist int. lenduv uint8_t nuppu vajutatud = 0; bool butup = 0; bool butdown = 0; // me kasutame seda tõeseks "tuvastamiseks", mis suunas vajutati bool butleft = 0; bool butright = 0;

// ussipesad

bait snakePosX [30]; // massiiv, et teha madu keha bait snakePosY [30];

int maduX = 30; // madu pea asend

int maduY = 30; int snakeSize = 1; // madude suuruse arv on piiratud massiivi suurusega

// maailma ints

uint8_t worldMinX = 0; // need seavad mänguala piirid

uint8_t worldMaxX = 128; uint8_t worldMinY = 10; uint8_t worldMaxY = 63;

// scrani (toidu) ja scrani positsiooni kogumine

bool scranAte = 0; uint8_t scranPosX = 0; uint8_t scranPosY = 0;

// hindab muutujaid

pikk mängutulem = 0; pikk rekord = 30; // määrake lähtepunktiks kõrge tulemus 3

// --------------------------- seda täidab katkend pinge tõusu korral ------------ -------------

void interruptpressed () {delay (150); // kerge viivitus lisatud "põrgatus" kaitse uuendatud suunas (); } // ------------------ suuna väärtuse värskendamine nupuvajutusega ----------------- void updatedirection () { // Serial.println ("updatingdirection"); butup = digitalRead (UPPIN); // kontrollige, milline sisend läks kõrgeks ja määrake asjakohane bool true butdown = digitalRead (DWNPIN); butleft = digitalRead (LFTPIN); butright = digitalRead (RHTPIN); // need, kui parameetrid vaatavad, milline sisend läks kõrgele ja sisestab vastava väärtuse "nupuvajutusega" //, see muutuja dikteerib liikumissuuna, kui (butup == true) {buttonpressed = DIRUP; // Serial.println ("UP vajutatud"); // Serial.println (nupule vajutatud); butup = vale; toon (SND, 1500, 10); } if (butdown == true) {nuppu vajutatud = DIRDOWN; // Serial.println ("DOWN vajutatud"); // Serial.println (nupule vajutatud); butdown = vale; toon (SND, 1500, 10); }

kui (butleft == tõsi)

{nupule vajutatud = DIRLEFT; // Serial.println ("LEFT vajutatud"); // Serial.println (nupule vajutatud); butleft = vale; toon (SND, 1500, 10); } if (butright == true) {nuppu vajutatud = ÕIGE; // Serial.println ("PAREMALT vajutatud"); // Serial.println (nupule vajutatud); butright = vale; toon (SND, 1500, 10); }}

// -------------------------- joonistage kuvamisrutiinid ------------------ -----------------

void updateDisplay () // joonista punktid ja piirjooned

{// Serial.println ("Värskenda kuva");

display.fillRect (0, 0, display.width ()-1, 8, BLACK);

display.setTextSize (0); display.setTextColor (VALGE); // tulemuste joonistamine display.setCursor (2, 1); display.print ("Score:"); display.print (String (mängutulemus, DEC)); display.setCursor (66, 1); display.print ("Kõrge:"); display.print (String (rekord, DEC)); // mänguala joonistamine // pos 1x, 1y, 2x, 2y, värviekraan.drawLine (0, 0, 127, 0, WHITE); // väga ülemise piiri kuva.drawLine (63, 0, 63, 9, WHITE); // skoori eraldaja display.drawLine (0, 9, 127, 9, WHITE); // teksti äärise kuvamise all.drawLine (0, 63, 127, 63, WHITE); // alumise äärise kuva.drawLine (0, 0, 0, 63, VALGE); // vasakpoolne ääris. DrawLine (127, 0, 127, 63, WHITE); // parem äär

}

// ----------------------------------- värskendage mänguväljakut ---------- --------------------

void updateGame () // see värskendab mänguala kuva

{display.clearDisplay ();

display.drawPixel (scranPosX, scranPosY, WHITE);

scranAte = scranFood ();

// kontrollige madude rutiine

kui (outOfArea () || selfCollision ())

{ mäng läbi(); }

// kuva madu

jaoks (int i = 0; i0; i--) {snakePosX = snakePosX [i-1]; snakePosY = snakePosY [i-1]; } // lisage madule lisapiksel if (scranAte) {snakeSize+= 1; snakePosX [snakeSize-1] = snakeX; snakePosY [snakeSize-1] = snakeY; }

lüliti (nupule vajutatud) // oli snakeDirection

{juhtum DIRUP: snakeY- = 1; murda; juhtum DIRDOWN: snakeY+= 1; murda; juhtum DIRLEFT: snakeX- = 1; murda; juhtum ÕIGE: maduX+= 1; murda; } snakePosX [0] = snakeX; snakePosY [0] = snakeY; updateDisplay (); display.display (); // -------------------- asetage skran -------------------

tühi kohtScran ()

{scranPosX = juhuslik (worldMinX+1, worldMaxX-1); scranPosY = juhuslik (worldMinY+1, worldMaxY-1); } // ------------------------ SCRAN ATE POINT UP ---------------- bool scranFood () {if (snakeX == scranPosX && snakeY == scranPosY) {playcore = mängutulemus+10; toon (SND, 2000, 10); updateDisplay (); placeScran (); tagasitulek 1; } muu {return 0; }} // --------------------- piirkonnast väljas ---------------------- bool outOfArea () {return snakeX = worldMaxX || snakeY = worldMaxY; } //---------------------- mäng läbi----------------------- --- tühine gameOver () {uint8_t rectX1, rectY1, rectX2, rectY2; rectX1 = 38; rectY1 = 28; rectX2 = 58; rectY2 = 12; display.clearDisplay (); display.setCursor (40, 30); display.setTextSize (1); toon (SND, 2000, 50); display.print ("MÄNG"); toon (SND, 1000, 50); display.print ("OVER"); if (mängutulemus> = rekord) // kontrollige, kas skoor on kõrgem kui rekord {tipptulemus = mängutulemus; // üksik, kui lause, et värskendada kõrgeid tulemusi} jaoks (int i = 0; i <= 16; i ++) // see on selleks, et joonistada mängu ümber ristkülikud üle {display.drawRect (rectX1, rectY1, rectX2, rectY2, WHITE); Serial.println ("kui silmus"); display.display (); rectX1- = 2; // nihutamine 2 piksli võrra rectY1- = 2; rectX2+= 4; // nihutamine üle 2 piksli viimasest punktist rectY2+= 4; toon (SND, i*200, 3); } display.display (); // Ekraani pühkimine pärast kuulsust rectX1 = 0; // seada rea alguspunkti rectY1 = 0; rectX2 = 0; rectY2 = 63; jaoks (int i = 0; i <= 127; i ++) {uint8_t cnt = 0; display.drawLine (rectX1, rectY1, rectX2, rectY2, BLACK); rectX1 ++; rectX2 ++; display.display (); } display.clearDisplay (); playcore = 0; // nullida madu ja mängija andmed snakeSize = 1; snakeX = kuva.laius ()/2; maduY = kuva.kõrgus ()/2; waitForPress (); // oodake, kuni mängija mängu alustab} // ------------------------- oodake presside silmust ---------- --------------- void waitForPress () {bool waiting = 0; // tsükkel lõpeb, kui see on tõsi display.clearDisplay (); while (ootamine == 0) {drawALineForMe (VALGE); // juhusliku valge joone joonistamine drawALineForMe (BLACK); // tõmmake juhuslik must joon nii, et ekraan ei täidaks täielikult valget ekraani.fillRect (19, 20, 90, 32, BLACK); // teksti kuvamise tühi taust.setTextColor (VALGE); display.setCursor (35, 25); display.setTextSize (2); // suurem font display.println ("SNAKE"); // x y w h r col display.drawRoundRect (33, 22, 62, 20, 4, WHITE); // ääris Snake display.drawRect (19, 20, 90, 32, VALGE); // piirikast - 3 kuva.setCursor (28, 42); display.setTextSize (0); // font tagasi normaalsele kuvale.println ("vajutage suvalist klahvi"); display.display (); ootamine = digitalRead (INTPIN); // kontrollige, kas klahvivajutus ootamine muutub 1 -ks lõpuks, samal ajal kui nuppu vajutatakse = 0; // lähtestusnupu vajutamine}} // -------------------- JOONISTA juhusliku rea sisendvärv uint8_t -------------- ----- tühi drawALineForMe (uint8_t clr) {uint8_t line1X, line1Y, line2X, line2Y = 0; // määrake sirgele juhuslikud koordinaadid ja joonistage see // muutuja mitte vähem mitte rohkem line1X = juhuslik (worldMinX+1, worldMaxX-1); rida1Y = juhuslik (maailmMinY+1, maailmMaxY-1); line2X = juhuslik (worldMinX+1, worldMaxX-1); rida2Y = juhuslik (maailmMinY+1, maailmMaxY-1); display.drawLine (line1X, line1Y, line2X, line2Y, clr); } // ------------------------------------ kokkupõrke tuvastamine -------- -----------------------

jaoks (bait i = 4; i <snakeSize; i ++) {if (snakeX == snakePosX && snakeY == snakePosy ) {return 1; toon (SND, 2000, 20); toon (SND, 1000, 20); } tagasitulek 0; }

// -------------------------------- SEADISTUS --------------- -------------------------------

void setup () {delay (100); // lihtsalt anna kraamile võimalus "alglaadida" // Serial.begin (9600); // tühjendage märkeruut, kui soovite näha jadaväljundite kuva.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); // alustada puhta kuvariga display.setTextColor (WHITE); // seadistada teksti värvipööramise suurus jne display.setRotation (0); display.setTextWrap (vale); display.dim (0); // määrab ekraani heleduse pinMode (INTPIN, INPUT); // määrake sisenditele õiged pordid pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT); // see on vahepealne käsk, mis "peatab" arduino sisendite lugemiseks // käsk- funktsioon- nööpnõel-funktsioon täitmiseks tingimus tihvti kinnitamiseksInterrupt (digitalPinToInterrupt (INTPIN), katkestatud, RISING); // Serial.println ("Seadistus läbitud"); waitForPress (); // kuvab madu käivitamise ekraani placeScran (); // asetage esimene toiduaine} // --------------------- PÕHILOOP ----------------- ---------------------- void loop () {updateGame (); // see funktsioon kannab põhikoodi}

3. samm:

Soovitan: