Seeed Studio XIAO ESP32-C5 与 Micropython
MicroPython 是一个支持原生代码生成的 Python 解释器,用于性能关键代码。它提供了 Python 3.6+ 核心功能的子集,针对微控制器和资源受限系统进行了优化。它与 CPython 不同,您可以在 MicroPython vs CPython differences 页面中了解更多差异。
在 XIAO ESP32-C5 上使用 MicroPython
接下来,我将指导您如何在 XIAO ESP32-C5 上使用 MicroPython,并使用 Thonny IDE 进行编程,基于 Windows 操作系统。
硬件准备
开始之前,您需要准备一块 XIAO ESP32-C5 开发板。
| Seeed Studio XIAO ESP32-C5 |
|---|
![]() |
部署 MicroPython 固件
接下来,我们将指导您如何在 XIAO ESP32-C5 上部署 MicroPython 固件。
安装 esptool
在为 ESP32-C5 安装 MicroPython 固件之前,您需要先安装 esptool。我们将使用 esptool.py 来擦除和烧录固件到开发板上。
在任意文件夹中打开终端并输入以下命令。
pip install esptool

擦除
在 Windows 操作系统上,安装的程序可能已从 esptool.py 重命名为 esptool。
如果您是第一次在 XIAO ESP32-C5 上安装 MicroPython,请使用以下命令先擦除 Flash。
esptool.py eraase_flash
esptool.py 将尝试自动检测带有 ESP32 的串口。

但如果检测失败或您的计算机上可能连接了多个基于 Espressif 的设备,则请使用 --port 选项传递目标串口的名称。例如:
esptool.py --port PORTNAME erase_flash

烧录
步骤 1. 点击链接,选择适合的 ESP32-C5 MicroPython 固件版本进行下载,这里选择 v1.27.0 版本。ESP32_GENERIC_C5 MicroPython

步骤 2. 将固件部署到开发板,从地址 0x2000 开始。
为了避免丢失固件文件,建议您将下载的 MicroPython 固件放在单独的文件夹中,然后在此文件夹中右键打开终端。

输入以下命令并将 ESP32_BOARD_NAME-DATE-VERSION.bin 替换为 ESP32_GENERIC_C5-20251209-v1.27.0.bin。
esptool.py --baud 460800 write_flash 0x2000 ESP32_BOARD_NAME-DATE-VERSION.bin

如果 esptool.py 无法自动检测串口,则可以在命令行中明确传递串口。
esptool.py --port PORTNAME --baud 460800 write_flash 0x2000 ESP32_BOARD_NAME-DATE-VERSION.bin
- 在 Windows 上,端口名称通常类似于
COM4。 - 在 Linux 上,端口名称通常类似于
/dev/ttyUSB或/dev/ttyACM0。 - 在 Mac 上,端口名称通常类似于
/dev/cu.usbmodem01。

如果烧录开始后中途失败,请尝试移除 --baud 460800 选项以使用较慢的默认速度进行烧录。
安装 Thonny IDE
选择适合的版本进行安装。这里我在 Windows 系统上安装,所以选择了 Windows 版本。
按照所需 Python 版本的说明进行操作。

然后,只需按照默认步骤进行配置即可。
LED 闪烁示例
这里我们将向您展示如何使用 MicroPython 和 Thonny IDE 点亮 XIAO ESP32-C5 上的 L LED。
步骤 1. 解释器配置
- 打开 Thonny IDE,然后点击界面右下角的 Configure interpreter 选项。选择 MicroPython (generic) 和端口

连接成功后,下方的 shell 窗口将输出 MicroPython 固件版本信息。

步骤 2. 新建 led_blink.py 文件
- 点击左上角的 File -> New 创建新文件,然后按 Ctrl + S 将其命名为 led_blink 并保存到您的计算机。


- 点击左上角的 View -> Files 进行勾选(旁边会出现 √),左侧将显示一个显示您存储文件位置的窗口。


步骤 3. 编写示例代码
对于 XIAO ESP32-C5 上的 L LED,对应的引脚是 GPIO27,它通过低电平信号点亮。
- 将示例代码复制到
led_blink.py文件中。
from machine import Pin
import time
# Define GPIO27
led = Pin(27, Pin.OUT)
while True:
# Low-level illumination
led.value(0)
print("LED ON")
time.sleep(1) # Wait for 1 second
# High-level extinction
led.value(1)
print("LED OFF")
time.sleep(1)
步骤 4. 运行代码
- 点击右上角显示的图标或按 F5 运行代码,LED 信息将被打印出来。

- 板载 L LED 将以 1 秒间隔闪烁。

5 GHz Wi-Fi 连接示例
XIAO ESP-C5 支持 2.4 GHz 和 5 GHz 双频 Wi-Fi 6。此示例将演示连接到 5 GHz Wi-Fi 网络的效果。
- 创建一个名为
wifi_connect.py的新文件,并将以下示例代码复制到其中。
import network
import time
def connect_wifi(ssid, password):
# Create a Station interface (STA_IF = client mode, connects to a router/AP)
wlan = network.WLAN(network.STA_IF)
# If already connected, return immediately
if wlan.isconnected():
print("Already connected before, skipping connection step.")
print("Network config:", wlan.ifconfig())
return True
# Enable the Wi-Fi interface
wlan.active(True)
print(f"Connecting to network: {ssid} ...")
wlan.connect(ssid, password)
# Wait for connection with a timeout (e.g., 10 seconds)
max_wait = 10
while max_wait > 0:
if wlan.isconnected():
break
max_wait -= 1
print("Waiting for connection...")
time.sleep(1)
# Check connection result
if wlan.isconnected():
print("Connected successfully!")
print("Network config (IP/Mask/Gateway/DNS):", wlan.ifconfig())
# led.value(0) # If you want to turn on an LED after connection succeeds, add code here
return True
else:
print("Connection failed. Please check SSID or password.")
return False
# ==========================================
# Main Program
# ==========================================
# Fill in your Wi-Fi SSID and password here
SSID = "YourWiFiName"
PASSWORD = "YourWiFiPassword"
# Call the function
connect_wifi(SSID, PASSWORD)
- 在您的环境中输入 5GHz WiFi 的 SSID 和 PASSWORD,然后运行代码,连接信息将被打印出来。
在运行新的示例代码之前,您需要点击左上角的 Stop 图标或按 Ctrl + F2 退出之前的运行环境。


这证明了 XIAO ESP32-C5 连接到 5GHz WiFi 网络是可行的。
BLE 示例
此示例将向您展示 XIAO ESP32-C5 的 BLE 功能,并演示如何使用 nRF Connect App 发现并连接到它。
- 创建一个名为
BLE_connect.py的新文件,并将以下示例代码复制到其中。
BLE 连接参考代码
import bluetooth
import random
import struct
import time
from machine import Pin
from micropython import const
# --- Configuration ---
# Define the LED pin (Using GPIO 27 as per your previous request)
# Active LOW: 0 = On, 1 = Off
LED_PIN = 27
DEVICE_NAME = "XIAO ESP32-C5-BLE"
# --- BLE Constants (UUIDs) ---
# We use standard UUIDs for simplicity, but you can use 128-bit custom UUIDs.
# 0x181A is "Environmental Sensing" Service
_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)
_FLAG_READ = const(0x0002)
_FLAG_WRITE = const(0x0008)
_FLAG_NOTIFY = const(0x0010)
# Define a Service with one Characteristic (Read/Write/Notify)
# Service UUID: 0x181A
# Characteristic UUID: 0x2A6E (Temperature - just as an example)
_UART_UUID = bluetooth.UUID(0x181A)
_UART_TX = (
bluetooth.UUID(0x2A6E),
_FLAG_READ | _FLAG_WRITE | _FLAG_NOTIFY,
)
_UART_SERVICE = (
_UART_UUID,
(_UART_TX,),
)
# --- Helper: Advertising Payload Generator ---
def advertising_payload(limited_disc=False, br_edr=False, name=None, services=None, appearance=0):
payload = bytearray()
def _append(adv_type, value):
nonlocal payload
payload += struct.pack("BB", len(value) + 1, adv_type) + value
_append(
0x01, # Flags
struct.pack("B", (0x02 if not limited_disc else 0x01) | (0x04 if not br_edr else 0x00)),
)
if name:
_append(0x09, name) # Complete Local Name
if services:
for uuid in services:
b = bytes(uuid)
if len(b) == 2:
_append(0x03, b) # 16-bit Service Class UUIDs
elif len(b) == 16:
_append(0x06, b) # 128-bit Service Class UUIDs
if appearance:
_append(0x19, struct.pack("<h", appearance))
return payload
# --- BLE Class ---
class BLEPeripheral:
def __init__(self, ble, name="ESP32"):
self._ble = ble
self._ble.active(True)
self._ble.irq(self._irq)
# Register services
((self._handle_tx,),) = self._ble.gatts_register_services((_UART_SERVICE,))
self._connections = set()
self._payload = advertising_payload(name=name, services=[_UART_UUID])
# Initialize LED
self._led = Pin(LED_PIN, Pin.OUT)
self._led.value(1) # Turn OFF initially (High)
self._advertise()
print(f"BLE Active. Device Name: {name}")
def _irq(self, event, data):
# Track connections so we can send notifications
if event == _IRQ_CENTRAL_CONNECT:
conn_handle, _, _ = data
print(f"New connection: {conn_handle}")
self._connections.add(conn_handle)
self._led.value(0) # Turn LED ON (Active Low)
elif event == _IRQ_CENTRAL_DISCONNECT:
conn_handle, _, _ = data
print(f"Disconnected: {conn_handle}")
self._connections.remove(conn_handle)
self._led.value(1) # Turn LED OFF
# Start advertising again to allow new connections
self._advertise()
elif event == _IRQ_GATTS_WRITE:
conn_handle, value_handle = data
value = self._ble.gatts_read(value_handle)
if value_handle == self._handle_tx:
print(f"Received write request: {value}")
# You can parse 'value' here to control hardware
def update_value(self, data):
# Write the local value to the handle
self._ble.gatts_write(self._handle_tx, data)
# Notify all connected centrals
for conn_handle in self._connections:
self._ble.gatts_notify(conn_handle, self._handle_tx, data)
def _advertise(self):
self._ble.gap_advertise(100, adv_data=self._payload)
print("Advertising...")
# --- Main Execution ---
def demo():
ble = bluetooth.BLE()
p = BLEPeripheral(ble, name=DEVICE_NAME)
counter = 0
try:
while True:
# Only update value if connected, to save power/cpu (optional)
if p._connections:
# Create a string data: "Count: 1", "Count: 2"...
data_str = f"Count: {counter}"
print(f"Sending notification: {data_str}")
# Send data (must be bytes)
p.update_value(data_str.encode('utf-8'))
counter += 1
time.sleep(2) # Wait 2 seconds
except KeyboardInterrupt:
print("Stopping...")
ble.active(False)
if __name__ == "__main__":
demo()
- 然后运行代码,在您的手机上打开 nRF Connect 应用,您将发现名为 XIAO ESP32-C5-BLE 的设备。连接成功后,板载 L LED 将点亮,同时传输计数信息也将被打印出来。



恭喜!完成上述所有示例后,我们相信您已经掌握了如何使用 Thonny IDE 在 XIAO ESP32-C5 上使用 MicroPython 开发项目。我们期待看到您更多的创作!
技术支持与产品讨论
感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。
