Building a Physical Pokemon Pokedex with ESP32
Intro
It's been a while since I made a fun project with ESP32/Arduino. I struggled to find a good project idea and didn't want to make something purely for learning purposes, like making LEDs blink in sequence or a basic RFID door lock—things that are doable but not particularly meaningful.
One morning, the idea for this Pokemon Pokedex prototype popped into my head. I immediately discussed it with AI, wrote a proposal, and started building it.
The complete details and source code are available on GitHub: hunglin59638/pokedex
How It Works
The system is actually quite simple and consists of three main parts. Basically, you use a PokeBall to scan NFC stickers on a Pokemon poster. When the corresponding Pokemon ID is read, it transmits the data to the Pokedex, which displays the Pokemon's info and an animated GIF.
Sender (PokeBall)
I used a Seeed Studio XIAO ESP32C3 development board paired with a PN532 NFC module. When you bring the PokeBall close to the poster (where NFC stickers are hidden behind each Pokemon), it reads the Pokemon's ID. Then, it sends this data to the Pokedex using the ESP-NOW wireless protocol. I chose this board because its small size fits perfectly inside the PokeBall. The PokeBall shell is from a TOMY MB-01 toy, which should be easy to find.

Receiver (Pokedex)
The Pokedex uses a Wemos D1 R32 development board with a 3.5-inch TFT screen. Upon receiving the Pokemon ID, it reads the corresponding image and data from an SD card and displays the animated Pokemon on the screen.
The two devices communicate using ESP-NOW, a peer-to-peer wireless protocol that doesn't require a Wi-Fi router—just the MAC addresses are needed for communication.
For the case, I thought about using perler beads to create a Pokedex style. I initially used Gemini to generate some reference images and then adjusted the design.


Pokemon Poster
I wrote a Python script to download information (name, type, height, weight) and PNG images for the original 151 Pokemon from PokeAPI. Then, I arranged them into an A1-sized poster (59.4 × 84.1 cm).
After printing the poster, I attached an NFC sticker on the back of each Pokemon's position. These stickers were pre-written with the corresponding Pokemon ID using the generic NFC Tools app on my phone. For example, #6 is Charizard, and #94 is Gengar.

Data Source: PokeAPI
All Pokemon data comes from PokeAPI, including names, types, stats, images, and sprites.
I wrote a Python script to batch download this data. Each Pokemon generates three files:
- JSON file: Contains basic info like name and types.
- PNG file: High-resolution official artwork (for the poster).
- GIF file: Animated sprite (displayed on the Pokedex screen).
These files are stored on the SD card so the Pokedex can access them anytime.
Power Design
The scanner (PokeBall) uses a 3.7V lithium battery with a TP4056 charging module. The Pokedex itself uses a 9V Type-C rechargeable battery. Both have welded switches and can be charged via USB. Although the battery life isn't ideal—probably less than an hour—it's sufficient for demonstration purposes.
Expandability
Although the poster only features the original 151 Pokemon, the code actually supports all generations of Pokemon.