For years I wanted to make some sort of prop for a local anime convention that takes place in October-November. The problem is that year after year, I barely have an idea...if any, and even if I did, it was impossible to get something built by the time the convention comes around. This year (2025) was the same, but unlike years past, this con is taking place on Halloween and as this is the age of AI and so I did like what most people would do in the age of AI and get ChatGPT to generate an idea for me that is feasible in two weeks.
After like an hour of sifting through ideas and adding in parts I have lying around, I decided to go with this "soul stealer" or "spirit detector" project which is designed to steal con-goers souls (implying they had one to begin with) and if I steal enough souls (meaning get close enough to people), then a gif plays on a TFT display which is a bit friendlier than stealing men's souls and making them my slave.
Bill of MaterialsHardware Component
- A Nintendo Power Glove
- Sparkfun ESP32 Thing (~31 USD)
- QRD1114 x2
- 10k Resistor x2
- 470 Resistor x2
- pref boards
- A 2.4" TFT Display Module (2.97 USD)
- Must be build able within two weeks
- Must use low power (ESP32, Arduino, small MCU, etc.)
- Should last an entire convention day
- Should draw attention or interaction
- Use a ESP32
- Use a TFT module as a display
- Uses a rechargeable battery
- Uses the button to display a random gif
- Uses a sensor to "catch souls" or "interact with people" then play a random gif
This is a project where a ESP32, some QRD114 sensors a 18650 battery and a TFT display is glued to a Nintendo Power Glove. If enough reflective light goes back to the sensor, then a counter is increment, then a gif plays on the TFT display if it is incremented ten times.
Why a QRD1114 sensor? Simply put, it was the only thing lying around and it kinda works. Don't expect much for something that was constructed in two weeks.
Disclaimer: The QRD1114 sensor is actually kinda bad at detecting or even stealing souls. Nor do I have any empirical evidence that this sensor can steal souls other than what that Shinigami in front of the convention center said. In fact, I don't think he's actually a Shinigami but some guy cosplaying as one. The QRD1114 is a usable light sensor though.
High Level DiagramsOverall Operation
Schematic
A vast majority of the code was vibe coded via ChatGPT (which makes this project as souless as as I have no tolerance for arbitrary visual effects) and I ended up modifying and refactoring the code as needed. The project was built on VS Code with platform io plugin and uses the arduino framework.
Note that all the source files, User_Setup.h and partitions (see partition section) is provided. However, the gif files and so the playRandomGif function provided in the code needs to be updated with your own gif
The project itself uses the following external libraries
- TFT_eSPI
- AnimatedGif
The project layout is as follows:
Gif files are big, and will not fit a small 2.4" TFT display. So each gif needs to be downsized. I ended up using ezgif to scale down the gif
to downsize the gif file to 240x320
Resizing the ESP32 PartitionEven after down scaling the gif, these gif are still pretty big and I ended up only fitting two or three gif to the ESP32 Thing before running out of memory. However, the program itself is not very big and since there are a lot space in different areas of the ESP32 that are never going to be used for this project such as Over The Air updates, I ended up re-partitioning the ESP32 to get additional space for more gif by shrinking down app0 and otadata partition and increasing spiffs partition. This is done by creating another separate partition csv file.
However, doing this offset calculation is problematic, and I ended up getting ChatGPT to do the work for me. See the partition.csv and the platformio.ini in the attchements for how this was modified
Uploading the Gif Files and Updating the PlayRandomGif functionIn main.cpp, I have a playRandomGif() function which randomly plays a gif file. However, this is dependent on the name of the gif and how many gif are in the data folder. Furthermore, some of these gif need to be played multiple time due to the short frame rate of certain gifs (making them useless unless played multiple times) .
To upload the gif, I put them into the data folder in VS Code. Platformio will upload the resized gif to ESP32 upon flashing
AssemblyThe only soldering down was soldering headers onto a pref board and soldering the resistors to the QRD1114 onto some pref boards. The entirely of the wiring is mostly just jumper wires and the likes. The shoddiness and jankiness of the entire project is what gives the attraction appeal
Overall result is that this glove got some attention from people and I 'harvested' like a couple dozen souls or so. But turns out I have another issue which is that I never ended up storing the souls into EEPROM, so anything that was harvested quickly escaped. Which doesn't really mean much in the end as con-goers' souls are worth as much as cookie crumbs. But the glove itself is a decent conversation starter, but not as much as my Ninomae Ina'nis Takod hoodie that I was wearing. A vendor did end up giving me these convention badge ribbon.
So I got something else other than souls out of this project...I guess.









Comments