← All notes

Notes · ESP32 · MicroPython

MicroPython 1.29 on the ESP32-C5: dual-band Wi-Fi with Thonny

28 Sep 20266 min read

Why this release matters

MicroPython v1.29.0 landed on 24 August 2026, and for anyone with an ESP32-C5 on the bench it's the release that makes the chip properly usable. Support for the C5 (and the ESP32-P4) first arrived in v1.27. Version 1.29 builds on that: the generic C5 firmware now supports PSRAM, and there's a new board definition for Seeed's XIAO ESP32C5.

The C5 is the chip I'm most excited about. It's a RISC-V chip, and it's Espressif's first to do dual-band Wi-Fi 6 on both 2.4 GHz and 5 GHz. Every ESP32 most of us have used so far lives only on the crowded 2.4 GHz band. The C5 lets your projects hop onto 5 GHz, which is usually quieter.

The P4 is a different beast. It's a high-performance chip with no radio of its own. It can run standalone, or pair with an ESP32-C5 or ESP32-C6 acting as its wireless co-processor, and MicroPython has ready-made board profiles for all of these setups.

In this note we'll get MicroPython 1.29 onto an ESP32-C5 using Thonny, then write a short script that scans your Wi-Fi and shows which networks are on which band.

What you'll need

The generic firmware auto-detects PSRAM at startup, so the same file works whether or not your board has it.

Step 1: Flash MicroPython 1.29

One gotcha first: the flash address

The ESP32-C5 firmware goes to address 0x2000. Get this wrong and the board won't boot.

Original ESP32
0x1000
ESP32-S3, C3, C6
0x0
ESP32-C5
0x2000

Thonny bundles esptool, so you can flash straight from Thonny without installing anything else.

  1. Plug in the board and open Thonny.
  2. Go to Tools → Open system shell…
  3. Erase the flash. Do this the first time you put MicroPython on a board:
    python -m esptool --port COM4 erase_flash
  4. Write the firmware at 0x2000:
    python -m esptool --port COM4 --baud 460800 write_flash 0x2000 ESP32_GENERIC_C5-20260824-v1.29.0.bin

Replace COM4 with your port. On a Mac it looks like /dev/cu.usbmodem01, and on Linux /dev/ttyACM0. Run the command from the folder where you saved the .bin, or give its full path.

Tip: if flashing starts then fails partway through, drop the --baud 460800 part and try again at the slower default speed.

You can also try Thonny's built-in installer (Tools → Options → Interpreter → Install or update MicroPython (esptool)). If your Thonny version doesn't list the C5 yet, the system shell method above always works.

Step 2: Connect Thonny to the board

  1. Go to Tools → Options → Interpreter.
  2. Choose MicroPython (ESP32) and select your board's port.
  3. Click OK, then press the red Stop/Restart button.

You should see something like this in the Shell:

MicroPython v1.29.0 on 2026-08-24; ESP32C5 module with ESP32C5
>>>

If so, you're in business.

Step 3: Scan for 2.4 GHz and 5 GHz networks

Here's the fun part. A Wi-Fi scan in MicroPython returns the channel number for each network. Channels 1–14 are 2.4 GHz, and anything higher (36, 44, 149 and so on) is 5 GHz. That lets us sort networks by band with no special libraries.

Create a new file in Thonny, paste this in, and run it:

wifi_band_scan.pyDownload
# wifi_band_scan.py
# AP Design Labs - ESP32-C5 dual-band Wi-Fi scanner
# MicroPython v1.29 / Thonny

import network
import time


def band_for(channel):
    # Channels 1-14 are 2.4 GHz, higher numbers are 5 GHz
    return "5 GHz" if channel > 14 else "2.4 GHz"


def signal_bars(rssi):
    # Turn RSSI (dBm) into a simple 0-4 bar display
    if rssi >= -55:
        return "####"
    elif rssi >= -65:
        return "### "
    elif rssi >= -75:
        return "##  "
    elif rssi >= -85:
        return "#   "
    return "    "


def ssid_text(raw):
    try:
        name = raw.decode()
    except UnicodeError:
        name = "?"
    return name if name else "(hidden)"


wlan = network.WLAN(network.STA_IF)
wlan.active(True)
time.sleep(1)

print("Scanning...")
networks = wlan.scan()

# Strongest signal first
networks.sort(key=lambda n: n[3], reverse=True)

count = {"2.4 GHz": 0, "5 GHz": 0}

print()
print("{:<24} {:>4}  {:<8} {:>5}  {}".format(
    "SSID", "CH", "BAND", "RSSI", "SIGNAL"))
print("-" * 56)

for ssid, bssid, channel, rssi, security, hidden in networks:
    band = band_for(channel)
    count[band] += 1
    print("{:<24} {:>4}  {:<8} {:>5}  {}".format(
        ssid_text(ssid)[:24], channel, band, rssi, signal_bars(rssi)))

print()
print("2.4 GHz networks:", count["2.4 GHz"])
print("5 GHz networks:  ", count["5 GHz"])

In my case the output showed the usual pile-up of neighbours on 2.4 GHz channels 1, 6 and 11, and far fewer networks on 5 GHz. That's exactly why 5 GHz support is useful: less congestion for your projects.

Try this

Run the same script on an older ESP32 or an ESP32-S3. You'll only ever see 2.4 GHz networks, because those chips can't hear 5 GHz at all.

Gotchas and notes

What's next

Next up, I'll connect the C5 to a 5 GHz network and compare real-world transfer speed against 2.4 GHz. After that, I'd like to try the ESP32-P4 with a C6 co-processor and see what that combination can do in MicroPython.

Have you got a C5 on your bench yet? Let me know what you're building with it: .

Links

#ESP32C5#MicroPython#Thonny#WiFi6#5GHz