Jhuman Khan
Published

Diy Arduino Nano Games Console – Complete Home Project Guide

If you love electronics, Arduino projects, and retro-style games, then this DIY project is perfect for you.

BeginnerFull instructions provided85
Diy Arduino Nano Games Console – Complete Home Project Guide

Story

Read more

Custom parts and enclosures

screenshot_2026-01-03_182000_wDRtFVU67k.png

Code

code

Arduino
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Button pins
#define UP_BTN     2
#define LEFT_BTN   3
#define RIGHT_BTN  4
#define DOWN_BTN   5

// Debounce timing
unsigned long lastInputTime = 0;
const unsigned long debounceDelay = 100;

// Snake grid and logic
#define GRID_SIZE  4
#define MAX_LENGTH 64

int snakeX[MAX_LENGTH];
int snakeY[MAX_LENGTH];
int length = 3;
int dirX = 1;
int dirY = 0;

int foodX, foodY;
bool gameOver = false;

void setup() {
  Serial.begin(9600);

  pinMode(UP_BTN, INPUT_PULLUP);
  pinMode(LEFT_BTN, INPUT_PULLUP);
  pinMode(RIGHT_BTN, INPUT_PULLUP);
  pinMode(DOWN_BTN, INPUT_PULLUP);

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("OLED failed"));
    while (1);
  }

  display.clearDisplay();
  display.display();

  snakeX[0] = 64; snakeY[0] = 32;
  snakeX[1] = 60; snakeY[1] = 32;
  snakeX[2] = 56; snakeY[2] = 32;

  generateFood();
}

void loop() {
  if (gameOver) {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(30, 30);
    display.println("Game Over!");
    display.display();
    delay(3000);
    resetGame();
  }

  handleInput();
  moveSnake();
  checkCollision();
  drawGame();

  delay(150);
}

void handleInput() {
  unsigned long now = millis();
  if (now - lastInputTime < debounceDelay) return;

  if (!digitalRead(UP_BTN) && dirY != 1) {
    dirX = 0; dirY = -1;
    lastInputTime = now;
  } else if (!digitalRead(DOWN_BTN) && dirY != -1) {
    dirX = 0; dirY = 1;
    lastInputTime = now;
  } else if (!digitalRead(LEFT_BTN) && dirX != 1) {
    dirX = -1; dirY = 0;
    lastInputTime = now;
  } else if (!digitalRead(RIGHT_BTN) && dirX != -1) {
    dirX = 1; dirY = 0;
    lastInputTime = now;
  }
}

void moveSnake() {
  for (int i = length - 1; i > 0; i--) {
    snakeX[i] = snakeX[i - 1];
    snakeY[i] = snakeY[i - 1];
  }

  snakeX[0] += dirX * GRID_SIZE;
  snakeY[0] += dirY * GRID_SIZE;

  if (snakeX[0] == foodX && snakeY[0] == foodY) {
    if (length < MAX_LENGTH) length++;
    generateFood();
  }
}

void generateFood() {
  foodX = random(0, SCREEN_WIDTH / GRID_SIZE) * GRID_SIZE;
  foodY = random(0, SCREEN_HEIGHT / GRID_SIZE) * GRID_SIZE;
}

void checkCollision() {
  if (snakeX[0] < 0 || snakeX[0] >= SCREEN_WIDTH || snakeY[0] < 0 || snakeY[0] >= SCREEN_HEIGHT) {
    gameOver = true;
    return;
  }

  for (int i = 1; i < length; i++) {
    if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
      gameOver = true;
      return;
    }
  }
}

void drawGame() {
  display.clearDisplay();

  // Draw snake
  for (int i = 0; i < length; i++) {
    display.fillRect(snakeX[i], snakeY[i], GRID_SIZE, GRID_SIZE, SSD1306_WHITE);
  }

  // Draw food
  display.fillRect(foodX, foodY, GRID_SIZE, GRID_SIZE, SSD1306_WHITE);

  display.display();
}

void resetGame() {
  length = 3;
  snakeX[0] = 64; snakeY[0] = 32;
  snakeX[1] = 60; snakeY[1] = 32;
  snakeX[2] = 56; snakeY[2] = 32;
  dirX = 1; dirY = 0;
  gameOver = false;
  generateFood();
}

Credits

Jhuman Khan
28 projects • 8 followers
Diploma in Electronics, B.Sc in EEE

Comments