# ESP32-S3 BLE iOS Media Controller

## Overview

https://youtu.be/R0xh_78MTfQ

![](https://cdn-learn.adafruit.com/assets/assets/000/131/461/medium800thumb/lcds___displays_guide-loop.jpg?1721667156)

Build a BLE media controller for your iOS device with a 3.5in TFT touch screen and a Feather ESP32-S3 running CircuitPython. You can display your iOS media audio track and album information directly on the display.

## Touch Controller

You can control your media playback with buttons on the touch screen. Play/pause, change tracks, shuffle, repeat or adjust volume with a simple tap.

&nbsp;

![lcds___displays_hero-iPhone.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/430/medium640/lcds___displays_hero-iPhone.jpg?1721658827)

## ESP32-S3 BLE with CircuitPython

CircuitPython 9.1.0 introduces [Bluetooth connectivity for Espressif chips (ESP32 and ESP32-S3)](https://blog.adafruit.com/2024/07/10/circuitpython-9-1-0-released/). This project utilities BLE libraries for CircuitPython to connect and pair with iOS devices. Media controls allow you to play, pause, skip tracks and adjust volume on your iOS devices.

![lcds___displays_hero-stand-ESP32.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/432/medium640/lcds___displays_hero-stand-ESP32.jpg?1721658969)

## Desktop Stand

3D print a stand for the 3.5in TFT display. Use M2.5 nylon hardware to secure the display to the 3D printed stand.

![lcds___displays_hero-stand-angle.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/431/medium640/lcds___displays_hero-stand-angle.jpg?1721658899)

## Parts
### Adafruit ESP32-S3 Feather with STEMMA QT / Qwiic

[Adafruit ESP32-S3 Feather with STEMMA QT / Qwiic](https://www.adafruit.com/product/5323)
The ESP32-S3 has arrived in Feather format - and what a great way to get started with this powerful new chip from Espressif! With dual 240 MHz cores, WiFi and BLE support, and native USB, this Feather is great for powering your IoT projects.

That's right - it's the new...

In Stock
[Buy Now](https://www.adafruit.com/product/5323)
[Related Guides to the Product](https://learn.adafruit.com/products/5323/guides)
![Angled shot of rectangular microcontroller.](https://cdn-shop.adafruit.com/640x480/5323-06.jpg)

### Adafruit TFT FeatherWing - 3.5" 480x320 Touchscreen for Feathers

[Adafruit TFT FeatherWing - 3.5" 480x320 Touchscreen for Feathers](https://www.adafruit.com/product/3651)
Spice up your Feather project with a beautiful 3.5" touchscreen display shield with built in microSD card socket. This TFT display is 3.5" diagonal with a bright 6 white-LED backlight. You get a massive 480x320 pixels with individual 16-bit color pixel control. It has way more...

In Stock
[Buy Now](https://www.adafruit.com/product/3651)
[Related Guides to the Product](https://learn.adafruit.com/products/3651/guides)
![Overhead shot of a Black woman's hands with a blue and pinkish-red manicure drawing a heart on a touchscreen breakout.](https://cdn-shop.adafruit.com/640x480/3651-05.jpg)

### Black Nylon Machine Screw and Stand-off Set – M2.5 Thread

[Black Nylon Machine Screw and Stand-off Set – M2.5 Thread](https://www.adafruit.com/product/3299)
Totaling 380 pieces, this **M2.5 Screw Set** &nbsp;is a must-have for your workstation.&nbsp;You'll have enough screws, nuts, and hex standoffs to fuel your maker tendencies&nbsp;for days on end! M2.5 size screws fit almost all of the Adafruit breakout/dev board mounting holes...

In Stock
[Buy Now](https://www.adafruit.com/product/3299)
[Related Guides to the Product](https://learn.adafruit.com/products/3299/guides)
![Black Nylon Screw and Stand-off Set with M2.5 Threads, kit box](https://cdn-shop.adafruit.com/640x480/3299-00.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)

# ESP32-S3 BLE iOS Media Controller

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

Warning: 

Below are links to CircuitPython for the **Feather ESP32-S3 8MB No PSRAM** and the **Feather ESP32-S3 4MB Flash 2MB PSRAM.** Be sure to choose the one that matches your board.

[Download the latest version of CircuitPython for the Feather ESP32-S3 8MB Flash No PSRAM via circuitpython.org](https://circuitpython.org/board/adafruit_feather_esp32s3_nopsram/)
[Download the latest version of CircuitPython for the Feather ESP32-S3 4MB Flash 2MB PSRAM via circuitpython.org](https://circuitpython.org/board/adafruit_feather_esp32s3_4mbflash_2mbpsram/)
 **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)

![](https://cdn-learn.adafruit.com/assets/assets/000/110/824/medium800/adafruit_products_FESP3_reset_neopixel.jpg?1649969747)

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.

For this board, tap reset and wait for the LED to turn purple, and as soon as it turns purple, tap reset again. The second tap needs to happen while the LED is still purple.

If you do not see the LED turning purple, you will need to reinstall the UF2 bootloader. See the&nbsp; **Factory Reset** &nbsp;page in this guide for details.

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 **FTHRS3BOOT**.

&nbsp;

&nbsp;

Drag the **adafruit\_circuitpython\_etc.uf2** file to **FTHRS3BOOT**.

![adafruit_products_FESP3_FTHRS3BOOT.png](https://cdn-learn.adafruit.com/assets/assets/000/110/825/medium640/adafruit_products_FESP3_FTHRS3BOOT.png?1649970050)

![adafruit_products_FESP3_drag_UF2.png](https://cdn-learn.adafruit.com/assets/assets/000/110/826/medium640/adafruit_products_FESP3_drag_UF2.png?1649970057)

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)

# ESP32-S3 BLE iOS Media Controller

## Code the Media Controller

Once you've finished setting up your ESP32-S3 Feather 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.

https://github.com/adafruit/Adafruit_Learning_System_Guides/blob/main/ESP32-S3_BLE_iOS_Media/code.py

## Upload the Code, Font File, and Libraries to the ESP32-S3 Feather

After downloading the Project Bundle, plug your ESP32-S3 Feather 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 Feather's **CIRCUITPY** drive:

- **lib** folder
- **Arial-16.bdf**
- **code.py**

Your ESP32-S3 Feather **CIRCUITPY** drive should look like this after copying the **lib** folder, **Arial-16.bdf** font file and the **code.py** file.

![CIRCUITPY](https://adafruit.github.io/Adafruit_Learning_System_Guides/ESP32-S3_BLE_iOS_Media.png )

## How the CircuitPython Code Works

The code begins by initializing the display and I2C touch driver.

```python
# display
spi = board.SPI()
tft_cs = board.D9
tft_dc = board.D10
display_bus = fourwire.FourWire(spi, command=tft_dc, chip_select=tft_cs)
display = adafruit_hx8357.HX8357(display_bus, width=480, height=320)
# touch
i2c = board.I2C()
tsc = adafruit_tsc2007.TSC2007(i2c, invert_x=True, swap_xy=True)
splash = displayio.Group()
```

## Sending BLE Controls

The&nbsp;`ble_media_command()` function takes care of sending and receiving BLE messages to your Apple device. Whenever the function is called, the now playing information is updated for the text elements on the display.

```python
def ble_media_command(conn, command):
    gc.collect()
    # print("function started")
    if not conn.paired:
        print("trying to pair")
        conn.pair()
        print("paired")
    # print("connected, getting ready")
    ams = conn[AppleMediaService]
    # print(ams)
    tries = 10
    for i in range(tries):
        try:
            # print("sending..")
            if command != "refresh":
                command(ams)
            time.sleep(2)
            # print("sent")
            song_text = f"{ams.title}"
            song_text = "\n".join(wrap_text_to_lines(song_text, 29))
            song_label.text = song_text
            album_label.text = f"Album: {ams.album}"
            artist_label.text = f"Artist: {ams.artist}"
            app_label.text = f"App: {ams.player_name}"
            if ams.playing:
                buttons[0].label = "Pause"
            elif ams.paused:
                buttons[0].label = "Play"
        except Exception as error: # pylint: disable = broad-except
            print(error)
            # time.sleep(2)
            if i < tries - 1:
                continue
        break
    gc.collect()
```

## List of Commands

The&nbsp;`commands` list uses `lambda` to store the Apple Media Service control functions before the BLE connection is established.

```python
# commands
commands = [
    lambda ams: ams.toggle_play_pause(),
    lambda ams: ams.next_track(),
    lambda ams: ams.previous_track(),
    lambda ams: ams.advance_repeat_mode(),
    lambda ams: ams.advance_shuffle_mode(),
    lambda ams: ams.volume_up(),
    lambda ams: ams.volume_down(),
]
```

## Dictionary of Buttons

The functions are assigned to buttons in the&nbsp;`spots` dictionary. This allows each button to send an assigned BLE control in the loop alongside the `ble_media_command()` function. The button labels denote their function and associated BLE control.

The last button, `'Refresh'`, uses `None` as the color, making it transparent. If you touch the area of the screen that contains the now playing info, a call is made to only fetch the artist, media, album and app information.

```python
spots = [
    {'label': "Play/Pause", 'font': small_font,
     'pos': ((display.width // 2) - 60, display.height - 70),
     'size': (120, 60), 'color': RED,
     'control': lambda: ble_media_command(connection, commands[0])},
    {'label': ">>", 'font': small_font,
     'pos': ((display.width // 2) + 70, display.height - 70),
     'size': (60, 60), 'color': ORANGE,
     'control': lambda: ble_media_command(connection, commands[1])},
    {'label': "<<", 'font': small_font,
     'pos': ((display.width // 2) - 130, display.height - 70),
     'size': (60, 60), 'color': YELLOW,
     'control': lambda: ble_media_command(connection, commands[2])},
    {'label': "Repeat", 'font': terminalio.FONT,
     'pos': (10, 250), 'size': (60, 60), 'color': GREEN,
     'control': lambda: ble_media_command(connection, commands[3])},
    {'label': "Shuffle", 'font': terminalio.FONT,
     'pos': (410, 250), 'size': (60, 60), 'color': CYAN,
     'control': lambda: ble_media_command(connection, commands[4])},
    {'label': "Vol +", 'font': small_font, 'pos': (10, 10), 'size': (60, 120), 'color': BLUE,
     'control': lambda: ble_media_command(connection, commands[5])},
    {'label': "Vol -", 'font': small_font, 'pos': (410, 10), 'size': (60, 120), 'color': VIOLET,
     'control': lambda: ble_media_command(connection, commands[6])},
    {'label': "Refresh", 'font': small_font, 'pos': (70, 10), 'size': (340, display.height - 80),
     'color': None, 'control': lambda: ble_media_command(connection, "refresh")},
    ]
```

## Display Attributes

The buttons are instantiated with entries from the&nbsp;`spots` dictionary and then added to the `splash` display group and `buttons` array.

```python
buttons = []
for spot in spots:
    button = Button(x=spot['pos'][0], y=spot['pos'][1],
                    width=spot['size'][0], height=spot['size'][1],
                    label=spot['label'], label_font=spot['font'],
                    style=Button.ROUNDRECT,
                    fill_color=spot['color'],
                    name=spot['label'])
    splash.append(button)
    buttons.append(button)
```

Text labels are used for the `"Now Playing"` header and media title, artist title, album title and app name. They are centered on the display using `anchor_point` and `anchored_position`.

```python
header_label = label.Label(small_font, text="Now Playing:", color=WHITE)
header_label.anchor_point = (0.5, 0.0)
header_label.anchored_position = (display.width / 2, 10)
splash.append(header_label)

song_label = label.Label(small_font, text=" ", color=WHITE)
song_label.anchor_point = (0.5, 0.0)
song_label.anchored_position = (display.width / 2, 40)
splash.append(song_label)
artist_label = label.Label(small_font, text="Artist: ", color=WHITE)
artist_label.anchor_point = (0.5, 0.0)
artist_label.anchored_position = (display.width / 2, 124)
splash.append(artist_label)
album_label = label.Label(small_font, text="Album: ", color=WHITE)
album_label.anchor_point = (0.5, 0.0)
album_label.anchored_position = (display.width / 2, 154)
splash.append(album_label)
app_label = label.Label(small_font, text="App: ", color=WHITE)
app_label.anchor_point = (0.5, 0.0)
app_label.anchored_position = (display.width / 2, 184)
splash.append(app_label)
```

## Scaling Touch

The TSC2007 touch driver has a large range of touch coordinates that aren't necessarily tied to the display coordinates. The&nbsp;`scale_touch_coordinates()` function scales the TSC2007 coordinates so that they match the display coordinates.

```python
def scale_touch_coordinates(raw_x, raw_y):
    # raw coordinate ranges
    raw_x_min = 275
    raw_x_max = 3900
    raw_y_min = 487
    raw_y_max = 3800
    # scale the raw coordinates to display coordinates
    display_x = (raw_x - raw_x_min) * display.width / (raw_x_max - raw_x_min)
    display_y = (raw_y - raw_y_min) * display.height / (raw_y_max - raw_y_min)
    # clamp values to ensure they stay within display bounds
    display_x = max(0, min(display_x, display.width))
    display_y = max(0, min(display_y, display.height))
    return int(display_x), int(display_y)
```

## Ready for Takeoff

Right before the loop, the BLE connection is advertised and a connection is initialized.

```python
radio = adafruit_ble.BLERadio()  # pylint: disable=no-member
a = SolicitServicesAdvertisement()
a.solicited_services.append(AppleMediaService)
if not radio.connected:
    print("advertising")
    radio.start_advertising(a)
else:
    print("already connected")
    print(radio.connected)
print(gc.mem_free())
```

## The Loop

In the loop, if the touchscreen is touched, its coordinates are scaled to the display coordinates. If one of the buttons is touched, then the associated BLE command is sent with&nbsp;`spots[b]['control']()`. This is possible because `lambda` is used in both the `commands` array and the `'control'` entry of the `spots` dictionary.

If the BLE connection is lost, then the board tries to reconnect by advertising again.

```python
while True:
    while not radio.connected:
        pass
    known_notifications = set()
    while radio.connected:
        if tsc.touched and not touch_state:
            gc.collect()
            touch_state = True
            p = tsc.touch
            point = scale_touch_coordinates(p["x"], p["y"])
            connection = radio.connections[0]
            for button in buttons:
                b = buttons.index(button)
                if button.contains(point):
                    print(gc.mem_free())
                    print("Touched", button.name)
                    spots[b]['control']()
        if not tsc.touched and touch_state:
            touch_state = False
    print("disconnected")
    print("advertising")
    radio.start_advertising(a)
    print("reconnected")
```

# ESP32-S3 BLE iOS Media Controller

## CAD Files

## 3D Printed Parts

STL files for 3D printing are oriented to print "as-is" on FDM style machines. Parts are designed to 3D print without any support material using PLA filament. Original design source may be downloaded using the links below.

![lcds___displays_3d-stand-upright.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/453/medium640/lcds___displays_3d-stand-upright.jpg?1721662977)

![lcds___displays_3d-stand-.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/454/medium640/lcds___displays_3d-stand-.jpg?1721662985)

[Download CAD Source Files](https://cdn-learn.adafruit.com/assets/assets/000/131/465/original/Stand_CAD.zip?1721669962)
[Download STLs.zip](https://cdn-learn.adafruit.com/assets/assets/000/131/466/original/STLs.zip?1721669984)
## Build Volume

The parts require a 3D printer with a minimum build volume.

- 96mm (X) x 74mm (Y) x 94mm (Z)

![lcds___displays_cura-slice.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/338/medium640/lcds___displays_cura-slice.jpg?1721333671)

## CAD Assembly

The Feather ESP32-S3 plugs into the socket headers on the back of the 3.5in TFT FeatherWing. M2.5 standoffs are secured to the mounting tabs on the TFT FeatherWing with M2.5 x 6mm long screws. The M2.5 standoffs are secured to the mounting holes on the stand using hex nuts.

![lcds___displays_cad.gif](https://cdn-learn.adafruit.com/assets/assets/000/131/474/medium640thumb/lcds___displays_cad.jpg?1721754299)

## Design Source Files

The project assembly was designed in Fusion 360. This can be downloaded 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/).

![lcds___displays_PCB-component.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/339/medium640/lcds___displays_PCB-component.jpg?1721334052)

# ESP32-S3 BLE iOS Media Controller

## Assembly

## Feather Headers

Use a 1x12 and 1x16 male header pins for the Feather ESP32-S3.

A breadboard can help to keep the headers straight while soldering.

Solder all of the male header pins to the Feather ESP32-S3.

![lcds___displays_feather-headers-install.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/443/medium640/lcds___displays_feather-headers-install.jpg?1721662709)

## Install Feather to TFT Display

Orient the Feather with the 3.5in TFT FeatherWing so the pins line up properly.

Firmly press the pins into the TFT FeatherWing's socket headers.

![lcds___displays_tft-feather-install.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/444/medium640/lcds___displays_tft-feather-install.jpg?1721662823)

## Hardware

Use the following hardware to secure the 3.5in TFT FeahterWing to the 3D printed stand.

- 4x M2.5 x 6mm long screws
- 4x M2.5 x 6mm long M-F hex standoffs
- 4x M2.5 hex nuts

![lcds___displays_hardware.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/445/medium640/lcds___displays_hardware.jpg?1721662834)

## Install Hardware to TFT Display

Insert the M2.5 x 6mm long screws through the four mounting tabs on the TFT Display.

Insert and fasten the four M2.5 standoffs onto the screws.

Repeat the hardware installation for the four mounting tabs.

![lcds___displays_tft-standoff-install.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/446/medium640/lcds___displays_tft-standoff-install.jpg?1721662847)

![lcds___displays_tft-standoffs-installed.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/447/medium640/lcds___displays_tft-standoffs-installed.jpg?1721662857)

## Install TFT to Stand

Orient the TFT display with the 3D printed stand so the USB-C port is pointing in the correct direction.

Press the screws from the standoffs through the four mounting holes on the 3D printed stand.

![lcds___displays_tft-stand-installing.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/448/medium640/lcds___displays_tft-stand-installing.jpg?1721662870)

![lcds___displays_tft-stand-install.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/449/medium640/lcds___displays_tft-stand-install.jpg?1721662882)

## Secure TFT to Stand

Insert and fasten the M2.5 hex nuts onto the standoffs to secure the TFT display to the 3D printed stand.

![lcds___displays_tft-stand-secure.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/450/medium640/lcds___displays_tft-stand-secure.jpg?1721662893)

![lcds___displays_tft-stand-secured.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/451/medium640/lcds___displays_tft-stand-secured.jpg?1721662903)

## USB Power

Connect the Feather ESP32-S3 to a 5V 1A power supply to power on the device.

Congratulations on your build!

![lcds___displays_usb-power.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/452/medium640/lcds___displays_usb-power.jpg?1721662916)

# ESP32-S3 BLE iOS Media Controller

## Usage

## iOS Bluetooth Devices

To connect to the Feather ESP32-S3 on an iOS device, go to the Setting app and tab on Bluetooth.

Search under the OTHER DEVICES category for a device named CIRCUITPYxxx and tap to start the connection process.

![lcds___displays_iOS-bluetooth-device-list.png](https://cdn-learn.adafruit.com/assets/assets/000/131/456/medium640/lcds___displays_iOS-bluetooth-device-list.png?1721663844)

## Pairing with Bluetooth

Once the connection has ben established, tap on the Pair button in the Bluetooth Pairing Request dialog.

![lcds___displays_iOS-bluetooth-pair-request.png](https://cdn-learn.adafruit.com/assets/assets/000/131/457/medium640/lcds___displays_iOS-bluetooth-pair-request.png?1721663945)

## Connected Bluetooth Device

The CIRCUITPY device will now be connected to your iOS device.

To disconnect&nbsp; the Feather ESP32-S3 from your iOS device, you can tap on the info icon next to the device name and then tap on the Forget This Device button.

![lcds___displays_iOS-circuitpython-connected.png](https://cdn-learn.adafruit.com/assets/assets/000/131/458/medium640/lcds___displays_iOS-circuitpython-connected.png?1721664039)

## Using the Interface

Start by playing music or a podcast from your preferred app on your iOS device.

The audio title will be displayed in the Now Playing area on the TFT.

- Tap **Vol+** and **Vol–** &nbsp;to adjust the volume.
- Tap **Play/Pause** to play or pause the current audio.
- Tap **Repeat** to enable repeat mode.
- Tap **Shuffle** to enable shuffle mode.
- Tap **\>\>** or **\<\<** to skip track and play the previous track.

![lcds___displays_hero-TFT.jpg](https://cdn-learn.adafruit.com/assets/assets/000/131/459/medium640/lcds___displays_hero-TFT.jpg?1721664186)


## Featured Products

### Adafruit ESP32-S3 Feather with STEMMA QT / Qwiic

[Adafruit ESP32-S3 Feather with STEMMA QT / Qwiic](https://www.adafruit.com/product/5323)
The ESP32-S3 has arrived in Feather format - and what a great way to get started with this powerful new chip from Espressif! With dual 240 MHz cores, WiFi and BLE support, and native USB, this Feather is great for powering your IoT projects.

That's right - it's the new...

In Stock
[Buy Now](https://www.adafruit.com/product/5323)
[Related Guides to the Product](https://learn.adafruit.com/products/5323/guides)
### Adafruit TFT FeatherWing - 3.5" 480x320 Touchscreen for Feathers

[Adafruit TFT FeatherWing - 3.5" 480x320 Touchscreen for Feathers](https://www.adafruit.com/product/3651)
Spice up your Feather project with a beautiful 3.5" touchscreen display shield with built in microSD card socket. This TFT display is 3.5" diagonal with a bright 6 white-LED backlight. You get a massive 480x320 pixels with individual 16-bit color pixel control. It has way more...

In Stock
[Buy Now](https://www.adafruit.com/product/3651)
[Related Guides to the Product](https://learn.adafruit.com/products/3651/guides)
### Black Nylon Machine Screw and Stand-off Set – M2.5 Thread

[Black Nylon Machine Screw and Stand-off Set – M2.5 Thread](https://www.adafruit.com/product/3299)
Totaling 380 pieces, this **M2.5 Screw Set** &nbsp;is a must-have for your workstation.&nbsp;You'll have enough screws, nuts, and hex standoffs to fuel your maker tendencies&nbsp;for days on end! M2.5 size screws fit almost all of the Adafruit breakout/dev board mounting holes...

In Stock
[Buy Now](https://www.adafruit.com/product/3299)
[Related Guides to the Product](https://learn.adafruit.com/products/3299/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 3.5" 480x320 TFT FeatherWing](https://learn.adafruit.com/adafruit-3-5-tft-featherwing.md)
- [Adafruit ESP32-S3 Feather](https://learn.adafruit.com/adafruit-esp32-s3-feather.md)
- [Using LittlevGL with Adafruit Displays](https://learn.adafruit.com/using-littlevgl-with-adafruit-displays.md)
- [Ninja Timer: Giant 7-Segment Display](https://learn.adafruit.com/ninja-timer-giant-7-segment-display.md)
- [TFT Spirit Board](https://learn.adafruit.com/tft-spirit-board.md)
- [Raspberry Pi Zero Stand](https://learn.adafruit.com/raspberry-pi-zero-stand.md)
- [Remote Control Candy Dispenser Ghost](https://learn.adafruit.com/ble-claw.md)
- [32x32 Square Pixel Art Animation Display](https://learn.adafruit.com/32x32-square-pixel-display.md)
- [Remote Effects Trigger Box](https://learn.adafruit.com/remote-effects-trigger.md)
- [BrainCraft Camera Case](https://learn.adafruit.com/braincraft-camera-case.md)
- [Grill Thermometer Dashboard](https://learn.adafruit.com/grill-thermometer-dashboard.md)
- [Square NeoPixel Display with Black LED Acrylic](https://learn.adafruit.com/sqaure-neopixel-display-with-black-led-acrylic.md)
- [Walkmp3rson: Personal MP3 'Tape' Player](https://learn.adafruit.com/walkmp3rson-personal-mp3-tape-player.md)
- [Using the CircuitPython Extension for Visual Studio Code](https://learn.adafruit.com/using-the-circuitpython-extension-for-visual-studio-code.md)
- [Party Parrot Zoetrope](https://learn.adafruit.com/party-parrot-zoetrope.md)
- [Solderless Robot Toy Xylophone](https://learn.adafruit.com/solderless-robot-toy-xylophone.md)
- [MP3 Playback in CircuitPython with Lars the Sloth Puppet](https://learn.adafruit.com/mp3-circuitpython-lars.md)
