Arduboy Games & Flasher
POOM plays Arduboy games, and there are two ways in. Play: pick a ready-made game and flash it in one click — start here. Build: use the POOM Arduboy library to compile and migrate your own Arduboy sketches to run on POOM. Consumer POOM is an ESP32-C5.
poom.bin with the POOM web flasher (see Getting Started).
What Is Arduboy?
Arduboy is a credit-card-sized open-source game console with a 128×64 1-bit OLED and six buttons. Its games are small Arduino sketches (.ino) written against the Arduboy2 library, and the community has published hundreds as open source. POOM has the same screen shape and button layout, so with the right library those games run on it.
Play — The Game Flasher
The games flasher is a browser tool (like the POOM web flasher) that writes a ready-built game onto POOM over USB using Web Serial + esptool-js. No toolchain, no Arduino IDE.
- Open the games flasher and pick a game (thumbnail, name and details show up). The catalog has 167 flash-ready games across Arcade, Action, Puzzle, Shooter and more.
- Plug POOM in with a data USB-C cable and click Flash Game.
- The tool connects to the ESP32-C5, erases flash, and writes the game's merged image.
- On
DONE!, power the device off then on to boot the game.
Under the hood it flashes the game's *.ino.merged.bin at 0x00000 with Arduino ESP32-C5 settings dio / 80m / 4MB, using the esptool-js C5 stub with compressed writes and erase-all.
Build — The POOM Arduboy Library
The poom library is an Arduboy2-compatible port for ESP32 boards with a 128×64 I2C OLED, discrete buttons and a one-pin buzzer. It gives you the familiar Arduboy2 development experience — 1-bit framebuffer, frame timing, sprites, button input, audio — so an existing Arduboy sketch mostly just recompiles for POOM.
| What it provides | Detail |
|---|---|
| API | Compatible with Arduboy2Base / Arduboy2; include <Arduboy2.h> |
| Display | 128×64 1-bit framebuffer, SH1106 via Adafruit_SH110X |
| Input | pressed, justPressed, justReleased, classic button masks |
| Graphics | Primitives, text, bitmaps, compressed bitmaps, Sprites / SpritesB |
| Audio | Buzzer via arduboy.tunes; audio state saved in EEPROM |
| Extras | Boot menu (hold UP), SD .bin loader, ESP-NOW multiplayer, IMU |
Library metadata: name Arduboy2, version 5.2.1, architecture esp32. Dependencies to install in Arduino: Adafruit GFX, Adafruit SH110X, and Adafruit NeoPixel (for the RGB LED; disable with POOM_USE_WS2812 = 0).
Install the Library
Drop the repo into your Arduino sketchbook libraries/ folder as poom:
cd ~/Arduino/libraries
git clone <repo-url> poom
Restart Arduino IDE. Because the library exposes Arduboy2.h, sketches still use #include <Arduboy2.h>, and the bundled examples (ArduBreakout, BeepDemo, Buttons, HelloWorld, IMUdemo, PlayTune, RGBled, VidTest, menu) show up under File → Examples. Also install an ESP32 board package.
libraries/, not nested. Confirm your I2C address / pins in src/BoardConfig.h if your board differs.Quick-Start Sketch
#include <Arduboy2.h>
Arduboy2 arduboy;
void setup() {
arduboy.begin();
arduboy.setFrameRate(30);
}
void loop() {
if (!arduboy.nextFrame()) return; // frame timing
arduboy.pollButtons();
arduboy.clear();
arduboy.setCursor(18, 18);
arduboy.print("Hello ESP32");
if (arduboy.justPressed(A_BUTTON)) {
arduboy.tunes.tone(880, 80); // beep
}
arduboy.display();
}
The loop is the classic Arduboy pattern: nextFrame() gates timing, pollButtons() reads input, you draw into the framebuffer, and display() pushes it to the OLED. Button masks are the standard set: A_BUTTON, B_BUTTON, UP_BUTTON, DOWN_BUTTON, LEFT_BUTTON, RIGHT_BUTTON. Audio is toggleable at runtime (arduboy.audio.on()/off()) and its state persists in EEPROM.
Board Config (ESP32-C5)
All board-specific settings live in src/BoardConfig.h. Defaults for the consumer POOM (ESP32-C5):
| Signal | GPIO | Setting | Value |
|---|---|---|---|
| I2C SDA / SCL | 0 / 1 | OLED I2C address | 0x3C |
| Buzzer | 26 | OLED X shift | -2 |
| Button A / B | 28 / 9 | WS2812 RGB | on (GPIO 27) |
| UP / DOWN | 7 / 24 | SD MISO / MOSI | 8 / 4 |
| LEFT / RIGHT | 3 / 23 | SD SCK / CS | 6 / 5 |
0x3D, and adjust OLED_X_SHIFT if you see a horizontal offset/wraparound.IMU & ESP-NOW Multiplayer
Beyond stock Arduboy2, the POOM library adds an IMU (see the IMUdemo example) and wireless ESP-NOW multiplayer exposed as arduboy.multiplayer:
arduboy.multiplayer.begin("GAME_ID");
arduboy.multiplayer.update(arduboy.pressedButtons());
if (arduboy.multiplayer.remoteJustPressed(A_BUTTON)) { /* remote P2 */ }
arduboy.multiplayer.send(payload, length);
arduboy.multiplayer.read(payload, maxLength);
Two POOMs sync buttons and small state payloads so a second device can join a match. FESTIVEFIGHT_AB is the pilot: local two-player still works, and a remote P2 can control the second fighter over the air.
Migrate Your Own Game to POOM
This is the point of the library — take an Arduboy game and make it a POOM-flashable image:
- Install the
poomlibrary into~/Arduino/libraries(above). - Open the game's
.ino(its own folder). Existing Arduboy sketches include<Arduboy2.h>already, which now resolves to the POOM library. - Select the ESP32-C5 board and compile. With
arduino-cli:
arduino-cli compile \
--fqbn esp32:esp32:esp32c5 \
--build-path /tmp/arduino-build/mygame \
path/to/MYGAME_AB
- Merge the build artifacts into a single image and flash it with the game flasher (at
0x0), or load it from SD (below).
The repo already ships this done for many titles: migrated, compile-verified game sources live under arduboy/arduboy games/okay games/ (~125 compile-verified entries; open any .ino such as JETPAC_AB, FIREPANIC_AB or POOPPANIC_AB). Compile reports sit under esp32-games/_reports/.
Loading a Game from SD
The library's boot menu (hold UP at startup) can include Binary Load: browse the SD card, pick a .bin, and it flashes to the ESP32 with Arduino Update, then reboots. This needs an OTA partition scheme (two app slots) and the SD wired over SPI (C5: MISO 8, MOSI 4, SCK 6, CS 5). It's a handy on-device alternative to the web flasher for images you've already built.
Controls
Arduboy's D-pad + A/B map straight onto POOM's six buttons. Boot shortcuts from the library: hold UP for flashlight / boot menu, hold RIGHT during the logo to skip it, and B + UP / B + DOWN at boot enable/disable audio.
poom.bin to restore the full POOM tools.Where to Go Next
For on-device gaming tools (BLE controller, air-mouse, air drums) see THE GAMER Lab. To read a Qwiic sensor from inside an Arduboy sketch, see the I2C/Qwiic section in THE MAKER Lab. To restore the multitool, use the flasher in Getting Started.