# Theme Park Wait Time Display

## Overview

https://youtu.be/c3B9ztZ3n8Q

This project syncs with queue-times.com theme park queue lines to show the LIVE wait time of rides in any given moment!&nbsp;

This handy time display project will let you gauge crowd levels, even if you live thousands of miles away and didn't even have a trip planned!

&nbsp;

![3d_printing_hero-solo-screen.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/770/medium640/3d_printing_hero-solo-screen.jpg?1723470563)

The 4" round display is powered by the Qualia S3. CircuitPython code accesses queue-times.com API and displays the wait times on the screen, overlaid on top of a custom background image.

&nbsp;

![3d_printing_hero-board.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/773/medium640/3d_printing_hero-board.jpg?1723477542)

An arcade button lets you switch between different parks and show the top five rides with their wait times.

The 3D printed case houses the components, you can even customize the face plate to your preferred theme park!

&nbsp;

![3d_printing_hero-ears.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/774/medium640/3d_printing_hero-ears.jpg?1723477821)

![3d_printing_hero-shark.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/775/medium640/3d_printing_hero-shark.jpg?1723477853)

## Parts, Tools & Components

You'll need just a few parts to build this project.&nbsp; If you don't have access to a 3D printer, you can send the files to a service or check with your local hackerspace or library

![](https://cdn-learn.adafruit.com/assets/assets/000/131/776/medium800/3d_printing_parts.jpg?1723478005)

### Round RGB TTL TFT Display - 4" 720x720 - No Touchscreen

[Round RGB TTL TFT Display - 4" 720x720 - No Touchscreen](https://www.adafruit.com/product/5793)
This is a screen for advanced hackers who like the look of a nice, round TFT screen with tons of pixels. This massive&nbsp;4" diagonal-sized display has 720x720 16-bit full-color pixels and is an&nbsp; **IPS** &nbsp;display, so the color looks great up to 80 degrees off-axis in...

Out of Stock
[Buy Now](https://www.adafruit.com/product/5793)
[Related Guides to the Product](https://learn.adafruit.com/products/5793/guides)
![Overhead shot of round TFT display with a color gradient rainbow image.](https://cdn-shop.adafruit.com/640x480/5793-03.jpg)

### 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)

### Arcade Button - 30mm Translucent Clear

[Arcade Button - 30mm Translucent Clear](https://www.adafruit.com/product/471)
A button is a button, and a switch is a switch, but these translucent arcade buttons are in a class of their own. They're the same size as common arcade controls (often referred to as 30mm diameter) but have some nice things going for them that justify the extra dollar.  
  
First,...

In Stock
[Buy Now](https://www.adafruit.com/product/471)
[Related Guides to the Product](https://learn.adafruit.com/products/471/guides)
![Angled shot of a clear round 30mm arcade button. ](https://cdn-shop.adafruit.com/640x480/471-00.jpg)

### Arcade Button Quick-Connect Wire Pairs - 0.11" (10 pack)

[Arcade Button Quick-Connect Wire Pairs - 0.11" (10 pack)](https://www.adafruit.com/product/1152)
Quick connector wire sets will make wiring up our arcade-style or metal buttons quicky-quick. Each wire comes as a 'pair' with two 0.11" quick-connects pre-crimped onto 20cm long wires. The wires are then terminated together in a JST 2.5mm/0.1" spaced 2-pin connector (we...

In Stock
[Buy Now](https://www.adafruit.com/product/1152)
[Related Guides to the Product](https://learn.adafruit.com/products/1152/guides)
![Angled shot of ten 20 cm long quick-connect wire pairs. ](https://cdn-shop.adafruit.com/640x480/1152-06.jpg)

### STEMMA JST PH 2mm 3-Pin to Male Header Cable - 200mm

[STEMMA JST PH 2mm 3-Pin to Male Header Cable - 200mm](https://www.adafruit.com/product/3893)
This cable will let you turn a JST PH 3-pin cable port into 3 individual wires with high-quality 0.1" male header plugs on the end. We're carrying these to match up with our Hallowing, for extending and connecting sensors or LEDs - and the wires are even color coded!

<a...></a...>

In Stock
[Buy Now](https://www.adafruit.com/product/3893)
[Related Guides to the Product](https://learn.adafruit.com/products/3893/guides)
![Angled shot of STEMMA JST PH 3-Pin to Male Header Cable - 200mm.](https://cdn-shop.adafruit.com/640x480/3893-03.jpg)

### Right Angle USB Type C Adapter - USB 3.1 Gen 4 Compatible

[Right Angle USB Type C Adapter - USB 3.1 Gen 4 Compatible](https://www.adafruit.com/product/4432)
As technology changes and adapts, so does Adafruit, and speaking of _adapting_, this **_right angle_** &nbsp;_ **adapter** _&nbsp;is USB C socket-to-plug.

USB C is the latest industry-standard connector for transmitting...

In Stock
[Buy Now](https://www.adafruit.com/product/4432)
[Related Guides to the Product](https://learn.adafruit.com/products/4432/guides)
![Angled Shot of the Right Angle USB Type C Adapter - USB 3.1 Gen 4 Compatible.](https://cdn-shop.adafruit.com/640x480/4432-07.jpg)

### 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: M2.5mm Screws
quantity: 4
M2.5mm Screws
[M2.5mm Screws](https://amzn.to/3XKJc4v)

# Theme Park Wait Time Display

## 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)

# Theme Park Wait Time Display

## Create Your settings.toml File

CircuitPython works with WiFi-capable boards to enable you to make projects that have network connectivity. This means working with various passwords and API keys. As of [CircuitPython 8](https://circuitpython.org/downloads), there is support for a **settings.toml** file. This is a file that is stored on your **CIRCUITPY** drive, that contains all of your secret network information, such as your SSID, SSID password and any API keys for IoT services. It is designed to separate your sensitive information from your **code.py** file so you are able to share your code without sharing your credentials.

CircuitPython previously used a **secrets.py** file for this purpose. The **settings.toml** file is quite similar.

Warning: Your **settings.toml** file should be stored in the main directory of your **CIRCUITPY** drive. It should not be in a folder.

## CircuitPython **settings.toml** File

This section will provide a couple of examples of what your **settings.toml** file should look like, specifically for CircuitPython WiFi projects in general.

The most minimal **settings.toml** file must contain your WiFi SSID and password, as that is the minimum required to connect to WiFi. Copy this example, paste it into your **settings.toml** , and update:

- `your_wifi_ssid`
- `your_wifi_password`

```auto
CIRCUITPY_WIFI_SSID = "your_wifi_ssid"
CIRCUITPY_WIFI_PASSWORD = "your_wifi_password"
```

Many CircuitPython network-connected projects on the Adafruit Learn System involve using Adafruit IO. For these projects, you must _also_ include your Adafruit IO username and key. Copy the following example, paste it into your settings.toml file, and update:

- `your_wifi_ssid`
- `your_wifi_password`
- `your_aio_username`
- `your_aio_key`

```auto
CIRCUITPY_WIFI_SSID = "your_wifi_ssid"
CIRCUITPY_WIFI_PASSWORD = "your_wifi_password"
ADAFRUIT_AIO_USERNAME = "your_aio_username"
ADAFRUIT_AIO_KEY = "your_aio_key"
```

Some projects use different variable names for the entries in the **settings.toml** file. For example, a project might use `ADAFRUIT_AIO_ID` in the place of `ADAFRUIT_AIO_USERNAME`. **If you run into connectivity issues, one of the first things to check is that the names in the settings.toml file match the names in the code.**

Warning: Not every project uses the same variable name for each entry in the **settings.toml** file! Always verify it matches the code.

## **settings.toml** File Tips
Here is an example **settings.toml** file.

```auto
# Comments are supported
CIRCUITPY_WIFI_SSID = "guest wifi"
CIRCUITPY_WIFI_PASSWORD = "guessable"
CIRCUITPY_WEB_API_PORT = 80
CIRCUITPY_WEB_API_PASSWORD = "passw0rd"
test_variable = "this is a test"
thumbs_up = "\U0001f44d"
```

In a **settings.toml** file, it's important to keep these factors in mind:

- Strings are wrapped in double quotes; ex: `"your-string-here"`
- Integers are _ **not** _ quoted and may be written in decimal with optional sign (`+1`, `-1`, `1000`) or hexadecimal (`0xabcd`).
  - Floats (decimal numbers), octal (`0o567`) and binary (`0b11011`) are not supported.

- Use `\u` escapes for weird characters, `\x` and `\ooo` escapes are not available in **.toml** files
  - Example: `\U0001f44d` for 👍 (thumbs up emoji) and `\u20ac` for € (EUR sign)

- Unicode emoji, and non-ASCII characters, stand for themselves as long as you're careful to save in "UTF-8 without BOM" format

&nbsp;

&nbsp;

When your&nbsp; **settings.toml&nbsp;** file is ready, you can save it in your text editor with the **.toml** &nbsp;extension.

![adafruit_products_dotToml.jpg](https://cdn-learn.adafruit.com/assets/assets/000/117/071/medium640/adafruit_products_dotToml.jpg?1671034293)

## Accessing Your **settings.toml** Information in **code.py**
In your **code.py** file, you'll need to `import` the `os` library to access the **settings.toml** file. Your settings are accessed with the `os.getenv()` function. You'll pass your settings entry to the function to import it into the **code.py** file.

```python
import os

print(os.getenv("test_variable"))
```

![](https://cdn-learn.adafruit.com/assets/assets/000/117/072/medium800/adafruit_products_tomlOutput.jpg?1671034496)

In the upcoming CircuitPython WiFi examples, you'll see how the **settings.toml&nbsp;** file is used for connecting to your SSID and accessing your API keys.

# Theme Park Wait Time Display

## Code the Display

Once you've finished setting up your Qualia S3 with CircuitPython, you can access the code and necessary libraries by downloading the Project Bundle.

To do this, click on the **Download Project Bundle** button in the window below. It will download to your computer as a zipped folder.

![3d_printing_cp-hero.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/795/medium640/3d_printing_cp-hero.jpg?1723483736)

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

## Upload the Code and Libraries to the Qualia S3

After downloading the Project Bundle, plug your Qualia S3 into the computer's USB port with a known good USB data+power cable. You should see a new flash drive appear in the computer's File Explorer or Finder (depending on your operating system) called **CIRCUITPY**. Unzip the folder and copy the following items to the Qualia S3's **CIRCUITPY** drive.

- **lib** folder
- **code.py**
- **park-bg.bmp**
- **Roboto-Regular-47.pcf**

Your Qualia S3 **CIRCUITPY** drive should look like this after copying the **lib** folder, **park-bg****.bmp **file,** Roboto-Regular-47.pcf **file and the** code.py** file.

![CIRCUITPY](https://adafruit.github.io/Adafruit_Learning_System_Guides/Qualia_Qualia_S3_Theme_Park_Display.png )

## Add Your **settings.toml** File

As of CircuitPython 8.0.0, there is support for [Environment Variables](https://docs.circuitpython.org/en/latest/docs/environment.html). Environment variables are stored in a **settings.toml** file. Similar to **secrets.py** , the **settings.toml** file separates your sensitive information from your main **code.py** file. Add your **settings.toml** file as described in the [Create Your settings.toml File page](https://learn.adafruit.com/mars-clock/create-your-settings-toml-file) earlier in this guide. You'll need to include your&nbsp;`CIRCUITPY_WIFI_SSID` and `CIRCUITPY_WIFI_PASSWORD`.

```auto
CIRCUITPY_WIFI_SSID = "your-ssid-here"
CIRCUITPY_WIFI_PASSWORD = "your-ssid-password-here"
```

## How the CircuitPython Code Works

At the top of the code is a dictionary with the name of the park and its Queue Times API JSON feed. The text in the `name` entry will be shown on the display. You can update this dictionary with the names of the parks that you want to track. The code will dynamically adjust to a different number of feeds.

```python
urls = [{'name': "Epcot", 'url': "https://queue-times.com/en-US/parks/5/queue_times.json"},
        {'name': "Magic Kingdom", 'url': "https://queue-times.com/en-US/parks/6/queue_times.json"},
        {'name': "Hollywood Studios", 'url': "https://queue-times.com/en-US/parks/7/queue_times.json"},
        {'name': "Animal Kingdom", 'url': "https://queue-times.com/en-US/parks/8/queue_times.json"},
        ]
```

### Bitmap, Keypad and WiFi

The background image is loaded in as an&nbsp;`OnDiskBitmap` and the button that changes the park view is instantiated as a `Keypad` object on pin **A0**. A WiFi connection is established using your SSID and password entries from **settings.toml**.

```python
bitmap = displayio.OnDiskBitmap("/park-bg.bmp")

key = keypad.Keys((board.A0,), value_when_pressed=False, pull=True)

wifi.radio.connect(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD"))
print(f"Connected to {os.getenv('CIRCUITPY_WIFI_SSID')}")

context = ssl.create_default_context()
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, context)
```

### Graphics

Ten different labels are used to display the ride name and ride wait time. These are created with a&nbsp;`for` loop and are added to the display `Group`. The ride text elements are added to the `ride_text` list and the wait time text elements are added to the `wait_text` list.

One text label is created for the park name that is stored in the `urls` dictionary. This label is located at the bottom of the display.

```python
graphics = Graphics(Displays.ROUND40, default_bg=None, auto_refresh=True)

grid = displayio.TileGrid(bitmap, pixel_shader=bitmap.pixel_shader)
group = displayio.Group()
group.append(grid)

font = bitmap_font.load_font("/Roboto-Regular-47.pcf")
ride_text = []
wait_text = []
for i in range(5):
    text_ride = outlined_label.OutlinedLabel(font, text=" ",
    outline_color=0x000000,
    outline_size=3,
    padding_left=4,
    padding_right=4,
    padding_top=4,
    padding_bottom=4)
    ride_text.append(text_ride)
    text_wait = outlined_label.OutlinedLabel(font, text=" ",
    outline_color=0x000000,
    outline_size=3,
    padding_left=4,
    padding_right=4,
    padding_top=4,
    padding_bottom=4)
    wait_text.append(text_wait)
    group.append(text_ride)
    group.append(text_wait)

text_park = outlined_label.OutlinedLabel(font, text=urls[0]['name'],
    outline_color = 0x000000,
    outline_size=3,
    padding_left=4,
    padding_right=4,
    padding_top=4,
    padding_bottom=4)
text_park.x = (graphics.display.width - text_park.width) // 2
text_park.y = graphics.display.height - (text_park.height * 2)
group.append(text_park)
```

### Sorting

A function is used in the loop that sorts the returned list of rides by their wait time. The five rides with the longest wait times are shown on the display by updating the text elements in&nbsp;`ride_text` and `wait_text`.&nbsp;

```python
def sort_rides(data):
    y = 30
    x = [135, 55, 15, 25, 45]
    all_rides = []
    for land in data['lands']:
        all_rides.extend(land['rides'])
    sorted_rides = sorted(all_rides, key=lambda x: x['wait_time'], reverse=True)
    for ride in sorted_rides:
        r = sorted_rides.index(ride)
        if r > 4:
            break
        #print(wait_text[r])
        ride_text[r].text = f"{ride['name']:.20}"
        if len(ride['name']) > 20:
            ride_text[r].text = ride_text[r].text + ".."
        ride_text[r].x = x[r]
        ride_text[r].y = y + 70
        wait_text[r].text = f"{ride['wait_time']} Minutes"
        wait_text[r].x = 400
        wait_text[r].y = ride_text[r].y + wait_text[r].height + 20
        y += wait_text[r].height * 2 + 30
```

### Times and States

A&nbsp;`ticks` timer, set for five minutes, is used to keep time in the loop. `park_index` tracks which park is selected from the `urls` dictionary and the `update` state tracks whether the JSON feed should be polled.

```python
clock_timer = 5 * 60 * 1000
clock_clock = ticks_ms()
park_index = 0
update = True
```

### The Loop

In the loop, if the button is pressed then the&nbsp;`park_index` increases by one, resulting in the park text updating on the display and `update` being set to `True`. If `update` is `True` or if the `ticks` timer runs out, the JSON feed for the selected park is fetched. The `sort_rides()` function sorts the JSON feed by ride wait time and updates the text elements for the top five rides and their wait times.

```python
while True:
    try:
        event = key.events.get()
        if event:
            if event.pressed:
                print("updating display")
                park_index = (park_index + 1) % len(urls)
                text_park.text=urls[park_index]['name']
                text_park.x = (graphics.display.width - text_park.width) // 2
                text_park.y = graphics.display.height - (text_park.height * 2)
                update = True
        if ticks_diff(ticks_ms(), clock_clock) >= clock_timer or update:
            response = requests.get(urls[park_index]['url'])
            #  packs the response into a JSON
            response_data = response.json()
            sort_rides(response_data)
            update = False
            clock_clock = ticks_add(clock_clock, clock_timer)
    except Exception as error:
        print(f"error! {error} resetting..")
        time.sleep(5)
        microcontroller.reset()
```

# Theme Park Wait Time Display

## 3D Printing

## 3D Printed Parts

STL files for 3D printing will need to be oriented for print using either FDM or SLS machines.

Parts were tested using PLA filament.

Original design source files may be downloaded using the links below

![3d_printing_parts-3d-side.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/777/medium640/3d_printing_parts-3d-side.jpg?1723478073)

[Edit Design](https://a360.co/3AkTcrP)
[Download STLs](https://www.thingiverse.com/thing:6729629)
[Download STEP file](https://cdn-learn.adafruit.com/assets/assets/000/131/820/original/Theme_Park_Wait_Times_Clock-STEP.zip?1723578178)
## Slice with Settings for PLA material&nbsp;

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

- PLA filament 200c extruder
- 0.25 layer height
- 20% gyroid infill
- 60mm/s print speed
- 60°C heated bed

![3d_printing_slice.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/778/medium640/3d_printing_slice.jpg?1723478538)

## Face plates

You can customize the front face plates for the case to match for preferred theme part. The design includes mouse ears and a shark!

The face plates press fit onto the front of the case over the display.

![3d_printing_parts-ears.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/796/medium640/3d_printing_parts-ears.jpg?1723485983)

![3d_printing_parts-shark-one.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/797/medium640/3d_printing_parts-shark-one.jpg?1723486036)

## Multicolor face plate

The shark face plate is designed to be stacked and glued for single extruder printers.

![3d_printing_shark-parks.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/798/medium640/3d_printing_shark-parks.jpg?1723486205)

![3d_printing_parts-shark.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/799/medium640/3d_printing_parts-shark.jpg?1723486240)

[Theme_Park_Wait_Times_Clock-STEP.zip](https://cdn-learn.adafruit.com/assets/assets/000/131/819/original/Theme_Park_Wait_Times_Clock-STEP.zip?1723578155)
# Theme Park Wait Time Display

## Circuit Diagram

The diagram below provides a general visual reference for wiring of the components once you get to the **Assembly** page. This diagram was created using the software package [Fritzing](http://fritzing.org/download/).

## Adafruit Library for Fritzing

Adafruit uses the Adafruit's Fritzing parts library to create circuit diagrams for projects. You can download the library or just grab individual parts. Get the library and parts from [GitHub - Adafruit Fritzing Parts](https://github.com/adafruit/Fritzing-Library/tree/master/parts).

![](https://cdn-learn.adafruit.com/assets/assets/000/131/800/medium800/3d_printing_Queue-Wait-Time-Circuit-Diagram.jpg?1723488046)

# Theme Park Wait Time Display

## Assemble

## Place screen

The 4" round display is placed inside the case. Gently press fit the display into the inner walls.&nbsp;

![3d_printing_ass-place-screen.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/779/medium640/3d_printing_ass-place-screen.jpg?1723478605)

## Snap fit frame

Place the frame on top of the display. Three nubs around the inside of the case hold the frame in place. Gently bend the frame to fit over the nubs to snap fit to the case.&nbsp;

![3d_printing_ass-frame-place.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/780/medium640/3d_printing_ass-frame-place.jpg?1723481691)

![3d_printing_ass-frame-place-nubs.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/781/medium640/3d_printing_ass-frame-place-nubs.jpg?1723481800)

## Adjust frame

The frame can freely rotate to align the display ribbon cable to the Qualia board.

![3d_printing_ass-frame-adjust.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/782/medium640/3d_printing_ass-frame-adjust.jpg?1723481901)

![3d_printing_ass-frame-place-nubed.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/783/medium640/3d_printing_ass-frame-place-nubed.jpg?1723481939)

## Attach ribbon cable

Open the display latch on the Qualia board. Place the Qualia board over the stand-offs. Use M2.5x5mm screws to mount the board.

![3d_printing_ass-ribbon-align.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/784/medium640/3d_printing_ass-ribbon-align.jpg?1723482072)

![3d_printing_ass-board-screws.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/785/medium640/3d_printing_ass-board-screws.jpg?1723482201)

## Assemble wires

Solder quick connect wires to a cable with a JST-3PH connector.

![3d_printing_wires.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/787/medium640/3d_printing_wires.jpg?1723482524)

![3d_printing_wire-sldered.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/788/medium640/3d_printing_wire-sldered.jpg?1723482569)

## USB right angle&nbsp;

Plug in a USB C right angle adapter to easily connect a USB cable.

## Arcade buttons

Press fit arcade buttons into to the case. Connect the quick connects to the terminals on the arcade buttons.&nbsp;

![3d_printing_usb-angle.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/789/medium640/3d_printing_usb-angle.jpg?1723482631)

![3d_printing_ass-button-mount.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/790/medium640/3d_printing_ass-button-mount.jpg?1723482745)

## USB Cable

Plug in the USB cable to the Qualia board.

## Snap fit lid

The USB cable fits into the cutout on the lid part. Align the lid to the snap fit nubs on the case and press fit to the case. &nbsp;

![3d_printing_ass-usb-cable-lid.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/791/medium640/3d_printing_ass-usb-cable-lid.jpg?1723482850)

![3d_printing_ass-lid-snap.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/793/medium640/3d_printing_ass-lid-snap.jpg?1723483099)

## Complete
![](https://cdn-learn.adafruit.com/assets/assets/000/131/794/medium800/3d_printing_heros-two-faces.jpg?1723483643)


## Featured Products

### Round RGB TTL TFT Display - 4" 720x720 - No Touchscreen

[Round RGB TTL TFT Display - 4" 720x720 - No Touchscreen](https://www.adafruit.com/product/5793)
This is a screen for advanced hackers who like the look of a nice, round TFT screen with tons of pixels. This massive&nbsp;4" diagonal-sized display has 720x720 16-bit full-color pixels and is an&nbsp; **IPS** &nbsp;display, so the color looks great up to 80 degrees off-axis in...

Out of Stock
[Buy Now](https://www.adafruit.com/product/5793)
[Related Guides to the Product](https://learn.adafruit.com/products/5793/guides)
### 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)
### Arcade Button - 30mm Translucent Clear

[Arcade Button - 30mm Translucent Clear](https://www.adafruit.com/product/471)
A button is a button, and a switch is a switch, but these translucent arcade buttons are in a class of their own. They're the same size as common arcade controls (often referred to as 30mm diameter) but have some nice things going for them that justify the extra dollar.  
  
First,...

In Stock
[Buy Now](https://www.adafruit.com/product/471)
[Related Guides to the Product](https://learn.adafruit.com/products/471/guides)
### Arcade Button Quick-Connect Wire Pairs - 0.11" (10 pack)

[Arcade Button Quick-Connect Wire Pairs - 0.11" (10 pack)](https://www.adafruit.com/product/1152)
Quick connector wire sets will make wiring up our arcade-style or metal buttons quicky-quick. Each wire comes as a 'pair' with two 0.11" quick-connects pre-crimped onto 20cm long wires. The wires are then terminated together in a JST 2.5mm/0.1" spaced 2-pin connector (we...

In Stock
[Buy Now](https://www.adafruit.com/product/1152)
[Related Guides to the Product](https://learn.adafruit.com/products/1152/guides)
### STEMMA JST PH 2mm 3-Pin to Male Header Cable - 200mm

[STEMMA JST PH 2mm 3-Pin to Male Header Cable - 200mm](https://www.adafruit.com/product/3893)
This cable will let you turn a JST PH 3-pin cable port into 3 individual wires with high-quality 0.1" male header plugs on the end. We're carrying these to match up with our Hallowing, for extending and connecting sensors or LEDs - and the wires are even color coded!

<a...></a...>

In Stock
[Buy Now](https://www.adafruit.com/product/3893)
[Related Guides to the Product](https://learn.adafruit.com/products/3893/guides)
### Right Angle USB Type C Adapter - USB 3.1 Gen 4 Compatible

[Right Angle USB Type C Adapter - USB 3.1 Gen 4 Compatible](https://www.adafruit.com/product/4432)
As technology changes and adapts, so does Adafruit, and speaking of _adapting_, this **_right angle_** &nbsp;_ **adapter** _&nbsp;is USB C socket-to-plug.

USB C is the latest industry-standard connector for transmitting...

In Stock
[Buy Now](https://www.adafruit.com/product/4432)
[Related Guides to the Product](https://learn.adafruit.com/products/4432/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)
- [Qualia S3 Sushi Conveyor Belt](https://learn.adafruit.com/qualia-s3-sushi-conveyor-belt.md)
- [Simplifying Qualia CircuitPython Projects](https://learn.adafruit.com/simplifying-qualia-circuitpython-projects.md)
- [Video Playing 2.1" Round Ornament TFT](https://learn.adafruit.com/2-1-round-ornament-tft.md)
- [Qualia S3 Compass](https://learn.adafruit.com/qualia-s3-compass.md)
- [Qualia S3 iOS Photo Display with itsaSNAP](https://learn.adafruit.com/qualia-s3-ios-photo-display-with-itsasnap.md)
- [Qualia 3D Printed Cases](https://learn.adafruit.com/qualia-3d-printed-cases.md)
- [CircuitPython Day 2024 Countdown Clock](https://learn.adafruit.com/circuitpython-day-2024-countdown-clock.md)
- [1D Chomper Tabletop Arcade Game](https://learn.adafruit.com/1d-chomper-tabletop-arcade-game.md)
- [Qualia S3 Fireplace](https://learn.adafruit.com/qualia-s3-fireplace.md)
- [Qualia S3 Space Clock](https://learn.adafruit.com/qualia-s3-space-clock.md)
- [LEGO Set Lighting](https://learn.adafruit.com/lego-set-lighting.md)
- [USB Rotary Media Dial](https://learn.adafruit.com/usb-rotary-media-dial.md)
- [Prop-Maker Lightsaber](https://learn.adafruit.com/lightsaber-featherwing.md)
- [Talking d20 20-Sided Gaming Die](https://learn.adafruit.com/talking-d20-20-sided-gaming-die.md)
