Sisukord:
Video: Arduino OLED madu mäng: 3 sammu
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:47
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
Ü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:
3D -trükitud madu robot: 7 sammu (piltidega)
3D -prinditud madu robot: Kui ma sain oma 3D -printeri, hakkasin mõtlema, mida ma sellega teha saan. Trükkisin palju asju, kuid tahtsin 3D -printimise abil teha terve konstruktsiooni. Siis mõtlesin teha robotlooma. Minu esimene mõte oli teha koer või ämblik, aga ennäe
NeoPixelsi maatriks ja madu mäng: 4 sammu
NeoPixels Matrix : Snake Game: Kas mäletate veel ussimängu, mida mängisime lapsepõlves oma mängukastis või mobiiltelefonis? Täna õpime, kuidas teha madumängu 8*8 NeoPixels Matrix abil. Valime juhtimiskeskuseks Arduino uno ja juhthoova avamooduli
Madu leivalaual: 3 sammu (piltidega)
Madu leivalaual: "Kas teie telefonis on mänge?" "Mitte täpselt." Sissejuhatus: Snake on inseneride lemmikprojektiks saanud lihtsalt juhitav, hõlpsasti programmeeritav ja Nokia 6110 poolt jäädvustatud. Seda on rakendatud kõigest LED -maatriksitest, L
Simoni mäng - lõbus mäng!: 5 sammu
Simoni mäng - lõbus mäng !: Viide: siinPärast pikka nädalavahetust peate kindlasti kõvasti proovima, et täita kõik ülesanded ja töö, mille eest vastutate. Meil on aeg oma aju treenida, kas pole? Peale nende igavate ja mõttetute mängude on olemas ka mäng nimega Simon Game
Lülitiga kohandatavad mänguasjad: munakaugjuhtimisega madu on ligipääsetav!: 7 sammu (piltidega)
Lülitiga kohandatavad mänguasjad: munaga kaugjuhtimisega madu on ligipääsetav !: Mänguasjade kohandamine avab uusi võimalusi ja kohandatud lahendusi, mis võimaldavad piiratud motoorsete võimete või arenguhäiretega lastel mänguasjadega iseseisvalt suhelda. Paljudel juhtudel ei suuda kohandatud mänguasju vajavad lapsed