Мазмұны:

Arduino OLED жылан ойыны: 3 қадам
Arduino OLED жылан ойыны: 3 қадам

Бейне: Arduino OLED жылан ойыны: 3 қадам

Бейне: Arduino OLED жылан ойыны: 3 қадам
Бейне: Aurduino Snake Project 2024, Шілде
Anonim
Arduino OLED жыландары ойыны
Arduino OLED жыландары ойыны

Сәлем, қош келдіңіз, біздің OLED ойынын қалай жасау керектігі туралы нұсқаулықтарымызға, бұл жоба біз бірінші ойынымызды arduino, soooo -мен ойнауға тырысқан кезде пайда болды, біз nokia classic Snake -тен қайдан бастау керек деп ойладық. кем дегенде жылан клоны:)).

Сізге не қажет болады

Жабдықтар

Arduino UNO немесе клон

OLED дисплейі

4 диодтар

500-1 к резистор

4 контроллер түймесі

Пассивті пьезо дыбысы

міндетті емес

Піспейтін нан тақтасы

Назар аударыңыз, бұл сілтемелер тек қана

1 -қадам: Цикл

Цикл
Цикл

Жоғарыдағы суретте сіз біздің тізбекті көре аласыз, біз arduino d4 d5 d6 d7 контроллерінің кірістерін оқуға басымдық беретін ардуинодағы d3 түйреуін үзіліс сұрау түйреуіші ретінде қолданамыз. Схеманың негізі мынада: 5 в жоғары көтерілетін бағыттау түймесі басылады, бұл үзіліс сұранысының түйреуішін (d3 күлгін сым) және сәйкес бағытты түйреуішті іске қосады, үзіліс функциясы жаңарту бағытының функциясын шақырады және бұл код жыланды сәйкесінше жылжытады. 9 түйреуіш дыбыстық түйреуіш ретінде пайдаланылады, себебі ол PWM (~ импульстің ені модуляциясы), ол + түйреуіште 5В пьезоға тікелей қосылады - 0v/жерге қайтады.

(Arduino uno және d2 мен d3 клондарындағы FYI үзіліс сұрау түйреуіштері ретінде әрекет ете алады).

Бағыттауыш түйреуіштер:

d4 ОРАНЖА жоғары

d5 төменгі PINK

d6 Сол жақ КӨК

d7 Оң жақ ҚАУЫР

d9 дыбысы сұр

Әр түймеде 5 вольтты қосылым кірісі және алдымен arduino -дағы тиісті цифрлық кіріске қосылған шығыс бар, әр түйменің дәл сол шығысы өз диодына қосылады, біз диодтарды кернеуді қайта беруді тоқтату үшін қолданамыз. басқа түймелер және оларды іске қосу. Барлық 4 диодтың катодында (-) ұшында біз d3-ке қосылатын шығыс түйінін құру үшін оларды біріктіреміз, содан кейін резистор арқылы 0v/жерге дейін ардуино түйреуіштерін төмен түсіріп, қалқымалы түйреуіштерді қалдырмау үшін. белсендірілген.

(FYI өзгермелі түйреуіш фантомдық кернеуді қабылдай алады және әдеттен тыс мінез -құлықты тудыруы мүмкін)

Дисплейді басқару үшін 2 аналогты түйреуіш қолданылады, бұл arduino аппараттық i2c түйреуіштері.

A5 SCL YELLOW қосылған

A4 SDA GREEN -ге қосылған

Ардуинодан +5в және 0в (жер) шығысы USB немесе телефон зарядтағышымен қоректенуге болатын бүкіл тізбек үшін қуат көзі ретінде пайдаланылады.

2 -қадам: Кодекс

// ------------------------ ANJAWARE YILAN ойындары Желілердің көмегімен --------------- -------

#қосу

#қосу // https://github.com/adafruit/Adafruit-GFX-Library #include // https://github.com/adafruit/Adafruit-GFX-Library // дисплей жиынтығы (ені, биіктігі) Adafruit_SSD1306 дисплейі (128, 64); // кіріс түйреуіштерін анықтаңыз, бұл олар ешқашан өзгермейтін arduino -дегі түйреуіштер #анықтау #INTPIN 3 -ді анықтау // тек 2 және 3 -түйректер UNO -да интерпутты түйреуіштер болуы мүмкін #UPPIN 4 -ді анықтау // бұл түйіндер тиісті қосқышқа қосылған DWNPIN 5 #LFTPIN 6 анықтаңыз #RHTPIN 7 анықтаңыз #SND 9 анықтаңыз // бағыттарды анықтаңыз #DIRUP 1 анықтаңыз // бұл мәндерді «жылан» шешеді- #DIRDOWN 2 анықтаңыз // жылан қай бағытта жүретінін анықтаңыз # DIRLEFT 3 анықтау #DIRRIGHT 4 анықтау

// батырманың айнымалыларын орнатыңыз

// volitile cos бізге үзіліспен жаңартылуы қажет, сондықтан цикл мәнінің кез келген бөлігі болуы мүмкін

// ешқашан 4 -тен жоғары болмайды, сондықтан ресурстарды үнемдеу үшін тек 8bit int қажет uint8_t buttonpressed = 0; bool butup = 0; bool butdown = 0; // біз мұны bool butleft = 0 қай бағытта басылғанын анықтау үшін «true» мәнін қою үшін қолданамыз; bool butright = 0;

// жылан инттері

байт snakePosX [30]; // жыланның байтының денесін жасауға арналған массив snakePosY [30];

int snakeX = 30; // жылан басының жағдайы

жылан Y = 30; int snakeSize = 1; // жылан өлшемінің саны массив өлшемімен шектелген

// әлемдік инт

uint8_t worldMinX = 0; // бұл ойын алаңының шегін белгілейді

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

// скранды (тағамды) және сканердің орналасуын жинаңыз

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

// айнымалыларды бағалайды

ұзақ ойнау бағасы = 0; ұзақ ұпай = 30; // бастапқы ұпай ретінде жоғары жинауды 3 жинауға қойыңыз

// --------------------------- кернеудің жоғарылауында интерпутта осылай істейді ------------ -------------

void interruptpressed () {delay (150); // қосылған «секіру» қорғанысының сәл кешігуі updatedirection (); } // ------------------ батырмасын басу арқылы бағыт мәнін жаңартыңыз ---------------- void updatedirection () { // Serial.println («бағытты жаңарту»); butup = digitalRead (UPPIN); // қай кіріс жоғары болғанын тексеріңіз және тиісті bool true орнатыңыз butdown = digitalRead (DWNPIN); butleft = digitalRead (LFTPIN); butright = digitalRead (RHTPIN); // бұлар, егер статементтер қай кірістің жоғарылағанын қараса және «түйме басылған» // айнымалы мәніне сәйкес мәнді енгізсе, бұл айнымалы қозғалыс бағытын белгілейді, егер (butup == true) {buttonpressed = DIRUP; // Serial.println («ЖОҒАРЫ басылды»); // Serial.println (түйме басылған); butup = жалған; тон (SND, 1500, 10); } if (butdown == true) {buttonpressed = DIRDOWN; // Serial.println («ТӨМЕН басылды»); // Serial.println (түйме басылған); butdown = жалған; тон (SND, 1500, 10); }

егер (сол жақ == шын)

{buttonpressed = DIRLEFT; // Serial.println («СОЛҒА басылды»); // Serial.println (түйме басылған); butleft = жалған; тон (SND, 1500, 10); } if (butright == true) {buttonpressed = DIRRIGHT; // Serial.println («ОҢҒА басылған»); // Serial.println (түйме басылған); butright = жалған; тон (SND, 1500, 10); }}

// --------------------------- дисплей тәртібін сызыңыз ------------------ -----------------

void updateDisplay () // ұпайлар мен контурларды салу

{// Serial.println («Дисплейді жаңарту»);

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

display.setTextSize (0); display.setTextColor (АҚ); // ұпайларды шығару display.setCursor (2, 1); display.print («Ұпай:»); display.print (String (playscore, DEC)); display.setCursor (66, 1); display.print («Жоғары:»); display.print (Жол (жоғары ұпай, DEC)); // ойын алаңын сызу // pos 1x, 1y, 2x, 2y, түрлі түсті дисплей.drawLine (0, 0, 127, 0, АҚ); // өте жоғарғы жиек дисплейі.drawLine (63, 0, 63, 9, WHITE); // баллды бөлгіш дисплейі.drawLine (0, 9, 127, 9, WHITE); // мәтін шекарасының астында display.drawLine (0, 63, 127, 63, WHITE); // төменгі жиек дисплейі.drawLine (0, 0, 0, 63, WHITE); // сол жақ шекара дисплейі.drawLine (127, 0, 127, 63, WHITE); // оң жақ шекара

}

// ----------------------------------- ойын алаңын жаңарту ---------- --------------------

void updateGame () // бұл ойын алаңының дисплейін жаңартады

{display.clearDisplay ();

display.drawPixel (scranPosX, scranPosY, WHITE);

scranAte = scranFood ();

// жыландардың тәртібін тексеріңіз

if (outOfArea () || selfCollision ())

{ ойын аяқталды(); }

// жыланды көрсету

for (int i = 0; i0; i--) {snakePosX = snakePosX [i-1]; snakePosY = snakePosY [i-1]; } // жыланға қосымша пиксель қосыңыз, егер (scranAte) {snakeSize+= 1; snakePosX [snakeSize-1] = snakeX; snakePosY [snakeSize-1] = жыланY; }

қосқыш (түйме басылған) // жылан бағыт болды

{жағдай DIRUP: snakeY- = 1; үзіліс; жағдай DIRDOWN: snakeY+= 1; үзіліс; DIRLEFT жағдайы: snakeX- = 1; үзіліс; жағдай DIRRIGHT: snakeX+= 1; үзіліс; } snakePosX [0] = snakeX; snakePosY [0] = жыланЖ; updateDisplay (); display.display (); // --------------------- сканерді қойыңыз -------------------

void placeScran ()

{scranPosX = кездейсоқ (worldMinX+1, worldMaxX-1); scranPosY = кездейсоқ (worldMinY+1, worldMaxY-1); } // ------------------------ SCRAN ATE POINT UP ---------------- bool scranFood () {егер (snakeX == scranPosX && snakeY == scranPosY) {playscore = playscore+10; тон (SND, 2000, 10); updateDisplay (); placeScran (); қайтару 1; } else {қайтару 0; }} // --------------------- аймақтан тыс ---------------------- bool outOfArea () {return snakeX = worldMaxX || жыланY = worldMaxY; } //---------------------- ойын аяқталды----------------------- --- 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); тон (SND, 2000, 50); display.print («GAME»); тон (SND, 1000, 50); display.print («OVER»); if (playscore> = highscore) // ұпайдың жоғарыдан жоғары екенін тексеріңіз {highscore = playscore; // (int i = 0; i <= 16; i ++) үшін жоғары баллды жаңартатын // егер жалғыз статья // бұл ойынның айналасында {display.drawRect (rectX1, rectY1, rectX2, rectY2, WHITE) үстінде төртбұрыштар салу; Serial.println («егер цикл»); display.display (); rectX1- = 2; // 2 пиксельге жылжыту rectY1- = 2; rectX2+= 4; // соңғы нүктеден 2 пиксельден жоғары жылжыту rectY2+= 4; үн (SND, i*200, 3); } display.display (); // ScreenX Wipe атақтан кейін rectX1 = 0; // түзудің бастапқы орнын орнатыңыз rectY1 = 0; rectX2 = 0; rectY2 = 63; for (int i = 0; i <= 127; i ++) {uint8_t cnt = 0; display.drawLine (rectX1, rectY1, rectX2, rectY2, BLACK); rectX1 ++; rectX2 ++; display.display (); } display.clearDisplay (); ойнау ұпайы = 0; // жылан мен ойыншының мәліметтерін қалпына келтіру snakeSize = 1; snakeX = display.width ()/2; snakeY = display.height ()/2; waitForPress (); // ойыншының ойынның басталуын күтіңіз} // ------------------------- басу циклін күтіңіз ---------- --------------- void waitForPress () {bool күту = 0; // цикл аяқталады, бұл шынайы display.clearDisplay (); while (күту == 0) {drawALineForMe (WHITE); // кездейсоқ ақ сызық сызу drawALineForMe (BLACK); // экран ақ дисплейді толық толтырмайтындай кездейсоқ қара сызық сызыңыз.fillRect (19, 20, 90, 32, BLACK); // мәтінді көрсету үшін бос фон.setTextColor (WHITE); display.setCursor (35, 25); display.setTextSize (2); // үлкен қаріп display.println («ЖЫЛАН»); // x y w h r col display.drawRoundRect (33, 22, 62, 20, 4, WHITE); // border Snake display.drawRect (19, 20, 90, 32, WHITE); // жиек терезесі - 3 display.setCursor (28, 42); display.setTextSize (0); // қаріп қалыпты display.println -ге оралады («кез келген пернені басыңыз»); display.display (); күту = digitalRead (INTPIN); // түймені басқанда күту 1 аяқталуға ауысатынын тексеріңіз = 0; // қалпына келтіру түймесін басыңыз}} // -------------------- кездейсоқ жолдың түсінің суретін салыңыз uint8_t -------------- ----- жарамсыз drawALineForMe (uint8_t clr) {uint8_t line1X, line1Y, line2X, line2Y = 0; // жолға кездейсоқ координаталарды орнатыңыз, содан кейін оны сызыңыз // айнымалы кем емес line1X = random (worldMinX+1, worldMaxX-1); line1Y = кездейсоқ (worldMinY+1, worldMaxY-1); line2X = кездейсоқ (worldMinX+1, worldMaxX-1); line2Y = кездейсоқ (worldMinY+1, worldMaxY-1); display.drawLine (line1X, line1Y, line2X, line2Y, clr); } // ------------------------------------- соқтығысуды анықтау -------- -----------------------

for (байт i = 4; i <snakeSize; i ++) {if (snakeX == snakePosX && snakeY == snakePosy ) {қайтару 1; тон (SND, 2000, 20); тон (SND, 1000, 20); } 0 қайтару; }

//-------------------------------- ОРНАТУ--------------- -------------------------------

void setup () {delay (100); // заттарға «жүктеуге» мүмкіндік беріңіз // Serial.begin (9600); // display.begin (SSD1306_SWITCHCAPVCC, 0x3C) сериялық шығысын көргіңіз келсе, осы белгіні алып тастаңыз; display.clearDisplay (); // таза дисплейден бастаңыз display.setTextColor (WHITE); // мәтіннің түсінің айналу өлшемін реттеу және т.б. display.setRotation (0); display.setTextWrap (жалған); display.dim (0); // дисплей жарықтығын орнатыңыз pinMode (INTPIN, INPUT); // pinMode (UPPIN, INPUT) кірістеріне дұрыс порттарды орнатыңыз; pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT); // бұл кірулерді оқу үшін arduino-ны тоқтататын «интерпульстік пәрмен». // Serial.println («Орнату өтті»); waitForPress (); // жыланды бастау экранын көрсету placeScran (); // тағамның бірінші бөлігін орналастырыңыз} // --------------------- НЕГІЗГІ ӨЛКЕ ----------------- ---------------------- void loop () {updateGame (); // бұл функция негізгі кодты алып жүреді}

3 -қадам:

Ұсынылған: