Obsah:

Arduino OLED Snake Game: 3 kroky
Arduino OLED Snake Game: 3 kroky

Video: Arduino OLED Snake Game: 3 kroky

Video: Arduino OLED Snake Game: 3 kroky
Video: Arduino návody | LCD Shield 16x2 a tlačítka 2024, Júl
Anonim
Arduino OLED Snake Game
Arduino OLED Snake Game

Ahoj, vitajte, v našich pokynoch na výrobu a arduino OLED hry, k tomuto projektu došlo, keď sme sa pokúšali vytvoriť vôbec prvú hru s arduinom, ahoj, mysleli sme si, kde začať lepšie ako klasický had Nokia (dobre na aspoň hadí klon:)).

Čo budete potrebovať

Zásoby

Arduino UNO alebo klon

OLED displej

4 diódy

Odpor 500-1k

4 tlačidlá ovládača

Pasívny piezoelektrický bzučiak

voliteľné

Bezpájková chlebová doska

Tieto odkazy sú napríklad iba

Krok 1: Okruh

Okruh
Okruh

Na vyššie uvedenom obrázku môžete vidieť náš obvod, na arduine používame pin d3 ako pin na žiadosť o prerušenie, takže arduino dá prednosť čítaniu vstupov regulátora, ktoré sú d4 d5 d6 d7. Základom obvodu je, že sa stlačí smerové tlačidlo, ktoré stúpne na 5 V, čím sa aktivuje pin žiadosti o prerušenie (fialový vodič d3) a zodpovedajúci smerový kolík, funkcia prerušenia vyvolá funkciu aktualizácie smeru a kód podľa toho pohne hadom. Pin 9 sa používa ako zvukový kolík, pretože je to PWM (~ modulácia šírky impulzov), ktorá je pripojená priamo k 5v piezo konektoru + a - sa vráti na 0v/zem.

(FYI na arduino uno a klonoch iba d2 a d3 môžu fungovať ako kolíky so žiadosťou o prerušenie).

Smerové kolíky:

d4 hore ORANŽOVÁ

d5 Dole RUŽOVÁ

d6 Vľavo MODRÁ

d7 Vpravo HNEDÁ

d9 zvuk SIVÝ

Každé tlačidlo má vstup pre pripojenie 5 V a výstup, ktorý je najskôr pripojený k ich príslušnému digitálnemu vstupu na Arduine, rovnaký výstup pre každé tlačidlo je potom pripojený k vlastnej dióde, pomocou diód zastavíme prívod napätia späť do ďalšie tlačidlá a ich aktivácia. Na katódovom (-) konci všetkých 4 diód ich spojíme a vytvoríme výstupné spojenie, ktoré sa spojí s d3 a potom cez odpor na 0 V/zem, aby vytiahlo arduino piny nízko, aby nezanechávalo plávajúce piny, keď nie sú aktivovaný.

(FYI, plávajúci kolík môže prijímať fantómové napätie a spôsobovať neobvyklé správanie)

Na ovládanie displeja sú použité 2 analógové piny, to sú hardvérové piny arduino i2c.

A5 je pripojený k SCL ŽLTÝ

A4 je pripojený k SDA GREEN

Výstup +5v a 0v (uzemnenie) z arduina sa používa ako zdroj energie pre celý obvod, ktorý je možné napájať pomocou USB alebo telefónnej nabíjačky.

Krok 2: Kód

// ------------------------ Hry ANJAWARE SNAKE S pomocou ľudí z netu --------------- -------

#zahrnúť

#include // https://github.com/adafruit/Adafruit-GFX-Library #include // https://github.com/adafruit/Adafruit-GFX-Library // sada zobrazení (šírka, výška) Adafruit_SSD1306 displej (128, 64); // definujte vstupné piny to sú piny na Arduine, ktoré sa nikdy nezmenia, takže #define #define INTPIN 3 // iba piny 2 a 3 môžu byť prerušovacie piny na UNO #define UPPIN 4 // to sú piny spojené tp relevantný prepínač #define DWNPIN 5 #define LFTPIN 6 #define RHTPIN 7 #define SND 9 // definovať smery #define DIRUP 1 // tieto hodnoty určuje „had“, aby sa rozhodol- #define DIRDOWN 2 // smer, ktorým sa bude had pohybovať # definovať DIRLEFT 3 #define DIRRIGHT 4

// nastavenie premenných tlačidiel

// volitile cos potrebujeme, aby sa aktualizoval s prerušením, aby mohol byť akýkoľvek bit hodnoty cyklu

// nikdy nie je vyšší ako 4, takže na uloženie zdrojov potrebuje iba 8bit int nestály uint8_t buttonpressed = 0; bool butup = 0; bool butdown = 0; // toto použijeme na nastavenie true na „detekciu“, ktorým smerom stlačené bool butleft = 0; bool butright = 0;

// hadie inty

byte snakePosX [30]; // pole na vytvorenie tela hadieho bajtu snakePosY [30];

int hadX = 30; // poloha hlavy hada

int hadYY = 30; int snakeSize = 1; // počet veľkostí hada obmedzený na veľkosť poľa

// svetovci

uint8_t worldMinX = 0; // tieto stanovujú limity hracej plochy

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

// zbieranie scranu (jedla) a polohy scranu

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

// skóruje premenné

dlhé skóre hry = 0; dlhé skóre = 30; // nastavenie vysokého skóre na 3 body ako východiskový bod

// --------------------------- toto je to, čo prerušenie vykonáva pri náraste napätia ------------ -------------

void interruptpressed () {delay (150); // mierne oneskorenie pre pridanú ochranu "odraziť" updatedirection (); } // ------------------ aktualizujte hodnotu smeru stlačením tlačidla ----------------- void updatedirection () { // Serial.println ("Updatedirection"); butup = digitalRead (UPPIN); // skontrolujte, ktorý vstup bol vysoký, a nastavte príslušný bool true butdown = digitalRead (DWNPIN); butleft = digitalRead (LFTPIN); butright = digitalRead (RHTPIN); // tieto, ak sa prvky pozerajú na to, ktorý vstup bol vysoký, a zadajú príslušnú hodnotu do premennej „stlačené tlačidlo“//, táto premenná určuje smer pohybu, ak (butup == true) {buttonpressed = DIRUP; // Serial.println ("stlačené HORE"); // Serial.println (stlačené tlačidlo); butup = false; tón (SND, 1500, 10); } if (butdown == true) {buttonpressed = DIRDOWN; // Serial.println ("DOLE stlačené"); // Serial.println (stlačené tlačidlo); butdown = false; tón (SND, 1500, 10); }

ak (butleft == true)

{buttonpressed = DIRLEFT; // Serial.println ("Vľavo stlačené"); // Serial.println (stlačené tlačidlo); butleft = false; tón (SND, 1500, 10); } if (butright == true) {buttonpressed = DIRRIGHT; // Serial.println ("PRAVO stlačené"); // Serial.println (stlačené tlačidlo); butright = nepravda; tón (SND, 1500, 10); }}

// -------------------------- nakreslite zobrazovacie rutiny ------------------ -----------------

void updateDisplay () // kreslenie skóre a obrysov

{// Serial.println ("Aktualizovať zobrazenie");

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

display.setTextSize (0); display.setTextColor (BIELY); // kreslenie skóre display.setCursor (2, 1); display.print ("Skóre:"); display.print (String (hracie skóre, DEC)); display.setCursor (66, 1); display.print ("Vysoká:"); display.print (String (highscore, DEC)); // nakresliť hraciu plochu // poz 1x, 1r, 2x, 2r, farebný displej.drawLine (0, 0, 127, 0, BIELY); // veľmi horný okraj display.drawLine (63, 0, 63, 9, WHITE); // oddeľovač skóre display.drawLine (0, 9, 127, 9, BIELY); // pod okrajom textu display.drawLine (0, 63, 127, 63, WHITE); // zobrazenie spodného okraja.drawLine (0, 0, 0, 63, BIELY); // display left left.drawLine (127, 0, 127, 63, WHITE); // pravý okraj

}

// ----------------------------------- aktualizácia oblasti prehrávania ---------- --------------------

void updateGame () // toto aktualizuje zobrazenie hernej oblasti

{display.clearDisplay ();

display.drawPixel (scranPosX, scranPosY, WHITE);

scranAte = scranFood ();

// kontrola hadích rutín

if (outOfArea () || selfCollision ())

{ koniec hry(); }

// zobraz hada

pre (int i = 0; i0; i--) {snakePosX = snakePosX [i-1]; snakePosY = snakePosY [i-1]; } // pridajte k hadovi ďalší pixel, ak (scranAte) {snakeSize+= 1; snakePosX [snakeSize-1] = snakeX; snakePosY [snakeSize-1] = snakeY; }

prepínač (stlačené tlačidlo) // bol snakeDirection

{case DIRUP: snakeY- = 1; prestávka; prípad DIRDOWN: snakeY+= 1; prestávka; prípad DIRLEFT: snakeX- = 1; prestávka; prípad PRÁVO: hadX+= 1; prestávka; } snakePosX [0] = snakeX; snakePosY [0] = snakeY; updateDisplay (); display.display (); // --------------------- umiestnite scran -------------------

prázdne miestoScran ()

{scranPosX = random (worldMinX+1, worldMaxX-1); scranPosY = random (worldMinY+1, worldMaxY-1); } // ------------------------ SCRAN ATE POINT UP ---------------- bool scranFood () {if (snakeX == scranPosX && snakeY == scranPosY) {playscore = playscore+10; tón (SND, 2000, 10); updateDisplay (); placeScran (); návrat 1; } else {vrátiť 0; }} // --------------------- mimo oblasti ---------------------- bool outOfArea () {return snakeX = worldMaxX || snakeY = worldMaxY; } //---------------------- koniec hry----------------------- --- void gameOver () {uint8_t rectX1, rectY1, rectX2, rectY2; rectX1 = 38; rectY1 = 28; rectX2 = 58; rectY2 = 12; display.clearDisplay (); display.setCursor (40, 30); display.setTextSize (1); tón (SND, 2000, 50); display.print („HRA“); tón (SND, 1000, 50); display.print („NAD“); if (playscore> = highscore) // skontroluje, či je skóre vyššie ako vysoké skóre {highscore = gamescore; // single if statment to update high score} for (int i = 0; i <= 16; i ++) // this is to draw straightanlges around game over {display.drawRect (rectX1, rectY1, rectX2, rectY2, WHITE); Serial.println ("if loop"); display.display (); rectX1- = 2; // posun o 2 pixely rectY1- = 2; rectX2+= 4; // posun o 2 pixely z posledného bodu rectY2+= 4; tón (SND, i*200, 3); } display.display (); // Vymazanie obrazovky po sláve nad rectX1 = 0; // nastavenie počiatočnej polohy riadka rectY1 = 0; rectX2 = 0; rectY2 = 63; pre (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; // reset hada a detailu hráča snakeSize = 1; snakeX = display.width ()/2; hadY = display.height ()/2; waitForPress (); // počkajte, kým hráč začne hru} // ------------------------- čakajte na stlačenie slučky ---------- --------------- neplatné čakanieForPress () {bool čakanie = 0; // slučka končí, keď je to pravda, display.clearDisplay (); while (waiting == 0) {drawALineForMe (WHITE); // nakreslite náhodnú bielu čiaru drawALineForMe (ČIERNA); // nakreslite náhodnú čiernu čiaru, aby obrazovka úplne nevyplnila biely displej.fillRect (19, 20, 90, 32, ČIERNY); // prázdne pozadie pre textový display.setTextColor (WHITE); display.setCursor (35, 25); display.setTextSize (2); // väčšie písmo display.println ("SNAKE"); // x y w h r col display.drawRoundRect (33, 22, 62, 20, 4, WHITE); // orámovanie Snake display.drawRect (19, 20, 90, 32, WHITE); // ohraničovací rámček - 3 display.setCursor (28, 42); display.setTextSize (0); // písmo späť na normálne zobrazenie.println ("stlačte ľubovoľné tlačidlo"); display.display (); čakanie = digitalRead (INTPIN); // skontrolujte, či sa čakanie po stlačení klávesu zmení na 1, ktoré sa pri stlačení tlačidla skončí = 0; // tlačidlo reset reset stlačiť}} // -------------------- NAKRESNI farbu náhodného riadka na vstup uint8_t -------------- ----- neplatné drawALineForMe (uint8_t clr) {uint8_t line1X, line1Y, line2X, line2Y = 0; // nastavte náhodné súradnice pre čiaru a potom ju nakreslite // premenná nie menej nie viac riadok1X = náhodný (worldMinX+1, worldMaxX-1); riadok1Y = náhodný (worldMinY+1, worldMaxY-1); riadok2X = náhodný (worldMinX+1, worldMaxX-1); riadok2Y = náhodný (worldMinY+1, worldMaxY-1); display.drawLine (line1X, line1Y, line2X, line2Y, clr); } // ------------------------------------- detekcia kolízií -------- -----------------------

for (byte i = 4; i <snakeSize; i ++) {if (snakeX == snakePosX && snakeY == snakePosy ) {return 1; tón (SND, 2000, 20); tón (SND, 1000, 20); } vrátiť 0; }

//-------------------------------- NASTAVIŤ--------------- -------------------------------

void setup () {delay (100); // len dajte veciam šancu „nabootovať“// Serial.begin (9600); // odškrtnite, ak chcete vidieť zobrazenie sériových výstupov.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); // začnite s čistým displejom display.setTextColor (WHITE); // nastavte veľkosť otáčania farieb textu atď. display.setRotation (0); display.setTextWrap (false); display.dim (0); // nastavenie pinu jasu displeja (INTPIN, INPUT); // nastavenie správnych portov na vstupy pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT); // toto je príkaz prerušenia, ktorý „zastaví“arduino, aby prečítal vstupy // príkaz- funkcia- pin-funkcia na vykonanie podmienky na pine attachInterrupt (digitalPinToInterrupt (INTPIN), prerušené stlačenie, RISING); // Serial.println ("Nastavenie prešlo"); waitForPress (); // zobrazenie úvodnej obrazovky hada miestoScran (); // umiestnite prvý kúsok jedla} // --------------------- HLAVNÍ SMYČKA ----------------- ---------------------- void loop () {updateGame (); // táto funkcia nesie hlavný kód}

Krok 3:

Odporúča: