ዝርዝር ሁኔታ:

አርዱዲኖ OLED የእባብ ጨዋታ 3 ደረጃዎች
አርዱዲኖ OLED የእባብ ጨዋታ 3 ደረጃዎች

ቪዲዮ: አርዱዲኖ OLED የእባብ ጨዋታ 3 ደረጃዎች

ቪዲዮ: አርዱዲኖ OLED የእባብ ጨዋታ 3 ደረጃዎች
ቪዲዮ: Установка приложения ArduBlock 2024, ሀምሌ
Anonim
አርዱዲኖ OLED የእባብ ጨዋታ
አርዱዲኖ OLED የእባብ ጨዋታ

ሰላም እና እንኳን ደህና መጡ ፣ ለአስተማሪዎቻችን የኦልድ ጨዋታን እንዴት መሥራት እና አርዱኢኖ ማድረግ እንደሚቻል ፣ ይህ ፕሮጀክት የመጣው የመጀመሪያውን ጨዋታ ከአርዲኖ ጋር ለማድረግ ስንሞክር ፣ ሶኦኦ ፣ እኛ ከኖኪያ ክላሲክ እባብ (የት እንደሚጀመር አስበን ነበር) ቢያንስ የእባብ ክሎን:))።

የሚያስፈልግዎት

አቅርቦቶች

Arduino UNO ወይም clone

OLED ማሳያ

4 ዳዮዶች

500-1 ኪ

4 የመቆጣጠሪያ አዝራሮች

Passive Piezo buzzer

እንደ አማራጭ

Solderless BreadBoard

እባክዎን እነዚህ አገናኞች ለምሳሌ ብቻ እንደሆኑ ልብ ይበሉ

ደረጃ 1 ወረዳው

ወረዳው
ወረዳው

ከላይ ባለው ስዕል ውስጥ ወረዳችንን ማየት ይችላሉ ፣ አርዱዲኖ d4 d5 d6 d7 የሆኑትን የመቆጣጠሪያ ግብዓቶችን ለማንበብ ቅድሚያ እንዲሰጥ በአርዱዲኖ ላይ ፒን d3 ን እንደ ማቋረጫ ጥያቄ ፒን እንጠቀማለን። የወረዳዎቹ መሠረታዊ ነገሮች ወደ 5v የሚሄደው የአቅጣጫ ቁልፍ ተጭኖ ነው ይህ የተቋረጠውን የጥያቄ ፒን (d3 ሐምራዊ ሽቦ) እና ተጓዳኝ አቅጣጫ ፒን ያነቃቃል ፣ የተቋረጠው ተግባር የዝማኔ አቅጣጫ ተግባርን ይጠራል እና ያ ኮድ እባቡን ያንቀሳቅሳል። ፒን 9 በ + ፒን ላይ በቀጥታ ከ 5v ፓይዞ ጋር የተገናኘ PWM (~ pulse width modulation) በመሆኑ እንደ ድምፅ ፒን ሆኖ ያገለግላል እና ወደ - 0v/መሬት ይመለሳል።

(በአርዲኖ ዩኖ እና ፊደሎች ላይ ዲኢ 2 እና ዲ 3 ብቻ እንደ ማቋረጫ ጥያቄ ፒኖች ሆነው ሊያገለግሉ ይችላሉ)።

አቅጣጫ ካስማዎች;

d4 ወደላይ ኦርጋን

d5 ታች PINK

d6 ግራ ሰማያዊ

d7 ቀኝ BROWN

d9 ድምጽ GRAY

እያንዳንዱ አዝራር በ 5 ቪ የግንኙነት ግብዓት እና በአርዱዲኖ ላይ በመጀመሪያ ከየራሳቸው ዲጂታል ግብዓት ጋር የተገናኘ ውጤት አለው ፣ ይህ የእያንዳንዱ አዝራር ተመሳሳይ ውፅዓት ከዚያ ከራሱ ዳዮድ ጋር ተገናኝቷል ፣ የቮልቴጅ መመገብን ወደ ሌሎች አዝራሮች እና እነሱን ማንቃት። ካቶዴድ (-) በሁሉም 4 ዳዮዶች መጨረሻ ላይ እኛ ከ d3 ጋር የሚገናኝ የውጤት መገናኛን ለመፍጠር አንድ ላይ እንቀላቀላቸዋለን እና በማይሆንበት ጊዜ ተንሳፋፊ ፒኖችን እንዳይተው የአሩዲኖን ፒኖች ዝቅ ለማድረግ ወደ 0v/ምድር በተከላካዩ በኩል። ገብሯል።

(FYI) ተንሳፋፊ ፒን የውሸት ቮልቴጅን ሊቀበል እና ያልተለመደ ባህሪ ሊያስከትል ይችላል)

ማሳያውን ለመንዳት 2 የአናሎግ ካስማዎች ጥቅም ላይ ይውላሉ ፣ እነዚህ የ arduino ሃርድዌር i2c ፒኖች ናቸው።

A5 ከ SCL YELLOW ጋር ተገናኝቷል

A4 ከ SDA GREEN ጋር ተገናኝቷል

ከአርዱዲኖ ያለው +5v እና 0v (ምድር) ውፅዓት በዩኤስቢ ወይም በስልክ መሙያ ሊሠራ ለሚችል ለጠቅላላው ወረዳ የኃይል ምንጭ ሆኖ ያገለግላል።

ደረጃ 2 - ኮዱ

// ------------------------ የአንጃዋሬ እባብ ጨዋታዎች ከተጣሩ ሕዝቦች እርዳታ --------------- --------

#ያካትቱ

#ያካትቱ // https://github.com/adafruit/Afartafruit-GFX- ቤተ-መጽሐፍት #ይካተቱ // https://github.com/adafruit/Afadfruit-GFX- ቤተ-መጽሐፍት // የማሳያ ስብስብ (ስፋት ፣ ቁመት) Adafruit_SSD1306 ማሳያ (128 ፣ 64) ፤ // የግቤት ፒኖችን ይግለጹ እነዚህ በጭራሽ አይለወጡም በአርዱዲኖ ላይ ያሉት ፒኖች ናቸው ስለዚህ #መግለፅ #መግለፅ INTPIN 3 // ፒኖች 2 እና 3 ብቻ በ UNO ላይ #ተጣምረው UPPIN 4 // እነዚህ ፒኖች የተገናኙ ናቸው tp አግባብነት ያለው ማብሪያ #መግለፅ DWNPIN 5 #define LFTPIN 6 #define RHTPIN 7 #define SND 9 // አቅጣጫዎችን ይግለጹ #ዲፊፕ 1 // እነዚህ እሴቶች “እባብ” ለመወሰን የሚመለከተው ነው- #መግለፅ DIRDOWN 2 // እባቡ የሚጓዝበትን አቅጣጫ # DIRLEFT 3 ን #ይግለጹ DIRRIGHT 4

// የአዝራር ተለዋዋጮችን ያዘጋጁ

// volitile cos እኛ ማንኛውም የዑደት እሴት ሊሆን እንዲችል እርስ በእርስ በማዘመን እንፈልጋለን

// በጭራሽ ከ 4 ከፍ አይልም ስለዚህ ተለዋዋጭ ሀብቶችን ለማዳን 8 ቢት 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 snakeY = 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 ለመሰብሰብ ከፍተኛ ውጤት ያዘጋጁ

// --------------------------- ይህ በ intervept በ voltage ልቴጅ መነሳት ላይ የሚፈፀመው ------------ -------------

ባዶ የተቋረጠ () {መዘግየት (150); // ለተጨማሪ “መነሳት” ጥበቃ የዘመነ አቅጣጫ (); } // ------------------ የአዝራር ዋጋውን ከአዝራር ይጫኑ ----------------- ባዶ የዘመነ አቅጣጫ () { // Serial.println ("አዘምን አቅጣጫ"); butup = digitalRead (UPPIN); // የትኛው ግቤት ከፍ እንደደረሰ ያረጋግጡ እና ተገቢውን bool true butdown = digitalRead (DWNPIN) ያዘጋጁ ፤ butleft = digitalRead (LFTPIN); butright = digitalRead (RHTPIN); // እነዚህ መግለጫዎች የትኛውን ግብዓት ከፍ እንዳሉ ከተመለከቱ እና በ “buttonpressed” // ተለዋዋጭ ውስጥ ተገቢውን እሴት ከገቡ ፣ ይህ ተለዋዋጭ (Butup == true) {buttonpressed = DIRUP) ከሆነ የእንቅስቃሴውን አቅጣጫ ይደነግጋል። // Serial.println ("UP ተጭኗል"); // Serial.println (በአዝራር ተጭኗል); butup = ሐሰት; ቶን (SND, 1500, 10); } ከሆነ (butdown == true) {buttonpressed = DIRDOWN; // Serial.println ("ታች ተጭኗል"); // Serial.println (በአዝራር ተጭኗል); butdown = ሐሰት; ቶን (SND, 1500, 10); }

ከሆነ (butleft == true)

{buttonpressed = DIRLEFT; // Serial.println ("LEFT ተጭኗል"); // Serial.println (በአዝራር ተጭኗል); butleft = ሐሰት; ቶን (SND, 1500, 10); } ከሆነ (butright == true) {buttonpressed = DIRRIGHT; // Serial.println ("RIGHT pressed"); // Serial.println (በአዝራር ተጭኗል); butright = ሐሰት; ቶን (SND, 1500, 10); }}

// -------------------------- የማሳያ ልምዶችን ይሳሉ ------------------ -----------------

ባዶነት ዝመና ማሳያ () // ነጥቦችን እና ነጥቦችን ይሳሉ

{// Serial.println ("ማሳያ አዘምን");

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

display.setTextSize (0); display.setTextColor (ነጭ); // የውጤት ማሳያ ማሳያ.setCursor (2, 1); display.print ("ውጤት:"); display.print (ሕብረቁምፊ (የመጫወቻ ነጥብ ፣ DEC)); display.setCursor (66, 1); display.print ("ከፍተኛ:"); display.print (String (highscore, DEC)); // የመጫወቻ ቦታን ይሳሉ // ፖስ 1x ፣ 1y ፣ 2x ፣ 2y ፣ የቀለም ማሳያ.drawLine (0 ፣ 0 ፣ 127 ፣ 0 ፣ ነጭ); // በጣም የላይኛው የድንበር ማሳያ.drawLine (63 ፣ 0 ፣ 63 ፣ 9 ፣ ነጭ); // የውጤት መለያ ሰጭ ማሳያ.drawLine (0 ፣ 9 ፣ 127 ፣ 9 ፣ ነጭ); // ከዚህ በታች የጽሑፍ ድንበር display.drawLine (0 ፣ 63 ፣ 127 ፣ 63 ፣ ነጭ) ፤ // የታችኛው ድንበር ማሳያ.drawLine (0 ፣ 0 ፣ 0 ፣ 63 ፣ ነጭ); // የግራ ድንበር ማሳያ.drawLine (127 ፣ 0 ፣ 127 ፣ 63 ፣ ነጭ); // የቀኝ ድንበር

}

// ----------------------------------- የመጫወቻ ቦታን አዘምን ---------- --------------------

ባዶነት አዘምን ጨዋታ () // ይህ የጨዋታውን አካባቢ ማሳያ ያዘምናል

{display.clearDisplay ();

display.drawPixel (scranPosX ፣ scranPosY ፣ WHITE);

scranAte = scranFood ();

// የእባብ ልምዶችን ይፈትሹ

ከሆነ (outOfArea () || ራስን መሰብሰብ ())

{ ጨዋታው አለቀ(); }

// እባብ አሳይ

ለ (int i = 0; i0; i--) {snakePosX = snakePosX [i-1]; snakePosY = snakePosY [i-1]; } // ለእባቡ ተጨማሪ ፒክሰል ይጨምሩ (scranAte) {snakeSize+= 1; snakePosX [snakeSize-1] = snakeX; snakePosY [snakeSize-1] = snakeY; }

መቀየሪያ (በአዝራር ተጭኗል) // እባብ አቅጣጫ ነበር

{case DIRUP: snakeY- = 1; ሰበር; መያዣ DIRDOWN: snakeY+= 1; ሰበር; መያዣ DIRLEFT: snakeX- = 1; ሰበር; መያዣ DIRRIGHT: snakeX+= 1; ሰበር; } snakePosX [0] = snakeX; snakePosY [0] = snakeY; updateDisplay (); display.display (); // --------------------- ቅሌቱን ያስቀምጡ -------------------

ባዶ ቦታ ስክራን ()

{scranPosX = የዘፈቀደ (worldMinX+1 ፣ worldMaxX-1); scranPosY = የዘፈቀደ (worldMinY+1 ፣ worldMaxY-1); } // ------------------------- SCRAN ATE POINT UP ---------------- bool scranFood () {ከሆነ (snakeX == scranPosX && snakeY == scranPosY) {ተውኔት = ተውኔት+10 ፤ ቶን (SND, 2000, 10); updateDisplay (); placeScran (); መመለስ 1; } ሌላ {መመለስ 0; }} // --------------------- ከአከባቢ ውጭ ---------------------- bool outOfArea () {መመለስ snakeX = worldMaxX || snakeY = worldMaxY; } //---------------------- ጨዋታው አለቀ----------------------- --- ባዶነት ጨዋታ () {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"); ከሆነ (የመጫወቻ ነጥብ> = ከፍተኛ ውጤት) // ከከፍተኛ ውጤት በላይ ከፍ ያለ መሆኑን ያረጋግጡ /highscore = ተኮር ነጥብ ፤ // ነጠላ ከሆነ statment ከፍተኛ ውጤት ለማዘመን} ለ (int i = 0; i <= 16; i ++) // ይህ በጨዋታው ዙሪያ በ {display.drawRect (rectX1 ፣ rectY1 ፣ rectX2 ፣ rectY2 ፣ WHITE) ላይ አራት ማዕዘን ቅርጾችን ለመሳል ነው ፤ Serial.println ("loop ከሆነ"); display.display (); rectX1- = 2; // በ 2 ፒክሰሎች ይቀይሩ rectY1- = 2; rectX2+= 4; // ካለፈው ነጥብ rectY2+= 4 ከ 2 ፒክሰሎች በላይ ይቀይሩ ፤ ቶን (SND ፣ i*200, 3); } display.display (); // ከዝናብ በኋላ ስክሪን ይጠርጉ xX = 0; // የመስመር rectY1 = 0 መነሻ ቦታን ያዘጋጁ; rectX2 = 0; rectY2 = 63; ለ (int i = 0; i <= 127; i ++) {uint8_t cnt = 0; display.drawLine (rectX1 ፣ rectY1 ፣ rectX2 ፣ rectY2 ፣ BLACK) ፤ rectX1 ++; rectX2 ++; display.display (); } display.clearDisplay (); የመጫወቻ ነጥብ = 0; // የእባብን እና የተጫዋች ዝርዝሮችን ዳግም ያስጀምሩ መጠን = 1; snakeX = display.width ()/2; snakeY = display.height ()/2; waitForPress (); // ተጫዋች እስኪጀምር ይጠብቁ} // ------------------------- የፕሬስ loop ይጠብቁ ---------- --------------- ባዶ መጠበቅForPress () {bool waiting = 0; // loop ያበቃል whjen ይህ እውነተኛ ማሳያ ነው። ማሳያ ማሳያ (); (በመጠበቅ ላይ == 0) {drawALineForMe (ነጭ); // የዘፈቀደ ነጭ መስመርን መሳልALineForMe (ጥቁር); // ማያ ገጹ ሙሉ በሙሉ ነጭ ማሳያ እንዳይሞላ የዘፈቀደ ጥቁር መስመር ይሳሉ። ሙላ (19 ፣ 20 ፣ 90 ፣ 32 ፣ ጥቁር)። // ባዶ ዳራ ለጽሑፍ ማሳያ.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); // የድንበር እባብ ማሳያ.drawRect (19 ፣ 20 ፣ 90 ፣ 32 ፣ ነጭ); // የድንበር ሳጥን - 3 ማሳያ። ቅንብር ጠቋሚ (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; // ለአንድ መስመር የዘፈቀደ አስተባባሪዎችን ያቀናብሩ እና ከዚያ ይሳሉ // ተለዋዋጭ ባልሆነ መስመር 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) ፤ } // ------------------------------------ የግጭት መፈለጊያ -------- ------------------------

ለ (byte i = 4; i <snakeSize; i ++) {ከሆነ (snakeX == snakePosX && snakeY == snakePosy ) {ተመላሽ 1; ቶን (SND, 2000, 20); ቶን (SND ፣ 1000 ፣ 20); } መመለስ 0; }

//-------------------------------- አዘገጃጀት--------------- --------------------------------

ባዶነት ማዋቀር () {መዘግየት (100); // ነገሮችን “እንዲነሳ” ዕድል ብቻ ይስጡ/ Serial.begin (9600); // የተከታታይ ውጤቶችን ማሳያ.begin (SSD1306_SWITCHCAPVCC ፣ 0x3C) ለማየት ከፈለጉ ይህንን ምልክት ያንሱ። display.clearDisplay (); // በንጹህ ማሳያ ማሳያ ይጀምሩ። display.setTextWrap (ሐሰተኛ); display.dim (0); // የማሳያውን የብሩህነት ፒን ሞዶ (INTPIN ፣ INPUT) ያዘጋጁ ፤ // ትክክለኛውን ወደቦች ወደ ግብዓቶች pinMode (UPPIN ፣ INPUT) ያዘጋጁ ፤ pinMode (DWNPIN ፣ ማስገቢያ); pinMode (LFTPIN ፣ ማስገቢያ); pinMode (RHTPIN ፣ ማስገቢያ); // ይህ የግቤት ትዕዛዙ ይህ ግብዓቶችን/ትዕዛዞችን/ትዕዛዙን-ተግባርን-ፒን-ተግባርን በፒን ዓባሪ ላይ እንዲያከናውን የተቋረጠ ትእዛዝ ነው (ጣልቃ ገብነት (digitalPinToInterrupt (INTPIN) ፣ የተቋረጠ ፣ የሚነሳ)); // Serial.println ("ማዋቀር አልedል"); waitForPress (); // የእባቡን ጅምር ማሳያ ማያ ገጽ ስክራን () ያሳዩ (); // የመጀመሪያውን ቦታ ምግብ} // --------------------- ዋና ሎፕ ----------------- ---------------------- ባዶነት loop () {updateGame (); // ይህ ተግባር ዋናውን ኮድ የያዘው ነው}

ደረጃ 3

የሚመከር: