A retro arcade gaming console built with ESP32, featuring classic arcade games controlled with a rotary encoder and buttons.
MultiArcade brings classic arcade gaming to an ESP32 microcontroller with a TFT display. The console includes 7 playable games:
- Asteroids - Navigate your ship through an asteroid field
- Pong - Classic paddle game (1 or 2 player modes)
- Breakout - Break all the blocks with your ball
- Space Invaders - Defend against waves of alien invaders
- Lunar Lander - Carefully land your spacecraft
- Cannon - Artillery physics-based game
- Tempest - Tube shooter action
- ESP32 development board
- TFT Display (160x128 compatible with TFT_eSPI library)
- Rotary Encoder with push button (debounced recommended)
- Piezo Buzzer for sound effects
- 2 Fire Buttons (optional, depending on game)
See wiring.fzz for the complete Fritzing schematic.
Note: While a debounced rotary encoder is recommended for best performance, the console may work without debouncing.
- PlatformIO - Development environment
- TFT_eSPI Library by Bodmer - Display driver
-
Clone this repository:
git clone https://github.com/mortara/MultiArcade.git cd MultiArcade -
Configure the TFT_eSPI library for your specific display (edit
User_Setup.hin the library folder) -
Open the project in PlatformIO (VS Code recommended)
-
Build and upload to your ESP32:
pio run --target upload
The main configuration can be found in src/general/config.h. You may need to adjust:
- Pin assignments for your rotary encoder
- Display settings
- Sound settings
- Power on the ESP32
- Use the rotary encoder to navigate the game menu
- Press the fire button to select a game
- In-game controls:
- Rotate encoder - Move left/right or aim
- Button 1 - Fire/shoot
- Button 2 - Secondary action (game-dependent)
While connected via USB, you can use these serial commands:
r- Restart the ESP32i- Display WiFi/system information
MultiArcade/
├── src/
│ ├── Asteroids/ # Asteroids game implementation
│ ├── Pong/ # Pong game (1P and 2P)
│ ├── breakout/ # Breakout game
│ ├── spaceinvaders/ # Space Invaders game
│ ├── lunarlander/ # Lunar Lander game
│ ├── cannon/ # Cannon artillery game
│ ├── tempest/ # Tempest tube shooter
│ ├── general/ # Core game engine and manager
│ ├── input/ # Input handling (rotary encoder, joystick)
│ ├── sound/ # Sound/buzzer management
│ └── main.cpp # Main entry point
├── platformio.ini # PlatformIO configuration
├── wiring.fzz # Fritzing wiring diagram
└── README.md
This project uses a simple game engine architecture:
Game- Base class for all gamesGameObject- Base class for game entitiesGameWorld- Physics and collision managementManager- Game state and menu management
The code intentionally avoids over-engineering to keep things simple and readable. Feel free to extend it with your own games!
This project is licensed under the MIT License - see the LICENSE file for details.
- Homepage: mortara.org
- TFT_eSPI Library: github.com/Bodmer/TFT_eSPI
- Bodmer for the excellent TFT_eSPI library
- Classic arcade games that inspired this project
Note: This is a hobby project. The code prioritizes simplicity and fun over production-quality standards!
