My son loves pokemon, and fell in love with this charmander alarm clock. To be honest, I find it expensive for what it does. Things to note :
- It has a very nice looking nightligth in charmander body,
- The screen is an antique LCD,
- You have to set the time,
- It doesn't retain time when unpowered,
- It works on 3xAAA batteries
- You can plug a 5V adapter to prevent draining batteries
After some months, excessive use by my children has worn out the external power source connector, and as the nightligth doesn't turn off, even on batterie, this clock became a battery eater, and because it doesn't retain time, a pure nigthmare to set time at each battery change.
I tried to resolder the connector, but it didn't fix the issue that after each powerloss, you have to set time, and that my children don't care if nightlight is on and not connected to power source.
![]() |
Before surgery |
One evening, as I was changing the batteries yet again, I thought to myself: ‘If only it could fetch the time from the internet…’ Then I paused — ‘Wait a minute, I’ve got a stash of ESP32s!
That’s where it all started. I might as well have titled this article ‘How I Overengineered a Pokémon Alarm Clock’. Here is the story
The screen
Has i said before, I've already opened the case to resolder the power source, and it turns out that the case is quite empty. There are 2 PCBs, one to deal with buttons, and the second for the "brain" (aka radio, screen, temperature, and light). Screen is connected to the PCB using kind of pogo-pins, there are no soldering, so, I guess that the brain is also the LCD driver.
So, I measure the screen diameter : 32mm. I started browsing on aliexpress, and I could hardly believe my eyes : a 1.28" round LCD screen for less than 5€
I've ordered two screens and started working on the software.
The software
I've done multiple project using C++ with arduino and esp8266, and for christmas, a friend of mine gave me an ESP32-C6, simply because I wouldn’t stop talking to him about running Rust on RISC-V. Because I also wanted to learn it, I chose rust.
Then I had multiple choices : Rust std or no_std ? LVGL or slint-ui ? On ESP32, std relies on esp-idf, and, if I understood correctly a few months ago, rust will act as a esp-idf configuration tool for esp-idf, and you have to rely on bindings with C code for a lot of esp features (wifi, mqtt, ...). The same applies for LVGL, it's only a binding to C code.
Because I wanted to learn rust, I chose rust no-std and slint-ui, although there was only a few examples (back in january 2025) on how to create a backend on microcontrollers and more specifically on ESP32.
In my work, I use scala with cats-effect, so, I used to asynchronous code, and, I heard that rust had this kind of features. While I was browsing internet to understand what tools I need to do the same, I encountered embassy. I felt right at home.
Because I was waiting my round screen, I started on a square ST7789 screen.
It took me almost one week, working on evenings, and I successfully ran a demo
After reading a release changelog of slint, I saw that there was an example with mcu and embassy. I felt like a student who’d just been handed the answer sheet (Thanks you ninjasource !). I quickly refactored my code to conform to this example, and also added the simulator as in example. This helped me working faster, as I didn't need to upload my code, and also I could speed-up the time to check that transitions where working flawlessly.
At this time, things started to go faster, I had a lot of ideas and suggestions made by people I spoke with the project, but, first thing was to make a design. I started in many directions (genAI, algorithm to pixelate an image, because I wanted pixelart, ...) and finally, I wasn't satisfied by them:
- It looks like pixel art, but when scaled down, its not.
- It's very difficult to make it consistent between prompts (I wanted to have multiple version of the landscape, to deal with different weathers)
Finnaly, I found an artist on twitter Woostarpixels, and ask him if I can use one of his drawing in my project, sent him some of my demos, etc. He allowed me to share my project, so, many thanks to him, and don't hesitate to check out his work !
I loaded artwork in gimp and layered it, made a night version, ...) Here is the result:
I then start working on the sky and transitions between day and night. Thanks to the simulator, it's easy to check result.
My wife has a fascination for the moon, then, I added a library to handle moon phases and generate an image of it.
And last, I added a small countdown timer with a button click on the original case.
At this point, I chose to declare the software finished, since my ESP32-C6 is at 99.6% of the 4MB flash memory, and RAM is to small to generate things in memory (with 512KB, an image of 240x240 with alpha layer is 45% of the memory).
The case and assembly
After receiving my screen, I started working on a small adapter to mount screen inside the original case.
I made a great spaghetti of dupont wire, and finally managed to mount everything in the case
![]() |
It is reflashable ! |
Conclusion
This project was one of the biggest thing I build, and it learned me a lot. 3D print, designing UI, rust, ... And it lacks a lot of thing I would have liked, but time is limited. But I see a bright future for slint-ui, as it is very efficient and smooth.
This project also gave me a newfound admiration for the video game developers of the 80s and 90s. After pushing my hardware to its limits and ending up with results that didn’t come close to what real video games achieved back then, I realized just how impressive their work was
All the code is available on my Github