Სარჩევი:

Arduino OLED გველი თამაში: 3 ნაბიჯი
Arduino OLED გველი თამაში: 3 ნაბიჯი

ვიდეო: Arduino OLED გველი თამაში: 3 ნაბიჯი

ვიდეო: Arduino OLED გველი თამაში: 3 ნაბიჯი
ვიდეო: Snake on Arduino 2024, ივლისი
Anonim
Arduino OLED გველის თამაში
Arduino OLED გველის თამაში

მოგესალმებით და მივესალმებით, ჩვენს ინსტრუქციებს, თუ როგორ უნდა გავაკეთოთ და არდუინო OLED თამაში, ეს პროექტი მოხდა მაშინ, როდესაც ჩვენ ვცდილობდით ჩვენი პირველი თამაში არდუინოთი, ასე რომ, ჩვენ ვიფიქრეთ, სად უნდა დავიწყოთ უკეთესი ვიდრე ნოკია კლასიკური გველი (კარგად მინიმუმ გველის კლონი:)).

რაც დაგჭირდებათ

მარაგები

Arduino UNO ან კლონი

OLED ეკრანი

4 დიოდი

500-1k რეზისტორი

4 კონტროლერის ღილაკი

პასიური პიეზოს ზუზუნი

სურვილისამებრ

Solderless BreadBoard

გთხოვთ გაითვალისწინოთ, რომ ეს ბმულები მხოლოდ მაგალითისთვისაა

ნაბიჯი 1: წრე

წრე
წრე

ზემოთ მოცემულ სურათზე თქვენ ხედავთ ჩვენს წრეს, ჩვენ ვიყენებთ d3 პუნქტს arduino– ზე, როგორც შეწყვეტის მოთხოვნის პინს, ისე რომ arduino უპირატესობას მიანიჭებს კონტროლერის მონაცემების კითხვას d4 d5 d6 d7. მიკროსქემის საფუძვლებია ის, რომ დაჭერილია მიმართულების ღილაკი, რომელიც 5v მაღლა ადის, ეს ააქტიურებს შეწყვეტის მოთხოვნის პინს (d3 მეწამული მავთული) და შესაბამისი მიმართულების პინს, შეწყვეტის ფუნქცია იძახებს განახლების მიმართულების ფუნქციას და ეს კოდი გველის შესაბამისად მოძრაობს. პინ 9 გამოიყენება როგორც ხმის პინი, რადგან ეს არის PWM (~ პულსის სიგანის მოდულაცია), რომელიც უშუალოდ უკავშირდება 5 ვ პიეზოს + პინზე და - ბრუნდება 0 ვ/ადგილზე.

(FYI arduino uno და კლონებზე მხოლოდ d2 და d3 შეიძლება მოქმედებდეს როგორც შეწყვეტის მოთხოვნის ქინძისთავები).

მიმართულების ქინძისთავები:

d4 ნარინჯისფერი

d5 ქვემოთ ვარდისფერი

d6 მარცხნივ ლურჯი

d7 მარჯვნივ BROWN

d9 ჟღერს ნაცრისფერი

თითოეულ ღილაკს აქვს 5v კავშირის შეყვანა და გამომავალი, რომელიც ჯერ დაკავშირებულია არდუინოს შესაბამის ციფრულ შეყვანასთან, თითოეული ღილაკის იგივე გამომავალი შემდეგ უკავშირდება საკუთარ დიოდს, ჩვენ ვიყენებთ დიოდებს ძაბვის კვების შესაჩერებლად სხვა ღილაკები და მათი გააქტიურება. ოთხივე დიოდის კათოდზე (-) ბოლოს ჩვენ მათ ვუერთდებით, რათა შევქმნათ გამომავალი კავშირი, რომელიც აკავშირებს d3- ს და შემდეგ რეზისტორის საშუალებით 0v/დედამიწაზე, რათა არდუინოს ქინძისთავები დაბლა გაიყვანოს ისე, რომ არ დატოვოს მცურავი ქინძისთავები, როდესაც არ არის გააქტიურებულია.

(FYI მცურავ პინს შეუძლია მიიღოს მოჩვენებითი ძაბვა და გამოიწვიოს უჩვეულო ქცევა)

ეკრანის მართვისთვის გამოიყენება 2 ანალოგური ქინძისთავები, ეს არის arduino აპარატურის i2c ქინძისთავები.

A5 უკავშირდება SCL YELLOW- ს

A4 უკავშირდება SDA GREEN- ს

არდუინოდან გამომავალი +5v და 0v (დედამიწა) გამოიყენება როგორც ენერგიის წყარო მთელი წრედისთვის, რომელიც შეიძლება იკვებებოდეს USB ან ტელეფონის დამტენით.

ნაბიჯი 2: კოდი

// ------------------------ ANJAWARE გველის თამაშები წმინდა ხალხების დახმარებით --------------- -------

#ჩართეთ

#მოიცავს // https://github.com/adafruit/Adafruit-GFX-Library #include // https://github.com/adafruit/Adafruit-GFX-Library // ჩვენების ნაკრები (სიგანე, სიმაღლე) Adafruit_SSD1306 ჩვენება (128, 64); // განსაზღვრეთ შეყვანის ქინძისთავები ეს არის ქინძისთავები არდუინოზე ისინი არასოდეს იცვლება ასე რომ #განსაზღვრეთ #განსაზღვრეთ INTPIN 3/ DWNPIN 5 #განსაზღვრეთ LFTPIN 6 #განსაზღვრეთ RHTPIN 7 #განსაზღვრეთ SND 9 // განსაზღვრეთ მიმართულებები #განსაზღვრეთ DIRUP 1 // ეს მნიშვნელობები არის ის, რასაც "გველი" უყურებს გადაწყვეტილების მისაღებად- #განსაზღვრეთ DIRDOWN 2 // მიმართულებით, სადაც გველი იმოგზაურებს # განსაზღვრეთ DIRLEFT 3 #განსაზღვრეთ DIRRIGHT 4

// ღილაკის ცვლადების დაყენება

// volitile cos ჩვენ გვჭირდება ის განახლება interupt ასე რომ შეიძლება იყოს ნებისმიერი ცოტა ციკლის ღირებულება

// არასოდეს არის 4 -ზე მაღალი, ასე რომ საჭიროა მხოლოდ 8 ბიტიანი int რესურსების შესანახად არასტაბილური uint8_t ღილაკზე დაჭერით = 0; bool butup = 0; bool butdown = 0; // ჩვენ ვიყენებთ ამას, რომ დავაყენოთ true, რათა „გამოვავლინოთ“რომელი მიმართულებით დაჭერილია bool butleft = 0; bool butright = 0;

// გველის ინტ

ბაიტი snakePosX [30]; // მასივი გველის ბაიტის სხეულის შესაქმნელად snakePosY [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 () {დაგვიანებით (150); // მცირე შეფერხება დამატებული "bounce" დაცვის განახლებული მიმართულებისათვის (); } // ------------------ განაახლეთ მიმართულების მნიშვნელობა ღილაკის დაჭერით ----------------- ძალადაკარგულად განახლებულია მიმართვა () { // Serial.println ("განახლების მიმართულება"); butup = digitalRead (UPPIN); // შეამოწმეთ რომელი შეყვანაა მაღალი და დააყენეთ შესაბამისი bool true butdown = digitalRead (DWNPIN); butleft = digitalRead (LFTPIN); butright = digitalRead (RHTPIN); // ეს იმ შემთხვევაში, თუ სტატისტიკოსები შეხედავენ რომელი შეყვანაა მაღალი და შეაქვს შესაბამისი მნიშვნელობა "ღილაკზე დაჭერით" // ცვლადში, ეს ცვლადი კარნახობს მოძრაობის მიმართულებას, თუ (butup == true) {buttonpressed = DIRUP; // Serial.println ("UP pressed"); // Serial.println (ღილაკზე დაჭერილი); butup = ყალბი; ტონი (SND, 1500, 10); } if (butdown == true) {buttonpressed = DIRDOWN; // Serial.println ("DOWN pressed"); // Serial.println (ღილაკზე დაჭერილი); butdown = false; ტონი (SND, 1500, 10); }

თუ (butleft == ჭეშმარიტი)

{buttonpressed = DIRLEFT; // Serial.println ("მარცხნივ დაჭერილი"); // Serial.println (ღილაკზე დაჭერილი); butleft = ყალბი; ტონი (SND, 1500, 10); } if (butright == true) {buttonpressed = DIRRIGHT; // Serial.println ("RIGHT pressed"); // Serial.println (ღილაკზე დაჭერილი); მართალი = ყალბი; ტონი (SND, 1500, 10); }}

// -------------------------- დახაზეთ ჩვენების რუტინები ------------------ -----------------

void updateDisplay () // დახაზეთ ქულები და მონახაზი

{// Serial.println ("ეკრანის განახლება");

display.fillRect (0, 0, ჩვენება. სიგანე ()-1, 8, შავი);

display.setTextSize (0); display.setTextColor (WHITE); // დახაზეთ ქულები display.setCursor (2, 1); display.print ("ქულა:"); ჩვენება. ბეჭდვა (სიმებიანი (playcore, DEC)); display.setCursor (66, 1); display.print ("მაღალი:"); ჩვენება. ბეჭდვა (სიმებიანი (მაღალი ქულა, DEC)); // დახაზეთ სათამაშო არე // pos 1x, 1y, 2x, 2y, ფერადი ჩვენება. drawrawline (0, 0, 127, 0, WHITE); // ძალიან ზედა საზღვრის ჩვენება. drawLine (63, 0, 63, 9, WHITE); // ანგარიში სეპარატორის ჩვენება. drawrawline (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 ())

{gameOver (); }

// გველის ჩვენება

for (int i = 0; i0; i--) {snakePosX = snakePosX [i-1]; snakePosY = snakePosY [i-1]; } // დაამატეთ გველს დამატებითი პიქსელი, თუ (scranAte) {snakeSize+= 1; snakePosX [snakeSize-1] = გველი X; snakePosY [snakeSize-1] = გველიY; }

შეცვლა (ღილაკზე დაჭერილი) // იყო გველი მიმართულება

{საქმე DIRUP: snakeY- = 1; შესვენება; საქმე DIRDOWN: snakeY+= 1; შესვენება; საქმე გადასატანი: გველი X- = 1; შესვენება; საქმე DIRRIGHT: snakeX+= 1; შესვენება; } snakePosX [0] = snakeX; snakePosY [0] = snakeY; updateDisplay (); ჩვენება. ჩვენება (); // --------------------- მოათავსეთ სკრანი -------------------

void placeScran ()

{scranPosX = შემთხვევითი (worldMinX+1, worldMaxX-1); scranPosY = შემთხვევითი (worldMinY+1, worldMaxY-1); } // ------------------------ აკონტროლეთ წერტილი ---------------- bool scranFood () {if (snakeX == scranPosX && snakeY == scranPosY) {playcore = სათამაშო ქულა+10; ტონი (SND, 2000, 10); updateDisplay (); placeScran (); დაბრუნება 1; } else {დაბრუნება 0; }} // --------------------- ტერიტორიის გარეთ ---------------------- bool outOfArea () {დაბრუნება გველი X = 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"); თუ (რეიტინგი> = უმაღლესი ქულა) // შეამოწმეთ, ნაჩვენებია თუ არა ქულა მაღალ ქულაზე {ქულა /ქულა; // single if statment განახლება მაღალი ქულა} for (int i = 0; i <= 16; i ++) // ეს არის თამაშის გარშემო rectanlges {display.drawRect (rectX1, rectY1, rectX2, rectY2, WHITE); Serial.println ("თუ მარყუჟი"); ჩვენება. ჩვენება (); 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.clearDisplay (); სათამაშო ქულა = 0; // გადააყენეთ გველი და მოთამაშის დეტალები snakeSize = 1; snakeX = ჩვენება. სიგანე ()/2; გველი Y = ჩვენება. სიმაღლე ()/2; waitForPress (); // დაელოდეთ მოთამაშეს თამაშის დაწყებას} // ------------------------- დაელოდეთ პრესის მარყუჟს ---------- --------------- void waitForPress () {bool ელოდება = 0; // მარყუჟი მთავრდება მაშინ როდესაც ეს არის ნამდვილი ჩვენება. ClearDisplay (); ხოლო (ლოდინი == 0) {drawALineForMe (WHITE); // დახაზეთ შემთხვევითი თეთრი ხაზი drawALineForMe (შავი); // დახაზეთ შემთხვევითი შავი ხაზი ისე, რომ ეკრანი მთლად არ ავსებდეს თეთრ ეკრანს.fillRect (19, 20, 90, 32, შავი); // ცარიელი ფონი ტექსტის ჩვენებისთვის. setTextColor (WHITE); display.setCursor (35, 25); display.setTextSize (2); // უფრო დიდი შრიფტის ჩვენება. 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 ჩვენება. setCursor (28, 42); display.setTextSize (0); // შრიფტი ნორმალურ ჩვენებაზე. println ("დააჭირეთ ნებისმიერ ღილაკს"); ჩვენება. ჩვენება (); ლოდინი = digitalRead (INTPIN); // შეამოწმეთ გასაღები დაჭერილი ლოდინი შეიცვლება 1 დამთავრებული ღილაკზე დაჭერით = 0; // ღილაკის გადატვირთვა დააჭირეთ}} // -------------------- დახაზეთ შემთხვევითი ხაზის შეყვანის ფერი uint8_t -------------- ----- ბათილად drawALineForMe (uint8_t clr) {uint8_t ხაზი 1X, ხაზი 1Y, ხაზი 2X, ხაზი 2Y = 0; // დააყენეთ შემთხვევითი კოორდინატები ხაზისთვის, შემდეგ დახაზეთ ის // ცვლადი არანაკლებ არც მეტი ხაზი 1X = შემთხვევითი (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 (byte i = 4; i <snakeSize; i ++) {if (snakeX == snakePosX && snakeY == snakePosy ) {დაბრუნება 1; ტონი (SND, 2000, 20); ტონი (SND, 1000, 20); } დაბრუნება 0; }

//-------------------------------- ᲐᲬᲧᲝᲑᲐ--------------- ------------------------------------

void setup () {დაგვიანებით (100); // უბრალოდ მიეცით პერსონალს "ჩატვირთვის" შანსი // Serial.begin (9600); // გააუქმეთ ეს თუ გინდათ რომ ნახოთ სერიული შედეგები display.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); // დაიწყეთ სუფთა ჩვენებით display.setTextColor (WHITE); // შექმენით ტექსტის ფერის ბრუნვის ზომა და ა.შ. display.setRotation (0); display.setTextWrap (ყალბი); ჩვენება.დიმი (0); // დისპლეის დაყენება brighness pinMode (INTPIN, INPUT); // დააყენეთ სწორი პორტები შეყვანის pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT); // ეს არის შეწყვეტილი ბრძანება, რომელიც „აჩერებს“arduino– ს ინფორმაციის შესასწავლად // command- function- pin-function to execute-condition on pin attachInterrupt (digitalPinToInterrupt (INTPIN), interruptpressed, RISING); // Serial.println ("კონფიგურაცია გავიდა"); waitForPress (); // აჩვენეთ გველის დაწყების ეკრანი placeScran (); // განათავსეთ საჭმლის პირველი ნაჭერი} // --------------------- მთავარი მარყუჟი ----------------- ---------------------- ბათილი მარყუჟი () {updateGame (); // ეს ფუნქცია არის ის, რაც ატარებს მთავარ კოდს}

ნაბიჯი 3:

გირჩევთ: