{"id":414,"date":"2026-09-12T15:10:27","date_gmt":"2026-09-12T14:10:27","guid":{"rendered":"https:\/\/kuliahelektro.org\/?p=414"},"modified":"2026-09-12T15:10:28","modified_gmt":"2026-09-12T14:10:28","slug":"bikin-game-dino-oled-display-pake-arduino-uno-di-simulator-wokwi","status":"publish","type":"post","link":"https:\/\/kuliahelektro.org\/?p=414","title":{"rendered":"Bikin GAME DINO OLED DISPLAY Pake Arduino UNO di Simulator WOKWI"},"content":{"rendered":"\n<p><br><strong>Tutorial Pembuatan Game Dino Runner Menggunakan Arduino UNO dan OLED Display SSD1306 pada Simulator WOKWI<\/strong><\/p>\n\n\n\n<p>Pada bagian ini akan dibahas pembuatan proyek game interaktif <em>Dino Runner<\/em> berbasis logika lompat rintangan sederhana menggunakan mikrokontroler Arduino UNO, layar OLED Display SSD1306 0.96 inci (I2C), dan tombol <em>push button<\/em> sebagai kontroler, serta software simulasi WOKWI. Skematik rangkaian ditunjukkan pada Gambar 1, program Arduino pada Kode 1, dan video pembuatan pada tautan Video 1. Grafis dinosaurus dan rintangan dirender secara <em>bitmapped<\/em> langsung pada layar OLED. Pada saat tombol ditekan, karakter Dino akan melompat untuk menghindari rintangan yang bergerak, serta skor permainan akan terus bertambah dan ditampilkan secara <em>real-time<\/em> hingga kondisi <em>game over<\/em> tercapai.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.youtube.com\/watch?v=USwjqDh9Tak&amp;lc=UgyyF5Sc4DgvOqgrkLV4AaABAg\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" loading=\"lazy\" width=\"916\" height=\"893\" src=\"https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/09\/image-7.png\" alt=\"\" class=\"wp-image-415\" srcset=\"https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/09\/image-7.png 916w, https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/09\/image-7-300x292.png 300w, https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/09\/image-7-768x749.png 768w\" sizes=\"(max-width: 916px) 100vw, 916px\" \/><\/a><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><strong>Gambar 1. Skematik rangkaian sistem<\/strong><\/p>\n\n\n\n<p>Pemetaan PIN:<br>* <strong>OLED DISPLAY 0.96 INCH I2C<\/strong><br>GND => GND<br>VCC => 5V<br>SDA => SDA<br>SCL => SCL<br>* <strong>SEVEN SEGMENT<\/strong><br>VCC => 5V<br>DCLK => 6<br>DIO => 5<br>GND => GND<br>* <strong>BUTTON<\/strong><br>GND \u2013 GND<br>OUT \u2013 3<br>* <strong>BUZZER<\/strong><br>GND \u2013 GND<br>OUT \u2013 10<\/p>\n\n\n\n<p class=\"has-text-align-center\"><strong>Kode Arduino 1. Kode Program<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ALFIAN CENTER\r\n\/\/SUBSCRIBE\r\n\/\/=-=-=-=-=--=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=--=-=\r\n\r\n\r\n#include &lt;U8glib.h>\r\n#include \"TM1637Display.h\"\r\n\r\n\/\/ HW Pins required\r\n#define SW 3 \/\/ RotaryEncoder SW Pin\r\n#define DT 4 \/\/ RotaryEncoder DT Pin\r\n#define CLK 2 \/\/ RotaryEncoder CLK Pin\r\n\r\n\/\/ Define the display connections pins:\r\n#define DCLK 6\r\n#define DIO 5\r\n\r\n\/\/ pin 10 drives the buzzer\r\n#define buzzer  10\r\n\r\n\/\/ In Addition, this sketch uses the I2C Pins for the U8G Panel\r\n\/\/ A1+A2\r\n\r\n\/\/ Create display object of type TM1637Display\r\n\/\/ The display shows the current score\r\nTM1637Display OurDisplay = TM1637Display(DCLK, DIO);\r\n\r\n\/\/ Create array that turns all segments off:\r\nconst uint8_t blank&#91;] = {0x00, 0x00, 0x00, 0x00}; \/\/ 0xff is a hexidecimal number whose binary\r\n\/\/ representation is all zeros\r\n\r\n\/\/ Create the oled display object - this shows gameplay\r\n\/\/ and welcome\/win\/loss messages\r\n\r\nU8GLIB_SH1106_128X64  My_u8g_Panel(U8G_I2C_OPT_NONE); \/\/ I2C \/ TWI\r\n\r\n\/*\r\n  For documentation on u8glib functions:\r\n  https:&#47;&#47;github.com\/olikraus\/u8glib\/wiki\/userreference\r\n*\/\r\n\r\n\/\/ Sounds we use for the hit effects\r\n#define jumpSound 700\r\n#define blahSound 125\r\n#define speedSound 1000\r\n#define DBOUNCE 180\r\n\r\n\/\/ Game states\r\n#define gameStart 0\r\n#define gameEnd 1\r\n#define gamePlaying 2\r\n\r\nvolatile int gameStatus = gameStart;\r\n\r\n\/\/ PRE-SAVED BITMAP CONSTANTS\r\n\/\/20 x 21\r\nstatic unsigned char dinoJump &#91;] U8G_PROGMEM = {\r\n  0x00, 0xFC, 0x07, 0x00, 0xFE, 0x07, 0x00, 0xEE, 0x0F, 0x00, 0xFE, 0x0F,\r\n  0x00, 0xFE, 0x0F, 0x00, 0xFE, 0x0F, 0x00, 0xFE, 0x07, 0x06, 0xFF, 0x03,\r\n  0xC3, 0xFF, 0x00, 0xE7, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00,\r\n  0xFF, 0x3F, 0x00, 0xFE, 0x3F, 0x00, 0xFC, 0x1F, 0x00, 0xF8, 0x1F, 0x00,\r\n  0xF0, 0x1F, 0x00, 0xF0, 0x0E, 0x00, 0x60, 0x0E, 0x00, 0xE0, 0x0E, 0x00,\r\n  0xE0, 0x1E, 0x00,\r\n};\r\n\/\/20 x 21\r\nstatic unsigned char dinoLeft &#91;] U8G_PROGMEM = {\r\n  0x00, 0xFC, 0x07, 0x00, 0xFE, 0x07, 0x00, 0xEE, 0x0F, 0x00, 0xFE, 0x0F,\r\n  0x00, 0xFE, 0x0F, 0x00, 0x7E, 0x08, 0x00, 0x7E, 0x00, 0x06, 0xFF, 0x03,\r\n  0x87, 0x3F, 0x00, 0xE7, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00,\r\n  0xFF, 0x3F, 0x00, 0xFE, 0x3F, 0x00, 0xFC, 0x1F, 0x00, 0xF8, 0x1F, 0x00,\r\n  0xF0, 0x1F, 0x00, 0xE0, 0x1E, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x00, 0x00,\r\n  0xE0, 0x00, 0x00,\r\n};\r\n\/\/20 x 21\r\nstatic unsigned char dinoRight &#91;] U8G_PROGMEM = {\r\n  0x00, 0xFC, 0x07, 0x00, 0xEE, 0x07, 0x00, 0xE6, 0x0F, 0x00, 0xFE, 0x0F,\r\n  0x00, 0xFE, 0x0F, 0x00, 0xFE, 0x0F, 0x00, 0x7C, 0x00, 0x06, 0xFF, 0x03,\r\n  0xC3, 0xFF, 0x00, 0xE7, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00,\r\n  0xFF, 0x3F, 0x00, 0xFE, 0x3F, 0x00, 0xFC, 0x1F, 0x00, 0xF8, 0x1F, 0x00,\r\n  0xF0, 0x1F, 0x00, 0xF0, 0x0F, 0x00, 0xE0, 0x0E, 0x00, 0x00, 0x0E, 0x00,\r\n  0x00, 0x1E, 0x00,\r\n};\r\n\/\/shape 0:  39 x 12\r\nstatic unsigned char cloud &#91;] U8G_PROGMEM = {\r\n  0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x03, 0x00, 0x00, 0x00,\r\n  0x03, 0x06, 0x00, 0x00, 0x80, 0x01, 0x04, 0x00, 0x00, 0x40, 0x00, 0x1C,\r\n  0x00, 0x00, 0x40, 0x00, 0xE4, 0x03, 0x00, 0x18, 0x00, 0x00, 0x02, 0xE0,\r\n  0x0F, 0x00, 0x00, 0x0E, 0x30, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\r\n  0x00, 0x20, 0x12, 0x00, 0x00, 0x00, 0x40, 0x03, 0xFF, 0xFF, 0xFF, 0x7F,\r\n};\r\n\/\/shape 1: 10 x 20\r\nstatic unsigned char oneCactus &#91;] U8G_PROGMEM = {\r\n  0x30, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x01, 0xFB, 0x03,\r\n  0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x01,\r\n  0xFE, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00,\r\n  0x78, 0x00, 0x00, 0x00,\r\n};\r\n\/\/shape 2: 20 x 20\r\nstatic unsigned char twoCactus &#91;] U8G_PROGMEM = {\r\n  0x30, 0xC0, 0x00, 0x38, 0xE0, 0x00, 0x38, 0xE8, 0x00, 0x38, 0xEC, 0x00,\r\n  0x38, 0xED, 0x04, 0xBB, 0xED, 0x0E, 0xBB, 0xED, 0x0E, 0xBB, 0xFD, 0x0E,\r\n  0xBB, 0xFD, 0x0E, 0xBB, 0xF9, 0x0E, 0xFF, 0xF1, 0x0F, 0xFF, 0xE0, 0x07,\r\n  0x7E, 0xE0, 0x01, 0x38, 0xE0, 0x00, 0x38, 0xE0, 0x00, 0x38, 0xE0, 0x00,\r\n  0x38, 0xE0, 0x00, 0x38, 0xE0, 0x00, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00,\r\n};\r\n\r\n\/\/shape 3: 20 x 20\r\nstatic unsigned char threeCactus &#91;] U8G_PROGMEM = {\r\n  0x00, 0xC0, 0x00, 0x18, 0xC0, 0x01, 0x18, 0xC0, 0x01, 0x58, 0xD8, 0x01,\r\n  0x58, 0xFC, 0x01, 0x58, 0xFC, 0x0F, 0x78, 0xDC, 0x0F, 0x7F, 0xFC, 0x0F,\r\n  0x3B, 0xFD, 0x0D, 0x1B, 0xF9, 0x0C, 0x5B, 0xF5, 0x0F, 0x5B, 0xC5, 0x07,\r\n  0x5F, 0xE7, 0x03, 0xDE, 0xE7, 0x01, 0xD8, 0xC3, 0x01, 0x98, 0xC1, 0x01,\r\n  0x18, 0xC1, 0x01, 0x18, 0xC1, 0x01, 0x18, 0xE1, 0x01, 0x00, 0x00, 0x00,\r\n};\r\n\/\/shape 4: 6 x 12\r\nstatic unsigned char oneCactusSmall &#91;] U8G_PROGMEM = {\r\n  0x0C, 0x0C, 0x3C, 0x3D, 0x2D, 0x3D, 0x1D, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C,\r\n};\r\n\/\/shape 5: 12 x 12\r\nstatic unsigned char twoCactusSmall &#91;] U8G_PROGMEM = {\r\n  0x0C, 0x03, 0x0C, 0x03, 0x6C, 0x0B, 0x6D, 0x0B, 0x6D, 0x0B, 0xBD, 0x0B,\r\n  0x1F, 0x0F, 0x0E, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03,\r\n};\r\n\/\/shape 6: 17 x 12\r\nstatic unsigned char threeCactusSmall &#91;] U8G_PROGMEM = {\r\n  0x04, 0x41, 0x00, 0x0C, 0x61, 0x00, 0xFC, 0x79, 0x01, 0xFD, 0x7D, 0x01,\r\n  0x7D, 0x6D, 0x01, 0x7D, 0x7D, 0x01, 0xCF, 0xE5, 0x01, 0xCE, 0x67, 0x00,\r\n  0x8C, 0x67, 0x00, 0x0C, 0x63, 0x00, 0x0C, 0x61, 0x00, 0x0C, 0x61, 0x00,\r\n};\r\n\r\nstatic unsigned char dinoBlah &#91;] U8G_PROGMEM = {\r\n  0x00, 0xFC, 0x07, 0x00, 0xFE, 0x07, 0x00, 0xC6, 0x0F, 0x00, 0xC6, 0x0F,\r\n  0x00, 0xCE, 0x0F, 0x00, 0xFE, 0x0F, 0x00, 0xFE, 0x0F, 0x06, 0xFF, 0x03,\r\n  0x87, 0x7F, 0x00, 0xE7, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00,\r\n  0xFF, 0x3F, 0x00, 0xFE, 0x3F, 0x00, 0xFC, 0x1F, 0x00, 0xF8, 0x1F, 0x00,\r\n  0xF0, 0x1F, 0x00, 0xF0, 0x0E, 0x00, 0x60, 0x0E, 0x00, 0x60, 0x0E, 0x00,\r\n  0xE0, 0x1E, 0x00,\r\n};\r\n\r\nstatic unsigned char gameOver &#91;] U8G_PROGMEM = {\r\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r\n  0x00, 0x00, 0x00, 0xF8, 0x01, 0x02, 0x0C, 0x0C, 0x3E, 0x00, 0x78, 0x60,\r\n  0x30, 0x7C, 0xF0, 0x01, 0x0C, 0x01, 0x07, 0x14, 0x0A, 0x02, 0x00, 0x84,\r\n  0x40, 0x10, 0x04, 0x10, 0x02, 0x04, 0x00, 0x05, 0x14, 0x0A, 0x02, 0x00,\r\n  0x02, 0x41, 0x10, 0x04, 0x10, 0x02, 0x04, 0x00, 0x05, 0x14, 0x0A, 0x02,\r\n  0x00, 0x02, 0xC1, 0x18, 0x04, 0x10, 0x02, 0xC4, 0x81, 0x0D, 0x34, 0x0B,\r\n  0x3E, 0x00, 0x02, 0x81, 0x08, 0x7C, 0xF0, 0x01, 0x04, 0x81, 0x08, 0x24,\r\n  0x09, 0x02, 0x00, 0x02, 0x81, 0x0D, 0x04, 0x10, 0x01, 0x04, 0x81, 0x0F,\r\n  0x64, 0x09, 0x02, 0x00, 0x02, 0x01, 0x05, 0x04, 0x10, 0x02, 0x0C, 0xC1,\r\n  0x18, 0xC4, 0x08, 0x02, 0x00, 0x84, 0x00, 0x05, 0x04, 0x10, 0x02, 0xF8,\r\n  0x41, 0x10, 0xC4, 0x08, 0x3E, 0x00, 0x78, 0x00, 0x07, 0x7C, 0x10, 0x02,\r\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r\n  0x00, 0x00, 0x00,\r\n};\r\n\r\n\r\n\/\/ Other Game attributes\r\n\r\n\/\/ various variables\r\nint currentStateCLK;\r\nint lastStateCLK;\r\nint MyScore = 0;\r\nint dinoMove = 0;\r\nvolatile int jumping = 0;\r\nint cloudx = 128;\r\nint obstacles &#91;2] = {1, 4};\r\nint obstaclex &#91;2] = {128, 200};\r\nint speed = 8;\r\nunsigned long startTime = millis(), curTime;\r\nint lastBeep = 0;\r\n\r\n\/\/ Display the score on the 7seg display\r\nvoid ShowScore () {\r\n  if (gameStatus == gamePlaying) {\r\n    curTime = millis ();\r\n    MyScore = (curTime - startTime) * speed \/ 1000;\r\n    OurDisplay.showNumberDecEx(MyScore);\r\n    if (MyScore \/ 100 > lastBeep) {\r\n      tone (buzzer, 1000, 100);\r\n      delay (150);\r\n      tone (buzzer, 1250, 100);\r\n      lastBeep = MyScore \/ 100;\r\n    }\r\n  }\r\n}\r\n\r\n\r\nvoid StartStopGame () {\r\n  static unsigned long last_interrupt = 0;\r\n  if (millis() - last_interrupt > DBOUNCE) {\r\n    if (gameStatus == gamePlaying) {\r\n      if (jumping == 0) {\r\n        jumping = 1;\r\n        tone (buzzer, jumpSound, 100);\r\n      }\r\n    }\r\n    else if (gameStatus == gameStart) gameStatus = gamePlaying;\r\n    else gameStatus = gameStart;\r\n  }\r\n  last_interrupt = millis(); \/\/note the last time the ISR was called\r\n\r\n}\r\n\r\nvoid resetGame () {\r\n  MyScore = 0;\r\n  startTime = millis();\r\n  obstaclex&#91;0] = 128;\r\n  obstaclex &#91;1] = 200;\r\n  dinoMove = 0;\r\n}\r\n\r\nvoid setup() {\r\n  OurDisplay.setBrightness(7);\r\n  OurDisplay.clear();\r\n  resetGame();\r\n  ShowScore ();\r\n  pinMode(CLK, INPUT);\r\n  pinMode(DT, INPUT);\r\n  pinMode(SW, INPUT_PULLUP);\r\n  pinMode(buzzer, OUTPUT);\r\n  attachInterrupt(digitalPinToInterrupt(SW), StartStopGame, FALLING);\r\n}\r\n\r\n\/\/ ************************************************\r\nvoid loop(void) {\r\n  ShowScore();\r\n  My_u8g_Panel.firstPage();\r\n  do {\r\n    draw();\r\n  } while ( My_u8g_Panel.nextPage() );\r\n  if (gameStatus == gamePlaying) {\r\n    moveDino();\r\n    moveCloud();\r\n    moveObstacles();\r\n  }\r\n}\r\n\r\nvoid moveDino () {\r\n  if (jumping == 0) dinoMove = (dinoMove + 1) % 3;\r\n  else {\r\n    if (jumping == 1) {\r\n      dinoMove = dinoMove + 8;\r\n      if (dinoMove > 32) jumping = 2;\r\n    } else {\r\n      dinoMove = dinoMove - 8;\r\n      if (dinoMove &lt; 8) {\r\n        jumping = 0;\r\n        dinoMove = 0;\r\n      }\r\n    }\r\n  }\r\n  checkCollision ();\r\n}\r\n\r\nvoid moveCloud () {\r\n  cloudx --;\r\n  if (cloudx &lt; -38) cloudx = 128;\r\n}\r\n\r\nvoid moveObstacles() {\r\n  int obx = obstaclex &#91;0];\r\n  obx = obx - speed;\r\n  if (obx &lt; -20) {\r\n    obstaclex&#91;0] = obstaclex&#91;1];\r\n    obstaclex&#91;1] = obstaclex&#91;0] + random(80, 125);\r\n    obstacles&#91;0] = obstacles&#91;1];\r\n    obstacles&#91;1] = random (1, 6);\r\n  }\r\n  else {\r\n    obstaclex&#91;0] = obx;\r\n    obstaclex&#91;1] -= speed;\r\n  }\r\n\r\n}\r\n\/\/ ************************************************\r\n\r\nvoid draw(void) {\r\n  u8g_prepare();\r\n  if (gameStatus == gamePlaying) {\r\n    drawDino ();\r\n    drawShape (0, cloudx);\r\n    drawObsticles ();\r\n  }\r\n  else if (gameStatus == gameStart) {\r\n    My_u8g_Panel.drawStr( 0, 0, \"ALFIAN CENTER\");\r\n    My_u8g_Panel.drawStr( 0, 20, \"Welcome to Dino!!\");\r\n    My_u8g_Panel.drawStr( 0, 50, \"Push to begin\");\r\n    resetGame();\r\n    ShowScore();\r\n  }\r\n  else {\r\n    My_u8g_Panel.drawXBMP( 14, 12, 100, 15, gameOver);\r\n    drawDino ();\r\n    drawShape (0, cloudx);\r\n    drawObsticles ();\r\n  }\r\n\r\n}\r\n\r\n\r\nvoid drawDino (void) {\r\n  if (gameStatus == gameEnd) {\r\n    My_u8g_Panel.drawXBMP( 0, 43 - dinoMove, 20, 21, dinoBlah);\r\n    return;\r\n  }\r\n  switch (dinoMove) {\r\n    case -1: My_u8g_Panel.drawXBMP( 0, 43, 20, 21, dinoBlah); break;\r\n    case 0: My_u8g_Panel.drawXBMP( 0, 43, 20, 21, dinoJump); break;\r\n    case 1: My_u8g_Panel.drawXBMP( 0, 43, 20, 21, dinoLeft); break;\r\n    case 2: My_u8g_Panel.drawXBMP( 0, 43, 20, 21, dinoRight); break;\r\n    default: My_u8g_Panel.drawXBMP( 0, 43 - dinoMove, 20, 21, dinoJump); break;\r\n  }\r\n}\r\n\r\nvoid drawShape (int shape, int x) {\r\n  switch (shape) {\r\n    case 0: My_u8g_Panel.drawXBMP( x, 5, 39, 12, cloud); break;\r\n    case 1: My_u8g_Panel.drawXBMP( x, 44, 10, 20, oneCactus); break;\r\n    case 2: My_u8g_Panel.drawXBMP( x, 44, 20, 20, twoCactus); break;\r\n    case 3: My_u8g_Panel.drawXBMP( x, 44, 20, 20, threeCactus); break;\r\n    case 4: My_u8g_Panel.drawXBMP( x, 52, 6, 12, oneCactusSmall); break;\r\n    case 5: My_u8g_Panel.drawXBMP( x, 52, 12, 12, twoCactusSmall); break;\r\n    case 6: My_u8g_Panel.drawXBMP( x, 52, 17, 12, threeCactusSmall); break;\r\n  }\r\n}\r\n\r\nvoid checkCollision () {\r\n  int obx = obstaclex &#91;0];\r\n  int obw, obh;\r\n\r\n  switch (obstacles&#91;0]) {\r\n    case 0: obw =  39; obh = 10; break;\r\n    case 1: obw = 10; obh = 20; break;\r\n    case 2: obw = 17; obh = 20; break;\r\n    case 3: obw = 17; obh = 20; break;\r\n    case 4: obw = 6; obh = 12; break;\r\n    case 5: obw = 12; obh = 12; break;\r\n    case 6: obw = 17; obh = 12; break;\r\n  }\r\n  if (obx > 15 || obx + obw &lt; 5 || dinoMove > obh - 3) {}\r\n  else {\r\n    gameStatus = gameEnd;\r\n    tone (buzzer, 125, 100);\r\n    delay(150);\r\n    tone (buzzer, 125, 100);\r\n  }\r\n}\r\nvoid drawObsticles () {\r\n  drawShape (obstacles&#91;0], obstaclex&#91;0]);\r\n  drawShape (obstacles&#91;1], obstaclex&#91;1]);\r\n}\r\nvoid u8g_prepare(void) {\r\n  My_u8g_Panel.setFont(u8g_font_6x10);\r\n  My_u8g_Panel.setFontRefHeightExtendedText();\r\n  My_u8g_Panel.setDefaultForegroundColor();\r\n  My_u8g_Panel.setFontPosTop();\r\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/www.youtube.com\/watch?v=USwjqDh9Tak&amp;lc=UgyyF5Sc4DgvOqgrkLV4AaABAg\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"576\" src=\"https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/09\/image-8-1024x576.png\" alt=\"\" class=\"wp-image-417\" style=\"aspect-ratio:1.7777777777777777;width:840px;height:auto\" srcset=\"https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/09\/image-8-1024x576.png 1024w, https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/09\/image-8-300x169.png 300w, https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/09\/image-8-768x432.png 768w, https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/09\/image-8-1536x864.png 1536w, https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/09\/image-8.png 1919w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><strong>Video 1. Video tutorial pembuatan simulasi di WOKWI<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tutorial Pembuatan Game Dino Runner Menggunakan Arduino UNO dan OLED Display SSD1306 pada Simulator WOKWI Pada bagian ini akan dibahas pembuatan proyek game interaktif Dino Runner berbasis logika lompat rintangan sederhana menggunakan mikrokontroler Arduino UNO, layar OLED Display SSD1306 0.96 inci (I2C), dan tombol push button sebagai kontroler, serta software simulasi WOKWI. Skematik rangkaian ditunjukkan pada Gambar 1, program Arduino&#8230;<\/p>\n","protected":false},"author":3,"featured_media":416,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"_links":{"self":[{"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=\/wp\/v2\/posts\/414"}],"collection":[{"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=414"}],"version-history":[{"count":1,"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=\/wp\/v2\/posts\/414\/revisions"}],"predecessor-version":[{"id":418,"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=\/wp\/v2\/posts\/414\/revisions\/418"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=\/wp\/v2\/media\/416"}],"wp:attachment":[{"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=414"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=414"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=414"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}