Every good villan has a good backstory right?
Unfortunately mine isn't as good as Gru's but its still a pretty good story of how I ended up with a fairly accurate model of the Moon in my hand. And it all began in the fall of 2024, during my freshman year at BYU. My family home evening group leaders in my YSA ward needed some ideas for activities they could plan in the following weeks, so they sent out an online form to the group and asked for our input. I felt just as equally out of ideas for activities, so I jokingly typed “steal the moon” into the form and sent it in not expecting anything to come of it.
And then a few weeks later, my FHE group leaders actually managed to make a scavenger hunt activity out of my ridiculous idea. And when we finally found the “moon” (which was a cut out picture of the moon), It occurred to me that we needed a better prop. It also reminded me of a model 3D printable model I had seen on thingiverse years prior that I had always wanted to make, but never had a printer good enough to print it. So I thought I would give it a try on the Bambu Lab X1C printers in the McKay school Toolbox.
3D printing
The model I found used 3D scans of the Moon's surface to make the model more accurate to the actual Moon. Additionally, the creator made the thickness of the Moon lamp shell correspond to photo scans of the Moon's surface so darker parts of the Moon's surface are thicker in the model and thus appear darker on the moon lamp. It provides for a very accurate model of the moon, at the cost of a very complex 3D model. In fact, its almost too complex as some triangles and details are too small to be visible at the scale of the model and too fine to be reproduced by the 3D printer. This provided much challenge when I attempted to 3D print it.
First, the model is like 300mb. Bambu studio immediately freaks out and give a ton of warnings when a file that size is imported, and lags a ton when it finally does. I had to make the infill completely solid for the surface darkness trick to work, which also added a lot of print time even though the shell is relatively thin. Additionally, the model itself required a lot of support material to properly print the details. And fearing that this very complicated print might break if dropped, I decided to print it out of PETG instead of brittle PLA hoping it would give it more strength. And while PETG is probably the easiest “strength” material to work with, I learned many lessons in printing with PETG the hard way.
The first two attempts at printing this model failed more than an hour into the print. Initially I didn't know the cause but some online research revealed that Bambu studio's default extrusion speed for PETG is almost impossibly high. It would be like trying to pump molasses out of a small nozzle and expecting it to flow as fast as water. This ultimately caused the print to fail, and the cameras inside the printer detected the error and stopped the print.
Similarly, the print speed of the nozzle for various operations was also too high as PETG doesn't stick as easily as PLA. I made both the print and extrusion speeds much lower just to be safe. And while this would add a significant amount of print time, it also contributed to higher print quality in the end.
This model took almost an hour to slice on my 8 year old laptop, and about 30 hours to print. It was also very expensive in material, using 300-400 grams, or about a third of a roll of filament. But after I removed the support material and tested the Moon shell with a flashlight, it worked exactly as expected.
Electronics
For this part of the build, I admittedly went a little overboard. The threaded hole in the bottom of the Moon shell would probably fit a small light bulb that could be used with a lamp cable and a another 3D printed piece to hold it in place. But my pride said that would be too simple, so I over-engineered the heck out of it.
I wanted more than just a light with an on/off switch. I wanted 30 individually controllable lights with over 4 billion possible colors each. I wanted a light that could be controlled from my phone, or by voice assistants and other smart home software. And I wanted this prop to glow without any cords plugged into it.
This sounds like a tall order, but it actually has become quite easy in this day and age.
Hardware
We live in a day where led strips have become quite advanced. LED strips can have hundreds of individual LEDs in the length of a meter, and each LED can be controlled individually. Inside each LED, there are red, green, and blue diodes that make it possible to generate over 16 million colors for each LED. And 5 meters of LED strip like this can be purchased for $15-40 depending on the quality and specifications of the strip. The most common variant of this LED strip is the WS2812, and there are many variants with similar numbers. There are also many form factors of individually addressable LEDs, so they are often called “Neopixels”.
Some Neopixel strips have a dedicated white diode inside of each LED. I opted to use one of these strips as a dedicated white has a much higher quality white than mixing R G and B to make white. It also increases the possible number of colors from 16 million to 4 billion. And in applications that require a lot of white light, it helps preserve the LEDs as RGBW strips only have to turn on one channel to full brightness instead of three like regular RGB strips.
To control these strips, I used an ESP8266 microcontroller. This chip costs between $1-10 depending on where you purchase it, and has the ability to connect to Wifi and the internet abroad. I could also have used a newer version of this chip called the ESP32, I just opted to use the ESP8266 as I already had one on hand. Although if you plan on building this yourself, I would probably recommend the ESP32.
This build also required some other small components such as wire and resistors just to manage power and clean up the signal on the data wire. I also used a small chip to shift the logic from the 3.3v signal coming from the esp8266 to the 5v signal required by the LEDs. Some may argue this level shift chip isn't necessary but I have always had trouble getting LEDs to work without this. I will link a good chip to use for this in the parts list later.
My original build also had a battery inside it. I didn't buy this but rather gutted a portable phone charger I was given at a BYU event. In essence it contained a single 18650 lithium battery with a small circuit board to charge it. It worked initially but my mediocre soldering job came loose a month after I finished the build, and it seemed too complicated to fix. So I opted to remove the battery and instead power the light from the usb c port on the bottom that I was using to charge the light.
I know this isn't a super detailed explanation of the electronics, but here is a diagram.
[diagram coming soon]
If you would like to learn more about working with individually addressable LEDs, this website is a helpful resource: quinled.info/
Software
I opted to use an open source firmware called WLED on the esp8266. This project also supports the newer ESP32 chips. This project has features like wifi control and sync, and smart home integrations. It also has an app to control WLED devices from a mobile phone. You can read more about the project here: kno.wled.ge/
Flashing WLED is fairly easy, and can be done from a browser on this site: install.wled.me/
Note: on Windows or Mac, a driver is needed for the computer to be able to communicate with ESP32/ESP8266. Linux does not need any additional drivers to communicate with these chips as it is built into the kernel. The download links for these drivers will appear on the wled installer if you click install and then cancel when the port selection menu appears.
To flash WLED, connect your ESP device to your computer over usb, and click the install button. It will ask which port the device is connected to, which can be tricky to figure out. Also, the ports listed depend on your device and operating system. Sometimes the port menu may tell you if its a usb device or even what it is, so if you're not sure, just keep trying different ports until it works. The site also has a helpful troubleshoot menu that appears when things go wrong during the installation process, and does a pretty good job at guiding the process.
When finished, you will need to connect to the device over wifi to configure its settings. If you did not provide a wifi network for it to connect to during the install, or it is unable to connect, it will broadcast its own wifi network. In this case, it will likely be named “WLED-AP” and has a default password of "wled1234". To find the WLED control panel, type "http://4.3.2.1" into the address bar. From there you can configure it to connect to a wifi network, or change the name and password of the backup wifi network it broadcasts when it can't connect to wifi. You can also change the LED settings, which likely are wrong by default.