Notes · ESP32 · MicroPython
MicroPython 1.29 on the ESP32-C5: dual-band Wi-Fi with Thonny
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
- An ESP32-C5 board with at least 4 MB of flash. The Espressif ESP32-C5-DevKitC is the reference board, and the XIAO ESP32C5 now has its own firmware too.
- A USB data cable, not a charge-only one!
- Thonny installed on your computer (thonny.org).
- The MicroPython firmware file. Go to micropython.org/download/ESP32_GENERIC_C5 and download the v1.29.0
.binfile.
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
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.
- Plug in the board and open Thonny.
- Go to Tools → Open system shell…
- Erase the flash. Do this the first time you put MicroPython on a board:
python -m esptool --port COM4 erase_flash - 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
- Go to Tools → Options → Interpreter.
- Choose MicroPython (ESP32) and select your board's port.
- 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.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.
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
- Flash address: 0x2000 for the C5. This is the number one reason a freshly flashed C5 won't boot.
- Timers were reworked in 1.29. The esp32 port's
machine.Timernow runs on Espressif's GPTimer and ESP Timer, andmachine.Timer(-1)gives you a virtual (software) timer. Keep timer callbacks short and simple either way. - XIAO ESP32C5 antenna. The FPC antenna supplied with the XIAO is 2.4 GHz only. Fit a dual-band (2.4/5 GHz) antenna to its U.FL socket before you go looking for 5 GHz networks.
- XIAO ESP32C5 strapping pins. D2 (GPIO25) and D3 (GPIO7) are sampled at power-up. Check them in the pin planner before you wire anything to them.
- 5 GHz range. 5 GHz is faster and less crowded, but it doesn't go through walls as well as 2.4 GHz. For a sensor in the back shed, 2.4 GHz may still be the better choice.
- Preview builds. micropython.org also offers v1.30 preview builds. Stick with v1.29.0 for anything you want to be reliable.
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
- MicroPython ESP32-C5 firmware micropython.org
- MicroPython v1.29.0 release notes GitHub
- Thonny thonny.org
- Pin planner, set up for the XIAO ESP32C5 AP Design Labs