Mundarija:

Arduino OLED ilon o'yini: 3 qadam
Arduino OLED ilon o'yini: 3 qadam

Video: Arduino OLED ilon o'yini: 3 qadam

Video: Arduino OLED ilon o'yini: 3 qadam
Video: тест oled дисплея (анимация и картинки) #oled #arduino #arduinoproject #lada 2024, Iyul
Anonim
Arduino OLED ilon o'yini
Arduino OLED ilon o'yini

Salom va xush kelibsiz, biz OLED o'yinini qanday yaratish va o'rgatish bo'yicha ko'rsatmalarni qabul qilamiz, bu loyiha biz birinchi o'yinimizni arduino, soooo bilan o'tkazmoqchi bo'lganimizda sodir bo'ldi, biz nokia klassik iloniga qaraganda qaerdan boshlash kerakligini o'yladik. hech bo'lmaganda ilon klon:)).

Sizga nima kerak bo'ladi

Ta'minotlar

Arduino UNO yoki klon

OLED displey

4 ta diod

500-1k qarshilik

4 ta boshqaruv tugmasi

Passiv piezo signal

ixtiyoriy

Lehimsiz non paneli

E'tibor bering, bu havolalar faqat misol

1 -qadam: O'chirish davri

O'chirish davri
O'chirish davri

Yuqoridagi rasmda siz bizning sxemamizni ko'rishingiz mumkin, biz arduino d3 pinini uzilish so'rovi sifatida ishlatamiz, shunda arduino d4 d5 d6 d7 bo'lgan tekshirgich kirishini o'qishga ustuvor ahamiyat beradi. O'chirishning asosiy printsipi shundaki, yo'nalish tugmasi 5v balandlikda bosiladi, bu esa uzilish so'rov pinini (d3 binafsha sim) va unga mos keladigan yo'nalish pinini ishga tushiradi, uzilish funktsiyasi yangilanish yo'nalishi funktsiyasini chaqiradi va bu kod ilonni shunga mos ravishda harakatlantiradi. 9 -pin ovoz pimi sifatida ishlatiladi, chunki u PWM (~ impuls kengligi modulyatsiyasi) bo'lib, u + pinli 5V piezoga to'g'ridan -to'g'ri ulanadi va - 0v/tuproqqa qaytadi.

(Arduino uno va d2 va d3 klonlarining ma'lumotlari uzilish so'rov pinlari vazifasini bajarishi mumkin).

Yo'nalish pinlari:

d4 ORANGE yuqoriga

d5 pastga PINK

d6 chap ko'k

d7 o'ng BROWN

d9 ovozi kulrang

Har bir tugmachada 5V kuchlanishli kirish va birinchi navbatda arduino -dagi tegishli raqamli kirishga ulangan chiqish bor, har bir tugmaning xuddi shunday chiqishi o'z diodiga ulanadi, biz diodlardan kuchlanishni to'xtatish uchun foydalanamiz. boshqa tugmalar va ularni faollashtirish. Katod (-) barcha 4 diodning uchida biz d3 ga ulanadigan chiqish joyini yaratish uchun ularni birlashtiramiz, keyin esa qarshilik orqali 0v/ergacha arduino pimlarini pastga tortamiz, shunda suzuvchi pinlarni qoldirmaymiz. faollashtirilgan.

(Ma'lumot uchun suzuvchi pin xayoliy kuchlanishni qabul qilishi va g'ayrioddiy xatti -harakatlarga olib kelishi mumkin)

Displeyni boshqarish uchun 2 ta analog pin ishlatiladi, bu arduino apparat i2c pinlari.

A5 SCL YELLOW ga ulangan

A4 SDA GREEN -ga ulangan

Arduinodan +5v va 0v (er) chiqishi usb yoki telefon zaryadlovchisidan quvvat oladigan butun zanjir uchun quvvat manbai sifatida ishlatiladi.

2 -qadam: Kod

// ------------------------ ANJAWARE YILAN O'YINLARI Tarmoqli odamlarning yordami bilan --------------- -------

#qo'shing

#include // https://github.com/adafruit/Adafruit-GFX-Library #include // https://github.com/adafruit/Adafruit-GFX-Library // displey to'plami (kengligi, balandligi) Adafruit_SSD1306 displeyi (128, 64); // kirish pimlarini aniqlang, bu ular hech qachon o'zgarmasligi uchun arduino -dagi pinlar #aniqlang #INTPIN 3 -ni aniqlang // faqat 2 va 3 -pinlar UNO -da o'zaro bog'langan pin bo'lishi mumkin #UPPIN 4 -ni aniqlang // bu tegishli kalitga ulangan pinlar #define DWNPIN 5 #define LFTPIN 6 #RHTPIN 7ni belgilang #SND 9 ni aniqlang // yo'nalishlarni belgilang #DIRUPni belgilang 1 // bu qiymatlarni "ilon" qanday qaror qabul qiladi- #DIRDOWN 2 ni belgilang // ilonning qaysi yo'nalishda yurishini # DIRLEFT 3 ni aniqlang #DIRRIGHT 4 ni aniqlang

// tugmachaning o'zgaruvchilarini o'rnating

// volitile cos biz uni interupt bilan yangilashimiz kerak, shuning uchun har qanday tsikl qiymati bo'lishi mumkin

// hech qachon 4 dan yuqori emas, shuning uchun resurslarni tejash uchun faqat 8bit int kerak uint8_t buttonpressed = 0; bool butup = 0; bool butdown = 0; // biz buni "aniqlash" uchun rostlash uchun ishlatamiz bool butleft = 0; bool butright = 0;

// ilon ints

baytli snakePosX [30]; // ilon tanasi qilish uchun massiv bayt snakePosY [30];

int snakeX = 30; // ilon boshining holati

int ilonY = 30; int snakeSize = 1; // ilon kattaligi soni massiv kattaligi bilan cheklangan

// dunyo ints

uint8_t worldMinX = 0; // ular o'yin maydonining chegaralarini belgilaydi

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

// skranni (ovqatni) va skranning holatini to'plang

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

// o'zgaruvchilarni baholaydi

uzoq o'yin reytingi = 0; uzoq yuqori ball = 30; // boshlang'ich nuqta sifatida 3 ball yig'ing

// --------------------------- kuchlanish uzilishida interupt shunday qiladi ------------ -------------

void interruptpressed () {delay (150); // "sakrash" himoyasini qo'shish uchun biroz kechikish updatedirection (); } // ------------------ tugmachasini bosib yo'nalish qiymatini yangilang ---------------- void updatedirection () { // Serial.println ("yo'nalishni yangilash"); butup = digitalRead (UPPIN); // qaysi kirish balandligini tekshiring va tegishli bool true ni belgilang butdown = digitalRead (DWNPIN); butleft = digitalRead (LFTPIN); butright = digitalRead (RHTPIN); // bular, agar statementlar qaysi kirish yuqori bo'lganini ko'rib chiqsa va "tugma bosilgan" // o'zgaruvchiga tegishli qiymatni kiritsa, bu o'zgaruvchi harakat yo'nalishini belgilaydi, agar (butup == rost) {buttonpressed = DIRUP; // Serial.println ("yuqoriga bosildi"); // Serial.println (tugma bosilgan); butup = noto'g'ri; ohang (SND, 1500, 10); } if (butdown == true) {buttonpressed = DIRDOWN; // Serial.println ("DOWN bosildi"); // Serial.println (tugma bosilgan); butdown = noto'g'ri; ohang (SND, 1500, 10); }

agar (chap == rost)

{tugma bosilgan = DIRLEFT; // Serial.println ("ChAP bosildi"); // Serial.println (tugma bosilgan); butleft = noto'g'ri; ohang (SND, 1500, 10); } if (butright == true) {buttonpressed = DIRRIGHT; // Serial.println ("O'ngga bosilgan"); // Serial.println (tugma bosilgan); butright = noto'g'ri; ohang (SND, 1500, 10); }}

// -------------------------- displey tartibini chizish ------------------ -----------------

void updateDisplay () // ballar va konturlarni chizish

{// Serial.println ("Displeyni yangilash");

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

display.setTextSize (0); display.setTextColor (oq); // chizish ballari display.setCursor (2, 1); display.print ("Hisob:"); display.print (String (playscore, DEC)); display.setCursor (66, 1); display.print ("Yuqori:"); display.print (String (yuqori ball, DEC)); // o'yin maydonini chizish // pos 1x, 1y, 2x, 2y, rangli displey.drawLine (0, 0, 127, 0, oq); // juda yuqori chegara displeyi.drawLine (63, 0, 63, 9, WHITE); // ball ajratgichi display.drawLine (0, 9, 127, 9, WHITE); // matn chegarasi ostida display.drawLine (0, 63, 127, 63, WHITE); // pastki chegara displeyi.drawLine (0, 0, 0, 63, oq); // chap chegara displeyi.drawLine (127, 0, 127, 63, WHITE); // o'ng chegara

}

// ----------------------------------- o'yin maydonini yangilash ---------- --------------------

void updateGame () // bu o'yin maydoni displeyini yangilaydi

{displey.clearDisplay ();

display.drawPixel (scranPosX, scranPosY, WHITE);

scranAte = scranFood ();

// ilon tartibini tekshiring

if (outOfArea () || selfCollision ())

{ O'yin tamom(); }

// ilonni ko'rsatish

uchun (int i = 0; i0; i--) {snakePosX = snakePosX [i-1]; snakePosY = snakePosY [i-1]; } // ilonga qo'shimcha piksel qo'shing, agar (scranAte) {snakeSize+= 1; snakePosX [snakeSize-1] = snakeX; snakePosY [snakeSize-1] = ilonY; }

kalit (tugma bosilgan) // ilon yo'nalishi edi

{holat DIRUP: ilonY- = 1; tanaffus; ish DIRDOWN: ilonY+= 1; tanaffus; DIRLEFT holati: snakeX- = 1; tanaffus; holat DIRRIGHT: snakeX+= 1; tanaffus; } snakePosX [0] = snakeX; snakePosY [0] = ilonY; updateDisplay (); display.display (); skanerni joylashtiring -------------------

bo'sh joyScran ()

{scranPosX = tasodifiy (worldMinX+1, worldMaxX-1); scranPosY = tasodifiy (worldMinY+1, worldMaxY-1); } // ------------------------ SCRAN ATE POINT UP ---------------- bool scranFood () {agar (snakeX == scranPosX && snakeY == scranPosY) {playscore = playscore+10; ohang (SND, 2000, 10); updateDisplay (); joyScran (); qaytarish 1; } boshqa {qaytarish 0; }} // --------------------- maydon tashqarisida ---------------------- bool outOfArea () {qaytish snakeX = worldMaxX || ilonY = worldMaxY; } //---------------------- O'yin tamom----------------------- --- void gameOver () {uint8_t rectX1, rectY1, rectX2, rectY2; rectX1 = 38; to'g'riY1 = 28; rectX2 = 58; to'g'riY2 = 12; display.clearDisplay (); display.setCursor (40, 30); display.setTextSize (1); ohang (SND, 2000, 50); display.print ("O'YIN"); ohang (SND, 1000, 50); display.print ("OVER"); if (pley -off> = yuqori ball) // yuqori ballardan yuqori ballni tekshiring {highscore = playscore; // bitta bo'lsa, statment yuqori ballni yangilash uchun} (int i = 0; i <= 16; i ++) // bu o'yin atrofida {display.drawRect (rectX1, rectY1, rectX2, rectY2, WHITE) ustidan to'g'ri chiziqlar chizish uchun; Serial.println ("agar pastadir"); display.display (); to'g'riX1- = 2; // 2 pikselga siljitish rektY1- = 2; rectX2+= 4; // oxirgi nuqtadan 2 piksel ustidan siljitish rektY2+= 4; ohang (SND, i*200, 3); } display.display (); // rectX1 = 0 ustidan mashhurlikdan keyin ekranni tozalash; // rektY1 = 0 qatorining boshlang'ich pozitsiyasini o'rnating; rectX2 = 0; to'g'riY2 = 63; uchun (int i = 0; i <= 127; i ++) {uint8_t cnt = 0; display.drawLine (rectX1, rectY1, rectX2, rectY2, BLACK); rectX1 ++; rectX2 ++; display.display (); } display.clearDisplay (); o'yin skorlari = 0; // ilon va o'yinchi tafsilotlarini tiklash snakeSize = 1; snakeX = display.width ()/2; snakeY = displey.height ()/2; waitForPress (); // o'yinchi o'yin boshlanishini kutib turing} // ------------------------- bosish tsiklini kuting ---------- -------------- void waitForPress () {bool kutish = 0; // loop tugagandan so'ng tugaydi, bu haqiqiy display.clearDisplay (); while (kutish == 0) {drawALineForMe (WHITE); // tasodifiy oq chiziq chizish drawALineForMe (Qora); // ekran oq displeyni to'liq to'ldirmasligi uchun tasodifiy qora chiziq chizish.fillRect (19, 20, 90, 32, BLACK); // matn ko'rsatish uchun bo'sh fon.setTextColor (WHITE); display.setCursor (35, 25); display.setTextSize (2); // katta shrift displeyi.println ("YILAN"); // x y w h r col display.drawRoundRect (33, 22, 62, 20, 4, WHITE); // chegara Snake display.drawRect (19, 20, 90, 32, oq); // chegara qutisi - 3 display.setCursor (28, 42); display.setTextSize (0); // shrift normal displeyga qaytariladi.println ("istalgan tugmani bosing"); display.display (); kutish = digitalRead (INTPIN); // tugma bosilganda kutish 1 tugashga o'zgarishini tekshiring = 0; // qayta o'rnatish tugmachasini bosing}} // -------------------- chizish tasodifiy kiruvchi rang uint8_t -------------- ----- bekor chizishALineForMe (uint8_t clr) {uint8_t line1X, line1Y, line2X, line2Y = 0; // chiziq uchun tasodifiy koordinatalarni o'rnating, so'ngra uni chizamiz // o'zgaruvchidan ko'p bo'lmagan line1X = tasodifiy (worldMinX+1, worldMaxX-1); line1Y = tasodifiy (worldMinY+1, worldMaxY-1); line2X = tasodifiy (worldMinX+1, worldMaxX-1); line2Y = tasodifiy (worldMinY+1, worldMaxY-1); display.drawLine (line1X, line1Y, line2X, line2Y, clr); } // ------------------------------------- to'qnashuvni aniqlash -------- -----------------------

for (bayt i = 4; i <snakeSize; i ++) {if (snakeX == snakePosX && snakeY == snakePosy ) {qaytish 1; ohang (SND, 2000, 20); ohang (SND, 1000, 20); } qaytarish 0; }

//-------------------------------- SOZLASH--------------- -------------------------------

void setup () {kechiktirish (100); // narsalarga "yuklash" imkoniyatini bering // Serial.begin (9600); // display.begin (SSD1306_SWITCHCAPVCC, 0x3C) ketma -ket chiqishini ko'rishni istasangiz, bu belgini olib tashlang; display.clearDisplay (); // toza displey bilan boshlang display.setTextColor (WHITE); // matn rangining aylanish hajmini sozlash va hokazo display.setRotation (0); display.setTextWrap (noto'g'ri); display.dim (0); // ekranning yorqinligini belgilash pinMode (INTPIN, INPUT); // pinMode (UPPIN, INPUT) kirishiga to'g'ri portlarni o'rnating; pinMode (DWNPIN, INPUT); pinMode (LFTPIN, Kirish); pinMode (RHTPIN, INPUT); // bu kirishni o'qish uchun arduino-ni to'xtatuvchi "interupt" buyrug'i // buyruq-funktsiya-pin-funktsiyasi pinni biriktirish shartini bajarish uchun (raqamliPinToInterrupt (INTPIN), uzilgan, RISING); // Serial.println ("O'rnatish o'tdi"); waitForPress (); // ilonni ishga tushirish ekranini ko'rsatish placeScran (); // ovqatning birinchi qismini joylashtiring} // --------------------- ASOSI LOOP ----------------- ---------------------- void loop () {updateGame (); // bu funksiya asosiy kodni olib yuradi}

3 -qadam:

Tavsiya: