A tiny ESP32-based digital monster pet with an e-ink display that evolves over time based on care, sleep cycles, and randomness.
Monbit is a personal project created to learn embedded development, hardware prototyping, and product design.
The goal is not only to create a device, but also to explore the full product development process. From firmware and electronics to CAD design and physical prototype.
I want to document the entire journey, sharing both successes and failures, to create a resource for others interested in similar projects.
Current Version: v0.0.4 (2026-07-13)
- ESP32 bring-up
- Project architecture (modular source files)
- E-Ink display communication
- Basic UI rendering
- Partial display refresh
- 3-button input system
- Button debouncing
- Monster state system
- Monster actions (Feed / Play / Sleep)
- Automatic monster tick system
- Persistent storage (save/load)
- Audio subsystem
- Menu system
- Battery management
- Deep sleep
- Sprite rendering
- Components selected
- ESP32 tested
- E-Ink display tested
- Buttons tested (breadboard)
- First enclosure front prototype designed (front lid, far from final)
- Audio amplifier connected
- Speaker connected
- Battery integrated
- Charging module integrated
- Power switch integrated
- Accelerometer integrated
- Permanent wiring
- First fully assembled prototype
- Final enclosure designed
- Basic monster stats
- Monster actions
- Time-based stat changes
- Beep when button is pressed
- Naming the monster
- Monster sprite and animations
- Monster emotions
- Growth/aging system
- Evolution
- Random events
- Game balancing
- README
- Roadmap
- Devlog
- Project versioning
- Wiring diagrams
- Hardware BOM
- Build instructions
Completed:
- ESP32-C3 configured with PlatformIO
- USB serial debugging enabled
- E-Ink display connected and initialised
- First successful display render (
MONBIT v0.0.1)
Update:
- basic GUI setup
- connected first button
Completed:
- Buttons are detected and affect the stats
- LEFT button => eat
- MIDDLE button => play
- RIGHT button => sleep
- Screen has two options for refresh - full or partial
- When the button is pressed, the screen refreshes partially (without the big blink)
- Happiness renamed to Fun
Completed:
- Every tick (currently 10 seconds), the hunger, fun and energy are changed by 1
- Every time the button is pressed, the current state of the Monster is saved to Flash
- When rebooted, the data is loaded
Completed:
- Audio subsystem added
- Beep when button is pressed
Core components:
-
ESP32-C3 SuperMini ?
-
WeAct 1.54" E-Ink Display
-
500mAh LiPo Battery
-
TP4056 USB-C Charging Module ?
-
Tactile Buttons
-
MAX98357A Audio Amplifier
-
Speaker
-
MPU6050 Accelerometer
Development environment:
- C++
- Arduino Framework
- PlatformIO
- Visual Studio Code
Libraries:
- GxEPD2
- FreeMonoBold0pt7bt
- i2s
monbit/
├── firmware/ # ESP32 firmware (PlatformIO)
│ ├── include/
│ ├── lib/
│ ├── src/
│ ├── test/
│ └── platformio.ini
├── hardware/ # Hardware notes & measurements
│ ├── hardware_notes.md
│ └── measurements.md
├── design/ # CAD files (enclosure STLs)
├── docs/ # Design notes
│ ├── game_design.md
│ └── ui_design.md
├── photos/ # Build & progress photos
├── DEVLOG.md
├── ROADMAP.md
├── LICENSE
└── README.md














