Obsah:
Video: Arduino OLED Snake Game: 3 kroky
2024 Autor: John Day | [email protected]. Naposledy zmenené: 2024-01-30 11:57
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
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:
Reckless Racer Arduino OLED Game, AdafruitGFX a Bitmaps Základy: 6 krokov
Základy hry OLED hry Reckless Racer Arduino, AdafruitGFX a Bitmaps: V tomto tutoriále sa pozrieme na to, ako používať bitmapy pomocou knižnice Adafruit_GFX.c ako druhu škriatkov v hre. Najjednoduchšia hra, o ktorej by sme si mohli myslieť, je hra s autom na zmenu jazdného pruhu, na konci náš beta tester a asistent kodéra
HowTo - Esp -12F Mini WiFi modul ESP8266 18650 Nodemcu Batterie 0,96”OLED DEMO Via Arduino GUI: 4 kroky
HowTo - Esp -12F Mini WiFi Modul ESP8266 18650 Nodemcu Batterie 0,96”OLED DEMO Via Arduino GUI: Dobrý deň, veľa možností pre váš OLED displej. Viac informácií nájdete na tejto stránke, napríklad ich ARDUINO GUI zum schreiben des CODEs und zum hochladen der Firmwa
Klon Arduboy s displejom Arduino Nano a I2C Oled: 3 kroky
Klon Arduboy s displejom Arduino Nano a I2C Oled: Lacná verzia klonu Arduboy, s ktorou si môžete zahrať množstvo originálnych hier Arduboy
JEDNODUCHÉ zobrazenie údajov senzora OLED Arduino OLED: 4 kroky
JEDNODUCHÉ zobrazenie údajov senzora OLED Arduino OLED: Ak ste niekedy pracovali s Arduinom, pravdepodobne ste chceli, aby zobrazoval hodnoty zo senzorov. Pri použití starého klasického LCD displeja Nokia 5110 ste si možno všimli, že pripojenie všetkých týchto vodičov je neporiadok a zaberá príliš veľa pinov. Samozrejme, existuje lepší
NÁVRH MENU ARDUINO S OLED-UI (UŽÍVATEĽSKÉ ROZHRANIE): 4 kroky
NÁVRH ARDUINO MENU S OLED-UI (UŽÍVATEĽSKÉ ROZHRANIE): Hej, všetci! V tomto návode sa pokúsim vysvetliť, ako vytvoriť NÁVRH MENU ARDUINO pomocou OLED obrazovky i2c. Je tiež známy ako UI (používateľské rozhranie). Používa sa v mnohých projektoch, ale musíte ho poznať z 3D tlačiarní :) Tu nájdete aj video