Spent three weekends on my Pokéball pet project and it finally boots clean

Nov 05, 2026 Last reply: 5 hours ago 3 Replies
Jump to replies (3)

Got the ESP32-S3 running on that little round display inside a 3D printed Pokéball shell, and honestly the hardest part wasn't the hardware at all. It was squeezing everything into flash. The trick that finally worked was dropping the JSON library for the weather fetch and just pulling the few values I need out of the raw response with plain string parsing. Freed up a surprising amount of space. The other headache was text. I wanted Spanish, French, German, Italian, Portuguese, plus Chinese and Korean, and those last two absolutely refuse to fit with a normal font. Ended up generating a small bitmap font with just the glyphs the pet actually uses, and suddenly it all fit with room to spare. Now it's got care stats, a little shop, a bunch of minigames, and it pulls real weather over Wi-Fi so the critter complains when it's raining out. My niece fed it three dozen snacks in a row and it got visibly chunky on screen, so the feedback loop works. There's also a desktop emulator, wich made debugging way less painful than flashing every single test. Repo is public if anyone wants to poke at it.


The bitmap font idea is exactly what I landed on too when I put a weather widget on a cheap round TFT with an ESP32 years back. Full font tables ate somethig like half my flash before I sat down and listed every character the screen actually displayed, and it turned out to be maybe 60 glyphs. Cut the rest and everything fit with space left over for a little animation loop I'd been sitting on.

For the weather side I did the same thing you did with the raw string. I just searched for the marker text in the response and grabbed the numbers after it. Saved a pile of memory and the response never changed format anyway since it came from one source. The desktop emulator part is underrated. I used a simulator build for my last project and caught a screen rendering bug in about five minutes that would have taken a dozen flash cycles to track down. Kept the actual hardware in a drawer untill the logic was clean. The chunky pet mechanic sounds fun, my niece would absolutely abuse it the same way. Does the pet walk back down on its own or does the owner have to burn off the snacks somehow?

I took the opposite approach with text on my little round display project and stuck with a full font, but moved the problem somewhere else. My board had a spare microSD slot, so I threw the glyph data on there and just read it as needed. Slower, sure, but flash stayed untouched and I could swap languages by dropping in diffrent files. Only annoyance was wiring up the reads so animations didn't stutter while text was loading. On the weather side I did something similar to you with the parsing, though I never bothered dropping a library. I just pointed the request at a plain text endpoint instead of JSON in the first place. One line of forecast, one line of temperture, done. Saved me the whole parsing headache. The feeding feedback thing you describe is the part I'd underline. My first version had no visible consequence for anything and my kid lost interest in about a week. Once I added even a crude weight change, the interaction stuck.

I found that relying on raw string parsing for data retrieval, while effective for conserving memory, introduced a measurable overhead into the main loop's execution time. Whenever you perform iterative character identification and extraction from a buffer, you essentially create a computational cost that might become apparent if the main logic, such as the animation cycles, is alredy running at near its temporal limit. I ussually paired that approach with a dedicated background task to handle the network socket reception and initial parsing so the UI thread remains entirely free of I/O latency.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required