The METAR (METeorological Aerodrome Report) is a staple for pilots wondering what the weather is like at a given airport. While a full report looks like incomprehensible output from a 1960’s teletype (because, well, that’s pretty much exactly what it is), pilots are lazy and sometimes just like having a “yeah/nah” appraisal of weather rather than something like
KOSH 290304Z 10012KT 3SM BR OVC004 02/01 A2990 OMG WTF LOL
Laziness aside, it’s pretty handy to get an idea of flying conditions across a region by looking at a weather map such as the one provided at aviationweather.gov or via various forms of flight planning software. Green, blue, red, and purple indicators give a quick indication of current cloud ceiling/visibility for reporting airports. In the past couple of years, making a live lighted wall map to provide this information has become a popular craft project for flyers, and commercial versions have become available as well.
I’ve been wanting to make a METAR map for my flight instructor ever since first seeing examples online, and finally got around to building one. My primary guide in this was Philip Rueker’s blog post as well as his GitHub project files (though there were several other sites that also provided information and inspiration). Rather than rehash those excellent instructions, this post is regarding my own approach to building.
First off, shadow boxes are much more expensive than regular picture frames. I decided to try to keep the depth of lights and electronics to a minimum so that I could use a standard picture frame. I wound up getting a 20×28 frame from Michael’s for the purpose (and made sure to wait for a good coupon or sale, as $57 is a ridiculous price for a few pieces of MDF and a sheet of glass).
While pretty much every other METAR map build I’ve seen just has through holes for the LEDs, I didn’t want to use this approach for two reasons. First, I wanted to keep the map intact so that it would just be backlit (and thus allowing replacement in the future should there be a big airspace change – sectional maps are only valid for 6 months, after all). Second, I needed to keep the components as low profile as possible. Thus, I decided to forego the WS2811 LED strings used by others and instead opted for the far more compact WS2812B PCB ‘chip’ LEDs.
The picture frame used a fiberboard backing, which I figured would be a fine substrate to mount the LEDs to. I used an outdated sectional map cut just larger than the frame backing, and gave the back of the map a light mist of 3M spray adhesive. After letting the adhesive dry off for about 10 minutes (I didn’t want it to be sticky, just tacky), I carefully applied it to the fiberboard backing, aligning a longitudinal line with a corner of the backing (ensuring that I could remove the map and replace it with a new one).
After trimming the map to the backing, I then zoomed in on the online weather map at aviationweather.gov and marked off every airport on the paper map that showed up online. 38 airports in total would need to be represented. Once I had them all tagged, I used a 1/4″ brad point drill bit and a section of clear acrylic sheet on top of the map/backing to drill a hole cleanly through each airport location.
After that, I marked the backside of the backing board with each airport identifier and name. Then, I removed the old map and made sure each hole was cleared of swarf. I prepared a current sectional chart with spray adhesive, let it tack up, and applied it to the backing board in the same fashion as before, leaving an unscathed map on top (after each application, I used a razor knife to trim the map to the size of the backing board – would have been much more difficult to try getting it sized right beforehand).
Then it was time for the drudgery. Namely, hot-gluing 38 tri-color LED PCBs to the rear of the backing board. And then soldering them all together in a chain. Six solder pads per LED. Honestly, the process wasn’t that bad and I did it over the course of a few evenings. With that completed, I could finally think about powering the whole project. While Philip Rueker chose to run his directly from the RasPi’s GPIO port, he was only dealing with 22 LEDs. With this map being 38 LEDs deep, I opted to have them powered directly from a separate 5V supply. So, how to power the RasPi and LED chain effectively? Well, the RasPi has a micro-USB connector for power. And USB itself runs at 5 volts… A bit of digging through boxes of old hardware yielded a powered USB hub that didn’t need an active host in order for the ports to be powered.
I 3D printed mounting brackets for the RasPi and USB hub. With yet more hot glue to secure them to the backing board, the hardware side was complete. Data and 0V ran from the RasPi GPIO to the LED chain, while 5V and 0V ran from another port on the USB hub to the chain (I didn’t need a diode or level shifter to bring the signal line voltage closer to the LED supply voltage).
The USB hub was a little bit taller than hoped, so I used self-adhesive wall hooks on each corner of the frame to give everything a little more wall clearance (and serve as a way to hold up the power cord).
Much to my shock and amazement, everything seemed to be working great. It only took a little bit of tweaking the metar.py file to complete the project (the LEDs I used have an RGB addressing scheme rather than the WS2811’s GRB order).
Not what I wanted to see weather-wise this weekend, but 100% what I wanted to see project-wise!
Edit: The system wasn’t as stable as hoped, and a strange reboot loop would result within an hour or so of startup. A bit of googling pointed to a feeble power supply as a culprit. I figured a big beefy linear supply wall wart coupled with a substantially warm voltage regulator on the USB hub PCB would equate to an inefficient yet thoroughly reliable voltage source. Yet replacing it with a cheapo dual-port USB wall outlet cube eliminated all issues. Huh, sometimes “they don’t make ’em like they used to” turns out to be a compliment regarding the newcomer!
I also made a few final tweaks to the software side of things. My home airport (where the map will live at) doesn’t have any sort of automated weather reporting system, but I still installed an LED for it. I set rc.local to illuminate that LED in white right away as an indication that the system had booted. After that, I added a “sleep 10” line before running the startup.sh script that initially fires up metar.py (I found that the RasPi wasn’t necessarily yet connected to WiFi, and you might have to wait for cron to kick in before any LEDs would light up as a result of the API lookup failing). Finally, I modified metar.py to show our airport as white (I have it as an entry in the airports file, but since it doesn’t have weather reporting, the LED is normally off). I probably know as much about python in a zoological respect as I do in a programming respect, so it took me a little bit of trial and error to finally figure something out. In the end, inserting a line of “pixels = (85,85,85)” just before the final “pixels.show()” command did the trick.