Агуулгын хүснэгт:

Arduino OLED могойн тоглоом: 3 алхам
Arduino OLED могойн тоглоом: 3 алхам

Видео: Arduino OLED могойн тоглоом: 3 алхам

Видео: Arduino OLED могойн тоглоом: 3 алхам
Видео: Arduino — растровые изображения из I2C EEPROM на OLED-дисплей 128x64 2024, Долдугаар сарын
Anonim
Arduino OLED могой тоглоом
Arduino OLED могой тоглоом

Сайн уу, тавтай морилно уу, OLED тоглоомыг хэрхэн яаж хийх, зааварчилгаа өгөх сургалтанд хамрагдахыг хүсч буй энэхүү төсөл нь бид анхны тоглоомоо arduino, soooo ашиглан хийхийг оролдож байхдаа nokia сонгодог могойноос хаанаас эхлэх нь дээр гэж бодсон юм. наад зах нь могойн клон:)).

Танд хэрэгтэй зүйл

Хангамж

Arduino UNO эсвэл клон хийх

OLED дэлгэц

4 диод

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

4 хянагчийн товчлуур

Идэвхгүй Piezo дуугаралт

заавал биш

Гагнуургүй талхны самбар

Эдгээр холбоосууд зөвхөн жишээнд зориулагдсан болохыг анхаарна уу

Алхам 1: Хэлхээ

Хэлхээ
Хэлхээ

Дээрх зураг дээр та манай хэлхээг харж болно, бид arduino дээрх d3 зүүг тасалдлын хүсэлтийн зүү болгон ашигладаг бөгөөд ингэснээр arduino нь d4 d5 d6 d7 хянагчийн оролтыг уншихад тэргүүлэх ач холбогдол өгөх болно. Хэлхээний үндсэн зарчим бол 5в чиглэлд чиглүүлэх товчлуур дарагдсан бөгөөд энэ нь таслалтын хүсэлтийн зүү (d3 ягаан утас) болон харгалзах чиглэлийн зүүг идэвхжүүлж, тасалдлын функц нь шинэчлэлтийн чиглэлийн функцийг дуудаж, код нь могойг зохих ёсоор хөдөлгөнө. Pin 9 -ийг дууны зүү болгон ашигладаг бөгөөд энэ нь PWM (~ импульсийн өргөний модуляц) бөгөөд + зүү дээрх 5V пьезо руу шууд холбогддог ба 0v/газардуу буцдаг.

(Arduino uno ба d2 ба d3 клон дээрх мэдээлэл нь тасалдлын хүсэлтийн голын үүргийг гүйцэтгэдэг).

Чиглэлийн голууд:

d4 Улбар шар өнгөтэй

d5 доош PINK

d6 Зүүн ХӨХ

d7 Зөв ХӨРӨН

d9 Саарал

Товчлуур бүр нь 5 в -ийн холболтын оролттой бөгөөд гарцыг эхлээд arduino дээрх дижитал оролттойгоо холбодог бөгөөд товчлуур бүрийн ижил гаралтыг дараа нь өөрийн диодтой холбодог тул диод ашиглан хүчдэлийг тэжээл рүү буцааж өгдөг. бусад товчлуурууд ба тэдгээрийг идэвхжүүлэх. Бүх 4 диодын катодын (-) төгсгөлд бид тэдгээрийг нийлүүлж d3-тэй холбосон гаралтын уулзвар үүсгэж, дараа нь резистороор 0v/дэлхий рүү дамжуулж, хөвөгч тээглүүрийг орхихгүйн тулд arduino тээглүүрийг доош нь татаж аваарай. идэвхжүүлсэн.

(FYI хөвөгч зүү нь хий үзэгдлийн хүчдэлийг хүлээн авч, ер бусын зан үйлийг үүсгэдэг)

Дэлгэцийг жолоодоход 2 аналог тээглүүр ашигладаг бөгөөд эдгээр нь arduino тоног төхөөрөмжийн i2c зүү юм.

A5 нь SCL YELLOW -тэй холбогдсон байна

A4 нь SDA GREEN -тэй холбогдсон байна

Arduino -аас +5v ба 0v (дэлхий) гаралтыг USB эсвэл утасны цэнэглэгчээр тэжээх боломжтой бүх хэлхээний тэжээлийн эх үүсвэр болгон ашигладаг.

Алхам 2: Код

// ------------------------ ANJAWARE МОГОЙН тоглоомууд Цэвэр хүмүүсийн тусламжтайгаар --------------- -------

#оруулах

#include // 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 дарагдсан чиглэлийг "илрүүлэх" гэж үнэн болгодог. bool butright = 0;

// могойн интс

байт snakePosX [30]; // массын биеийг могойн байт болгох могойPosY [30];

int snakeX = 30; // могойн толгойн байрлал

int могой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); // "bounce" хамгаалалт нэмэгдэхэд бага зэрэг саатал шинэчлэгдсэн чиглэл (); } // ------------------ чиглэлийн утгыг товчлуур дээр дарж шинэчлэх ----------------- void updatedirection () { // Serial.println ("чиглэлийг шинэчлэх"); butup = digitalRead (UPPIN); // аль оролт өндөр болсныг шалгаж, холбогдох bool true butdown = digitalRead (DWNPIN); butleft = digitalRead (LFTPIN); butright = digitalRead (RHTPIN); // эдгээр нь хэрэв статементууд аль оролт өндөр болсныг хараад "товчлуур дарагдсан" // хувьсагчийн холбогдох утгыг оруулбал энэ хувьсагч нь хөдөлгөөний чиглэлийг зааж өгдөг бол (butup == үнэн) {buttonpressed = DIRUP; // Serial.println ("ДЭЭР дарагдсан"); // Serial.println (товчлуур дарагдсан); butup = худал; ая (SND, 1500, 10); } if (butdown == true) {buttonpressed = DIRDOWN; // Serial.println ("DOWN дарагдсан"); // 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 (String (өндөр оноо, DEC)); // тоглоомын талбай зурах // pos 1x, 1y, 2x, 2y, өнгөт дэлгэц.drawLine (0, 0, 127, 0, ЦАГААН); // маш дээд хилийн дэлгэц.drawLine (63, 0, 63, 9, ЦАГААН); // оноо тусгаарлах дэлгэц.drawLine (0, 9, 127, 9, ЦАГААН); // текстийн хилийн доор харуулах.drawLine (0, 63, 127, 63, ЦАГААН); // доод хилийн дэлгэц.drawLine (0, 0, 0, 63, ЦАГААН); // зүүн хилийн дэлгэц.drawLine (127, 0, 127, 63, ЦАГААН); // баруун хил

}

// ----------------------------------- тоглоомын талбайг шинэчлэх ---------- --------------------

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: могойY- = 1; завсарлага; тохиолдол DIRDOWN: могойY+= 1; завсарлага; тохиолдолд DIRLEFT: snakeX- = 1; завсарлага; тохиолдолд DIRRIGHT: snakeX+= 1; завсарлага; } snakePosX [0] = snakeX; snakePosY [0] = могойY; updateDisplay (); display.display (); // --------------------- скан хийх -------------------

void placeScran ()

{scranPosX = санамсаргүй (worldMinX+1, worldMaxX-1); scranPosY = санамсаргүй (worldMinY+1, worldMaxY-1); } // ------------------------ SCRAN ATE POINT UP ---------------- bool scranFood () {if (snakeX == scranPosX && snakeY == scranPosY) {playscore = playscore+10; ая (SND, 2000, 10); updateDisplay (); placeScran (); буцах 1; } өөр {буцаах 0; }} // --------------------- бүсээс гадуур ---------------------- bool outOfArea () {буцах 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; // дан ганц if statment нь өндөр оноог шинэчлэх}} for (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 (); // Алдар нэрийн дараа дэлгэц арчих нь 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; могойY = дэлгэц. өндөр ()/2; waitForPress (); // тоглогч тоглоом эхлэхийг хүлээнэ үү} // ------------------------- даралтын давталт хүлээх ---------- --------------- void waitForPress () {bool wait = 0; // давталт нь энэ нь үнэн байх үед дуусна.clearDisplay (); байхад (хүлээх == 0) {drawALineForMe (ЦАГААН); // санамсаргүй цагаан шугам зурахALineForMe (BLACK); // дэлгэцийг цагаан дэлгэцээр бүрэн дүүргэхгүй байхаар санамсаргүй хар шугам зурна.fillRect (19, 20, 90, 32, ХАР); // текстийг харуулах хоосон дэвсгэр.setTextColor (ЦАГААН); display.setCursor (35, 25); display.setTextSize (2); // том фонтын дэлгэц.println ("МОГОЙ"); // x y w h r col display.drawRoundRect (33, 22, 62, 20, 4, WHITE); // хилийн могойн дэлгэц.drawRect (19, 20, 90, 32, ЦАГААН); // border box - 3 display.setCursor (28, 42); display.setTextSize (0); // фонтыг хэвийн дэлгэц рүү буцаана.println ("дурын товчийг дарна уу"); display.display (); хүлээх = digitalRead (INTPIN); // товчлуур дарагдсан байхад хүлээх товчлуур 1 төгсгөл болж өөрчлөгдөх эсэхийг шалгана уу = 0; // дахин тохируулах товчлуурыг дарна уу}} // -------------------- Санамсаргүй мөр оруулах өнгө uint8_t зурах -------------- ----- хүчингүй drawALineForMe (uint8_t clr) {uint8_t line1X, line1Y, line2X, line2Y = 0; // шугамын санамсаргүй координатуудыг тохируулаад дараа нь зурна уу // хувьсагч ямар ч илүүгүй line1X = санамсаргүй (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 (ЦАГААН); // текстийн өнгөний эргэлтийн хэмжээг тохируулах гэх мэт display.setRotation (0); display.setTextWrap (худал); дэлгэц.dim (0); // дэлгэцийн тод байдлыг тохируулах pinMode (INTPIN, INPUT); // pinMode (UPPIN, INPUT) оролтод зөв портуудыг тохируулах; pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT); // энэ бол оролтыг уншихын тулд arduino-г зогсоох "завсрын команд юм // тушаал хавсралт // Serial.println ("Тохиргоог дамжуулсан"); waitForPress (); // могой эхлэх дэлгэцийг харуулах placeScran (); // эхний хоолыг байрлуул} // --------------------- MAIN LOOP ----------------- ---------------------- void loop () {updateGame (); // энэ функц нь үндсэн кодыг авч явдаг}

Алхам 3:

Зөвлөмж болгож буй: