# Moon Flight Tracker

## Overview

We were inspired by the round-display flight-tracker trend and added a twist, combining a moon tracker with a flight tracker to make catching photographic shots easier.

This build takes the luck out of it. It pulls live aircraft positions for your area, computes where the moon actually is from your ZIP code, projects each plane forward along its heading, and warns you when one is about to pass close to, or straight across, the lunar disc. Two tiers of alert:&nbsp; **NEAR** &nbsp;when the plane and moon will share a telephoto frame, and&nbsp; **TRANSIT** &nbsp;when it crosses the disc itself.

It's small enough to sit on your camera's hotshoe, so it rides along with the rig you're already pointing at the sky.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/051/medium640/lcds___displays_hero-sky-medium.jpg?1785095514)

The tracker queries the&nbsp;[adsb.fi](https://adsb.fi/)&nbsp;open ADS-B network for aircraft within 15 nautical miles, then converts each plane's latitude, longitude, and altitude into the same azimuth-and-elevation coordinates it uses for the moon. The moon's position is computed on the device itself, no API, no key; from a compact lunar ephemeris accurate to roughly a third of a degree.

Each aircraft is then flown forward in software along its reported track and ground speed, in five-second steps across the next five minutes, and the smallest angular separation from the moon is recorded. When a plane's closest approach falls inside the alert thresholds and is less than 90 seconds out, the display raises a banner: cyan for a near pass, pink for a transit. Tap it and you get the flight's route and details, looked up on the fly.

&nbsp;

![](https://cdn-learn.adafruit.com/assets/assets/000/145/052/medium640/lcds___displays_hero-radar.jpg?1785095621)

![](https://cdn-learn.adafruit.com/assets/assets/000/145/054/medium640/lcds___displays_hero-sky-wide.jpg?1785096027)

## Four Screens

- **RADAR:** &nbsp;a live plan view of traffic around you, with the moon's bearing marked, alert banners, and each plane's callsign and altitude.
- **LIST:** &nbsp;every tracked aircraft ranked by how close it will come to the moon, with predicted separation and time to closest approach. Tap any row for flight details.
- **MOON:** &nbsp;current phase rendered to scale, illumination percentage, altitude and azimuth, and tonight's rise and set times in your local timezone.
- **LOCATION:** &nbsp;a touch keypad for your ZIP code, plus screen rotation. Both persist across power cycles, so you set them once.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/055/medium640/lcds___displays_ui-radar.jpg?1785099765)

![](https://cdn-learn.adafruit.com/assets/assets/000/145/056/medium640/lcds___displays_ui-fly-list.jpg?1785099811)

![](https://cdn-learn.adafruit.com/assets/assets/000/145/057/medium640/lcds___displays_hero-moon.jpg?1785099871)

![](https://cdn-learn.adafruit.com/assets/assets/000/145/058/medium640/lcds___displays_hero-zip.jpg?1785099917)

Everything runs on an&nbsp; **Adafruit Qualia ESP32-S3** &nbsp;driving a&nbsp; **2.1" round 480×480 capacitive touch display**. The S3's 16 MB of flash and 8 MB of PSRAM leave room to hold a full-color framebuffer, run the trajectory math, and talk to the network at the same time, no extra boards, no GPS module, no sensors. The only wiring is one ribbon cable and USB-C for power.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/060/medium640/lcds___displays_display-hero.jpg?1785100162)

The code is CircuitPython, so every parameter worth tuning, such as search radius, alert thresholds, refresh rate, prediction window, is a plain constant at the top of&nbsp; **code.py** file that you can edit over USB with no toolchain.

This uses an online database keyed by ZIP code for the United States. Folks outside the US may want to adjust the code to use other data.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/061/medium640/lcds___displays_cp-code-bg.jpg?1785100335)

## Parts
Featured
### Adafruit Qualia ESP32-S3 for TTL RGB-666 Displays

[Adafruit Qualia ESP32-S3 for TTL RGB-666 Displays](https://www.adafruit.com/product/5800)
There's a few things everyone loves: ice cream, kittens, and honkin' large TFT screens. We're no strangers to small TFT's - [from our itsy 1.14" color display](https://www.adafruit.com/search?q=1.14+tft) that graces many-a-TFT-Feather to <a...></a...>

In Stock
[Buy Now](https://www.adafruit.com/product/5800)
[Related Guides to the Product](https://learn.adafruit.com/products/5800/guides)
![Overhead shot of TFT driver board connected to a round TFT display, which says, "Hello world!"](https://cdn-shop.adafruit.com/640x480/5800-06.jpg)

Featured
### Round RGB 666 TTL TFT Display - 2.1" 480x480 - Capacitive Touch

[Round RGB 666 TTL TFT Display - 2.1" 480x480 - Capacitive Touch](https://www.adafruit.com/product/5792)
This is a screen for advanced hackers who like the look of a nice, round TFT screen with tons of pixels. The 2.1" diagonal sized display has 480x480 16-bit full-color pixels and is an&nbsp; **IPS** &nbsp;display, so the color looks great up to 80 degrees off-axis in any...

In Stock
[Buy Now](https://www.adafruit.com/product/5792)
[Related Guides to the Product](https://learn.adafruit.com/products/5792/guides)
![Angled shot of round TFT display with 40-pin cable ribbon.](https://cdn-shop.adafruit.com/640x480/5792-03.jpg)

Featured
### Camera and Tripod 3/8" to 1/4" Adapter Screw

[Camera and Tripod 3/8" to 1/4" Adapter Screw](https://www.adafruit.com/product/2392)
_Whaddya got a screw loose or something?_

This **3/8" to 1/4"**  **Adapter Screw** is super handy if you're building projects that connect to a tripod or a camera. It's a simple fix for getting a tripod with a 1/4" machine screw...

In Stock
[Buy Now](https://www.adafruit.com/product/2392)
[Related Guides to the Product](https://learn.adafruit.com/products/2392/guides)
![Camera and Tripod 3/8 to 1/4 Adapter Screw](https://cdn-shop.adafruit.com/640x480/2392-01.jpg)

Featured
### Pink and Purple Woven USB A to USB C Cable - 1 meter long

[Pink and Purple Woven USB A to USB C Cable - 1 meter long](https://www.adafruit.com/product/5153)
This cable is not only super-fashionable, with a woven pink and purple Blinka-like pattern, it's also made for USB C for our modernized breakout boards, Feathers, and more.&nbsp;&nbsp;[If you want something just like it but for Micro B, we...](https://www.adafruit.com/product/4111)

Out of Stock
[Buy Now](https://www.adafruit.com/product/5153)
[Related Guides to the Product](https://learn.adafruit.com/products/5153/guides)
![Angled shot of coiled pink and purple USB cable with USB A and USB C connectors.](https://cdn-shop.adafruit.com/640x480/5153-02.jpg)

### Part: 1/4" Swivel Mini Ball Head Screw Tripod Mount
quantity: 1
1/4" Swivel Mini Ball Head Screw Tripod Mount
[1/4" Swivel Mini Ball Head Screw Tripod Mount](https://www.amazon.com/dp/B0BY22V39N)

### Part: 3 Port Cold Shoe Mount
quantity: 1
3 Port Cold Shoe Mount
[3 Port Cold Shoe Mount](https://www.amazon.com/dp/B0DYV22297)

# Moon Flight Tracker

## Circuit Diagram

## Circuit Diagram

This provides a visual reference for wiring of the components. This diagram was created using [Fritzing software](http://fritzing.org/download/).

![](https://cdn-learn.adafruit.com/assets/assets/000/145/091/medium800/lcds___displays_moon-flight-tracker.jpg?1785120866 )

## Ribbon cable

Align the board and display as pictured. Make sure the **copper traces are facing down**.   
  
Gently lift the latch up and insert the ribbon cable into the socket. Make sure to carefully push the ribbon evenly into the socket. Press the latch down to grip the ribbon cable, making sure the cable is evenly inserted into the socket. Gently tug on the board to insure the ribbon is fully secure and evenly held in place inside the socket.

# Moon Flight Tracker

## CircuitPython

[CircuitPython](https://github.com/adafruit/circuitpython) is a derivative of [MicroPython](https://micropython.org) designed to simplify experimentation and education on low-cost microcontrollers. It makes it easier than ever to get prototyping by requiring no upfront desktop software downloads. Simply copy and edit files on the **CIRCUITPY** drive to iterate.

## CircuitPython Quickstart

Follow this step-by-step to quickly get CircuitPython running on your board.

This microcontroller requires the latest **unstable (development)&nbsp;**release of CircuitPython. Click below to visit the downloads page on **circuitpython.org** for your board. Then, Browse **S3** under **Absolute Newest**.

[Download the latest version of CircuitPython for this board via circuitpython.org](https://circuitpython.org/board/adafruit_qualia_s3_rgb666/)
 **Click the link above to download the latest CircuitPython UF2 file.**

Save it wherever is convenient for you.

![install_circuitpython_on_most_boards_CircuitPython_downloaded.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/129/medium640/install_circuitpython_on_most_boards_CircuitPython_downloaded.jpg?1620922559)

Warning: 

![](https://cdn-learn.adafruit.com/assets/assets/000/124/831/medium800/circuitpython_bootloader.jpg?1696442767)

Plug your board into your computer, using a known-good data-sync cable, directly, or via an adapter if needed.

Double-click the **reset** button (highlighted in red above), and you will see the **RGB status LED(s)** turn green (highlighted in green above). If you see red, try another port, or if you're using an adapter or hub, try without the hub, or different adapter or hub.

Warning: 

For this board, tap reset and wait about a half a second and then tap reset again.

Warning: 

If double-clicking doesn't work the first time, try again. Sometimes it can take a few tries to get the rhythm right!

A lot of people end up using charge-only USB cables and it is very frustrating! **Make sure you have a USB cable you know is good for data sync.**

You will see a new disk drive appear called **TFT\_S3BOOT**.

&nbsp;

Drag the **adafruit\_circuitpython\_etc.uf2** file to **TFT\_S3BOOT**.

![circuitpython_Screenshot_2023-10-03_at_1.54.46_PM.png](https://cdn-learn.adafruit.com/assets/assets/000/124/832/medium640/circuitpython_Screenshot_2023-10-03_at_1.54.46_PM.png?1696442912)

![circuitpython_Screenshot_2023-10-05_at_10.20.11_AM.png](https://cdn-learn.adafruit.com/assets/assets/000/124/889/medium640/circuitpython_Screenshot_2023-10-05_at_10.20.11_AM.png?1696526572)

The **BOOT** drive will disappear and a new disk drive called **CIRCUITPY** will appear.

That's it!

![install_circuitpython_on_most_boards_CIRCUITPY.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/130/medium640/install_circuitpython_on_most_boards_CIRCUITPY.jpg?1620923145)

# Moon Flight Tracker

## Code

Flash your Qualia ESP32-S3 with the latest stable release of CircuitPython 9.x for&nbsp; **Qualia ESP32-S3 RGB666**. See the&nbsp;_Install CircuitPython_&nbsp;page of the Qualia guide if this is your first time.

### Add the CircuitPython Libraries

This project uses several libraries from the Adafruit CircuitPython Library Bundle. Using the Project Bundle below copies them into your&nbsp; **lib** &nbsp;folder automatically, but for reference the project imports:

![](https://cdn-learn.adafruit.com/assets/assets/000/145/062/medium640/lcds___displays_cp-code.jpg?1785101024)

### Upload the Code and Files

Click the&nbsp; **Download Project Bundle** &nbsp;button below to download the code and assets as a zip file. Copy the contents to your&nbsp; **CIRCUITPY** &nbsp;drive, keeping the file and folder structure the same.

**Library note:** &nbsp;touch uses the standard&nbsp;`adafruit_cst8xx` driver. Some 2.1" round panels report a chip ID of 0x00. Support for these landed in the library in July 2026, so use a current bundle.

No `adafruit_qualia`&nbsp;package is needed; the display is initialized directly so the pixel clock can be lowered (more on that below).

https://github.com/adafruit/Adafruit_Learning_System_Guides/blob/main/Moon_Flight_Tracker/code.py

Add your network credentials to&nbsp; **settings.toml** :

```python
CIRCUITPY_WIFI_SSID = "your-ssid"
CIRCUITPY_WIFI_PASSWORD = "your-password"
# optional — pin the rise/set timezone manually (hours from UTC):
# UTC_OFFSET = "-4"
```

Normally you don't need&nbsp;`UTC_OFFSET`&nbsp;— the device looks up a DST-aware offset for your ZIP code automatically.

Everything runs on free, keyless APIs: aircraft from&nbsp;[adsb.fi](https://adsb.fi/)&nbsp;open data, routes from&nbsp;[adsbdb.com](https://adsbdb.com/), ZIP geocoding from zippopotam.us, and timezone from timeapi.io. The moon's position is computed on the device itself.

## Code Walkthrough

### The Knobs

The constants at the top of&nbsp; **code.py** &nbsp;allow changes for one's preferences:

```python
FETCH_S = 15          # aircraft refresh
LOOKAHEAD_S = 300     # transit prediction window
SEP_HIT = 0.5         # pink: plane crosses right over the moon disc
SEP_NEAR = 2.0        # cyan: close pass — moon still in a 300mm frame
NM_RADIUS = 15        # adsb.fi query radius (nm)
DISPLAY_FREQ = 8_000_000  # pixel clock — see display section
```

The two separation thresholds are camera-driven. The moon is about half a degree across, so a predicted miss under&nbsp; **0.5°** &nbsp;means the plane crosses the disc itself — that's the pink&nbsp; **TRANSIT** &nbsp;alert. Under&nbsp; **2°** &nbsp;the plane and moon still fit a 300&nbsp;mm telephoto frame together — the cyan&nbsp; **NEAR** &nbsp;alert.

### Display Initialization and the Pixel Clock

The round TFT is an RGB dot-clock panel: the ESP32-S3 continuously scans the framebuffer out of PSRAM. WiFi and TLS traffic contend for that same bandwidth, which can show up as horizontal jitter during fetches. The code fights this two ways:

- `DISPLAY_FREQ`&nbsp;runs the pixel clock at 8 MHz instead of the usual 16 MHz, leaving PSRAM headroom. If your unit is stable, you may consider raising it back toward 16 MHz.
- WiFi transmit power is capped at 8&nbsp;dBm. If your access point is far away and fetches time out, raise it in&nbsp; **code.py**.

Because the pixel clock is a custom value, the panel is initialized directly —&nbsp; **tl021wvc02.py** &nbsp;holds the init sequence and&nbsp; **code.py** &nbsp;passes its own timings — rather than through the&nbsp;`adafruit_qualia`&nbsp;helper, which uses the stock 16&nbsp;MHz timing.

### Predicting a Transit

Every 15 seconds, the tracker fetches all aircraft within 15 nautical miles and converts each one's position and barometric altitude into an azimuth/elevation pair — the same coordinates the moon uses.&nbsp;`predict()`&nbsp;then steps the plane forward along its track and ground speed in 5-second increments for the next 5 minutes, computing the angular separation from the moon at each step:

```python
def predict(ac, m_az, m_el):
    az, el = az_el(ac["x"], ac["y"], ac["alt"])
    best_t, best_sep = 0, ang_sep(az, el, m_az, m_el)
    if ac["gs"] >= 40:
        v = ac["gs"] * 1.15078 / 3600.0  # mi/s
        tr = math.radians(ac["track"])
        vx, vy = v * math.sin(tr), v * math.cos(tr)
        for t in range(5, LOOKAHEAD_S + 1, 5):
            az, el = az_el(ac["x"] + vx * t, ac["y"] + vy * t, ac["alt"])
            s = ang_sep(az, el, m_az, m_el)
            if s < best_sep:
                best_sep, best_t = s, t
    return best_t, best_sep
```

The current position (t=0) is always evaluated first, so general-aviation transponders that report no ground speed still register their live separation. The plane with the smallest minimum separation becomes the alert candidate; the banner fires when its ETA drops under 90 seconds. Alerts are gated off while the moon is below 5° altitude — too much atmosphere, and the geometry gets unreliable near the horizon.

### The Moon, Computed On-Device

**moon\_ephem.py** &nbsp;implements a truncated lunar ephemeris: the moon's ecliptic position from its principal periodic terms, converted to azimuth/altitude for your location, good to about 0.3° — a third of the NEAR threshold, plenty for framing a shot. It also returns illumination fraction and waxing/waning, which drive the MOON screen's phase render. Rise and set times are found by scanning the next 24 hours in 10-minute steps for horizon crossings, then interpolating. Time comes from NTP once at boot and lives in the real-time clock (RTC) after that.

### Screens and Touch

Each screen (RAD, LIST, MOON, LOC, plus a flight DETAIL view) is a builder function that returns a fresh&nbsp;`displayio.Group`;&nbsp;`show()`&nbsp;swaps it in and refreshes. The display runs with&nbsp;`auto_refresh=False`, so nothing repaints mid-build.

Tap targets use&nbsp;_nearest-neighbor_&nbsp;mapping instead of strict bounding boxes — the CST8xx reports taps near the round bezel compressed inward, so dead gaps between buttons would eat presses. The keypad, nav chips, and list rows all snap to the closest target. If you rotate the screen (the keypad's&nbsp;`90`/`180`/`270`&nbsp;+ OK),&nbsp;`rotate_touch()`&nbsp;remaps coordinates to match, and the setting persists in NVM across power cycles — as does your ZIP code.

### The Main Loop: Touch Comes First

The CST8xx touch controller has no event buffer — a tap that lands entirely inside a blocking network call is gone by the time the code looks. The main loop is organized around that constraint:

- `poll_touch()`&nbsp;runs every loop iteration&nbsp;_and_&nbsp;immediately after every blocking operation (fetch, ephemeris scan, screen rebuild).
- Any touch opens a 2-second priority window during which all blocking work (network fetches, rise/set scans) is deferred — so navigating around the UI stays responsive.
- The aircraft fetch uses a short 4-second timeout: better to skip one 15-second cycle than freeze the UI for 10 on a slow response.
- The flight-detail screen paints instantly with a loading dial, and the (blocking) route lookup happens on the next loop pass, after the frame is already on screen.

### Demo Mode

Enter&nbsp; **67** &nbsp;on the LOC keypad and tap OK: a fake plane (callsign DEMO67) crosses the radar twice — 30 seconds dead over the moon triggering the pink TRANSIT alert, then 30 seconds offset for the cyan NEAR alert — before live data resumes. Handy for filming the project or verifying your build end-to-end without waiting for real traffic. The demo animates incrementally (sliding the plane's display group rather than rebuilding the screen), which is also a good template if you want to add your own animations.

## Troubleshooting

- **Horizontal jitter during fetches** &nbsp;— your panel may tolerate more pixel clock than mine, or less. Lower&nbsp;`DISPLAY_FREQ`&nbsp;further, or reduce WiFi TX power.
- **Fetches timing out** &nbsp;— raise&nbsp;`wifi.radio.tx_power`&nbsp;back toward 15–20 dBm.
- **Touch not responding** &nbsp;— make sure your&nbsp;`adafruit_cst8xx`&nbsp;is from a bundle dated after July 14, 2026 (the 0x00 chip-ID fix).
- **Left/right taps swapped when rotated** &nbsp;— swap the 90 and 270 cases in&nbsp;`rotate_touch()`.
- **Tap logging** &nbsp;— set&nbsp;`DEBUG_TOUCH = True`&nbsp;to print every tap and release to the serial console.

# Moon Flight Tracker

## 3D Printing

3MF files for 3D printing are oriented and ready to print on FDM machines using PLA filament. Original design source files may be downloaded using the links below.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/071/medium640/lcds___displays_parts-3d.jpg?1785110941)

[Moon Flight Tracker STLs](https://cdn-learn.adafruit.com/assets/assets/000/145/072/original/moon-flight-tracker.zip?1785111019)
[Edit Design](https://a360.co/44Ub7S3)
Info: The dropdown on the Fusion 360 site allows you to pick your preferred 3D file format like STEP, STL, etc.

### Slice with settings for PLA material

The parts were sliced using BambuStudio using the slice settings below.

- PLA filament 220c extruder
- 0.2 layer height
- 10% gyroid infill
- 200mm/s print speed
- Tree Supports
- 60 C heated bed

![](https://cdn-learn.adafruit.com/assets/assets/000/145/073/medium640/lcds___displays_slice.jpg?1785111734)

## Design Source Files

The project assembly was designed in Fusion 360. Once opened in Fusion 360, It can be exported in different formats like STEP, STL and more.

Electronic components like Adafruit's boards, displays, connectors and more can be downloaded from the&nbsp;[Adafruit CAD parts GitHub Repo](https://github.com/adafruit/Adafruit_CAD_Parts/)

![](https://cdn-learn.adafruit.com/assets/assets/000/145/074/medium640/lcds___displays_cad.jpg?1785111901)

# Moon Flight Tracker

## Assembly

## Place Display

Align the ribbon cable to the cutouts inside the case.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/075/medium640/lcds___displays_display-place.jpg?1785112313)

## Insert Mount Plate

The mounting plate snap-fits over the display at an angle to hold the display in place, with the stand offs facing up.

Gently bend the plate over the reset stem and then over the side tabs inside the case.

&nbsp;

![](https://cdn-learn.adafruit.com/assets/assets/000/145/076/medium640/lcds___displays_display-frame.jpg?1785113009)

## Attach ribbon cable

Gently open the ribbon latch on the Qualia board and align the ribbon cable to the port.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/077/medium640/lcds___displays_display-ribbon.jpg?1785113215)

## Mount Qualia

Use M2.5x6mm screws to mount the Qualia board to the standoffs on the mounting plate.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/078/medium640/lcds___displays_board-mount.jpg?1785113564)

## Attach Lid

First align two of the snap fits to the side tabs inside the case. Once the two walls are "locked-in", press fit the last tab to secure the lid.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/079/medium640/lcds___displays_lid.jpg?1785113981)

## Check USB port

Verify the USB port opening fits a USB cable. The mounting plate can rotate to adjust the USB port to the middle of the opening.&nbsp;

![](https://cdn-learn.adafruit.com/assets/assets/000/145/080/medium640/lcds___displays_usb-align.jpg?1785114520)

## Tripod screw

Use a flat tool to secure a 3/8" to 1/4" Adapter Screw to the thread on the lid.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/081/medium640/lcds___displays_tripod-screw.jpg?1785114651)

![](https://cdn-learn.adafruit.com/assets/assets/000/145/082/medium800/lcds___displays_hero-close-tap.jpg?1785114736 )

# Moon Flight Tracker

## Use

# Using the Moon Flight Tracker

## First Boot

Plug in USB-C power. The tracker connects to WiFi, syncs the clock over NTP, and lands on the&nbsp; **RADAR** &nbsp;screen. Before it can predict anything it needs to know where you are — so set your ZIP code first:

1. Tap&nbsp; **LOC** &nbsp;in the navigation strip.
2. Enter your five-digit ZIP code on the keypad.&nbsp; **DEL** &nbsp;backspaces.
3. Tap&nbsp; **OK**. The tracker looks up your coordinates and timezone, then returns to the radar.

Your ZIP is saved to non-volatile memory, so it survives unplugging — you only do this once, or when you travel.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/083/medium640/lcds___displays_hero-zip.jpg?1785114860)

## Getting Around

The chips at the bottom of every screen switch views: **RAD** ,&nbsp; **LIST** ,&nbsp; **MOON** ,&nbsp; **LOC**. Taps register on press, and the nearest chip to your finger wins — so you don't have to be precise near the curved edge of the display.

### RADAR

A plan view of the sky around you, refreshed every 15 seconds. You're at the center; the rings mark distance out to the search radius. Each aircraft appears as a triangle pointed along its heading, labeled with callsign and altitude. A moon marker sits on the rim at the moon's current bearing, so you can see at a glance which side of the sky to face.

When a plane is on track to pass close to the moon it lights up and an alert banner drops from the top of the screen with the callsign and a countdown. Tap the banner — or any plane — for its details.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/084/medium640/lcds___displays_ui-radar.jpg?1785115330)

### LIST

Every tracked aircraft, sorted by how close it will come to the moon — best candidate at the top. Each row shows callsign, the predicted minimum separation in degrees, and how many seconds until that closest approach. Rows are color-coded to match the alert tiers. Tap a row to open flight details.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/085/medium640/lcds___displays_ui-fly-list.jpg?1785115499)

### FLIGHT DETAIL

Callsign, aircraft type, origin and destination airports, altitude, speed, and heading, plus the predicted separation and time. Route information is looked up when you open the screen, so it appears a moment after the rest — a dial spins while it loads. Not every aircraft is in the route database; private and general-aviation flights often show the callsign only. Tap anywhere to go back.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/086/medium640/lcds___displays_hero-info.jpg?1785115600)

### MOON

Tonight's moon: the current phase drawn to scale, illumination percentage, whether it's waxing or waning, its altitude above the horizon and compass azimuth, and local rise and set times. Negative altitude means the moon is below the horizon — the tracker holds off on alerts until it climbs above 5°, since the geometry near the horizon isn't reliable enough to be worth chasing.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/087/medium640/lcds___displays_hero-moon.jpg?1785115716)

### LOCATION

Beyond the ZIP keypad, this screen sets screen rotation. Enter&nbsp; **90** ,&nbsp; **180** , or&nbsp; **270** &nbsp;and tap OK to rotate the display — useful depending on which way the ribbon cable exits your mount. Touch coordinates rotate with it, and the setting persists across power cycles. Enter&nbsp; **0** &nbsp;to go back to upright.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/088/medium640/lcds___displays_hero-sky-medium.jpg?1785115802)

## Reading the Alerts

Alerts are about angular separation — how far apart the plane and the moon will look in the sky, not how far apart they are in miles. The moon is about half a degree wide, which sets both thresholds:

- **NEAR (cyan)**&nbsp;— closest approach under 2°. The plane won't cross the disc, but both fit comfortably in a 300&nbsp;mm telephoto frame. Worth shooting.
- **TRANSIT (pink)**&nbsp;— closest approach under 0.5°. The plane crosses the lunar disc itself. This is the shot.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/089/medium640/lcds___displays_hero-radar.jpg?1785116138)

The banner fires when the predicted closest approach is less than 90 seconds away and counts down to it. Predictions assume the aircraft holds its current heading, speed, and altitude — a plane in a turn or a climb will drift from the forecast, so treat the countdown as a cue to be ready, not a shutter trigger.

## Demo Mode

Enter&nbsp; **67** &nbsp;on the LOC keypad and tap OK. A simulated aircraft, callsign DEMO67, crosses the radar twice: first straight over the moon to fire the pink TRANSIT alert, then offset to fire the cyan NEAR alert. It runs about a minute, then live data resumes. Use it to confirm your build works, to learn the alert flow, or to film your project on a cloudy night.

![](https://cdn-learn.adafruit.com/assets/assets/000/145/090/medium800/lcds___displays_hero-sky-wide.jpg?1785119520 )

## Shooting the Shot

- **Mount the tracker to your hotshoe** &nbsp;so alerts are in your peripheral vision while you're at the viewfinder.
- **Frame and focus early.** &nbsp;A transit lasts a fraction of a second — there's no time to hunt for focus. Pre-focus on the moon, switch to manual, and leave it.
- **Expose for the moon, not the sky.** &nbsp;It's a sunlit rock; roughly 1/250&nbsp;s at f/8, ISO 200 is a starting point. The plane will silhouette.
- **Shoot bursts.** &nbsp;Start the burst a couple of seconds before the countdown hits zero and hold through it.
- **Watch the LIST screen** &nbsp;while you wait — it shows candidates minutes out, well before any banner fires.
- **Best odds** &nbsp;come from a moon between 10° and 40° altitude near a flight path — low enough that aircraft are still at cruise altitudes in your line of sight, high enough to be clear of haze.

## If Something Looks Off

- **No planes at all** &nbsp;— ADS-B coverage varies by area, and rural regions can be thin. Check the serial console for fetch errors, and try raising&nbsp;`NM_RADIUS`&nbsp;in&nbsp; **code.py**.
- **Rise and set times look wrong** &nbsp;— the timezone comes from your ZIP lookup. Re-enter your ZIP, or set&nbsp;`UTC_OFFSET`&nbsp;in&nbsp; **settings.toml**.
- **Alerts never fire** &nbsp;— check the MOON screen. Below 5° altitude, alerts are suppressed by design.
- **Taps land in the wrong place after rotating** &nbsp;— see the rotation note on the Code page.


## Guide Products

### Adafruit Qualia ESP32-S3 for TTL RGB-666 Displays

[Adafruit Qualia ESP32-S3 for TTL RGB-666 Displays](https://www.adafruit.com/product/5800)
There's a few things everyone loves: ice cream, kittens, and honkin' large TFT screens. We're no strangers to small TFT's - [from our itsy 1.14" color display](https://www.adafruit.com/search?q=1.14+tft) that graces many-a-TFT-Feather to <a...></a...>

In Stock
[Buy Now](https://www.adafruit.com/product/5800)
[Related Guides to the Product](https://learn.adafruit.com/products/5800/guides)
### Round RGB 666 TTL TFT Display - 2.1" 480x480 - Capacitive Touch

[Round RGB 666 TTL TFT Display - 2.1" 480x480 - Capacitive Touch](https://www.adafruit.com/product/5792)
This is a screen for advanced hackers who like the look of a nice, round TFT screen with tons of pixels. The 2.1" diagonal sized display has 480x480 16-bit full-color pixels and is an&nbsp; **IPS** &nbsp;display, so the color looks great up to 80 degrees off-axis in any...

In Stock
[Buy Now](https://www.adafruit.com/product/5792)
[Related Guides to the Product](https://learn.adafruit.com/products/5792/guides)
### Camera and Tripod 3/8" to 1/4" Adapter Screw

[Camera and Tripod 3/8" to 1/4" Adapter Screw](https://www.adafruit.com/product/2392)
_Whaddya got a screw loose or something?_

This **3/8" to 1/4"**  **Adapter Screw** is super handy if you're building projects that connect to a tripod or a camera. It's a simple fix for getting a tripod with a 1/4" machine screw...

In Stock
[Buy Now](https://www.adafruit.com/product/2392)
[Related Guides to the Product](https://learn.adafruit.com/products/2392/guides)
### Pink and Purple Woven USB A to USB C Cable - 1 meter long

[Pink and Purple Woven USB A to USB C Cable - 1 meter long](https://www.adafruit.com/product/5153)
This cable is not only super-fashionable, with a woven pink and purple Blinka-like pattern, it's also made for USB C for our modernized breakout boards, Feathers, and more.&nbsp;&nbsp;[If you want something just like it but for Micro B, we...](https://www.adafruit.com/product/4111)

Out of Stock
[Buy Now](https://www.adafruit.com/product/5153)
[Related Guides to the Product](https://learn.adafruit.com/products/5153/guides)

## Related Guides

- [Adafruit Qualia ESP32-S3 for RGB-666 Displays](https://learn.adafruit.com/adafruit-qualia-esp32-s3-for-rgb666-displays.md)
- [Face Tracking Robot with MEMENTO](https://learn.adafruit.com/face-tracking-robot-with-memento.md)
- [Piranha Pi Camera](https://learn.adafruit.com/piranha-pi-cam.md)
- [CircuitPython Chiptune Player](https://learn.adafruit.com/circuitpython-chiptune-player.md)
- [Video Playing 2.1" Round Ornament TFT](https://learn.adafruit.com/2-1-round-ornament-tft.md)
- [SNES Mouse to USB HID with CircuitPython](https://learn.adafruit.com/snes-mouse-to-usb-hid-with-circuitpython.md)
- [Theme Park Wait Time Display](https://learn.adafruit.com/park-wait-time.md)
- [Portable 5in Monitor with HDMI](https://learn.adafruit.com/portable-5in-monitor-with-hdmi.md)
- [16-Step Drum Sequencer](https://learn.adafruit.com/16-step-drum-sequencer.md)
- [QT Py CH32V203 eInk / ePaper Daily Calendar and Clock](https://learn.adafruit.com/ch32v203-eink-epaper-calendar-and-clock.md)
- [PyBadge Thermal Camera Case](https://learn.adafruit.com/pybadge-thermal-camera-case.md)
- [Circle of Fifths Euclidean Synth with synthio and CircuitPython](https://learn.adafruit.com/circle-of-fifths-euclidean-synth-with-synthio-and-circuitpython.md)
- [Getting Started with Microsoft Azure and CircuitPython](https://learn.adafruit.com/getting-started-with-microsoft-azure-and-circuitpython.md)
- [ESP32-S3 BLE iOS Media Controller](https://learn.adafruit.com/esp32-s3-ble-ios-media-controller.md)
- [Glider Paper Airplane Controller](https://learn.adafruit.com/glider-paper-airplane-controller.md)
- [GoPro Hero 5 NinjaFlex Case with Tripod](https://learn.adafruit.com/gopro-hero-5-ninjaflex-case-with-tripod.md)
