第2节 基础知识
本节将带你进一步了解 MicroPython,并熟悉 Thonny IDE 的用法。
本教程的核心逻辑适用于所有 ESP32 开发板,但所有操作步骤均以 微雪 ESP32-S3-Zero 迷你开发板 为例进行讲解。如果您使用其他型号的开发板,请根据实际情况修改相应设置。
1. Thonny 的文件视图
在嵌入式开发过程中,经常需要在“计算机本地”和“ESP32 设备”之间进行文件传输与管理。Thonny 提供了可视化的文件视图功能来实现此操作。
-
开启文件视图:打开 Thonny,在顶部菜单栏选择
视图->文件。
-
界面布局:此时左侧栏会出现两个区域:

-
上部 (本地文件):显示计算机本地存储的文件。
-
下部 (MicroPython 设备):显示 ESP32 内部存储空间的文件。
初始文件在新烧录固件的 ESP32 中,通常存在一个名为
boot.py的文件。这是系统自动生成的引导脚本。
-
2. 两种代码运行模式
MicroPython 提供了两种不同的代码运行方式,交互式运行(REPL)和脚本式运行。
2.1 交互式运行 (REPL)
REPL (Read-Eval-Print Loop) 允许用户在 Thonny 界面底部的 Shell 窗口中直接输入代码,按下回车键即可执行。
- 特点:执行结果即时反馈。
- 适用场景:测试简短的命令、查询变量值、检查硬件连接状态(例如扫描 I2C 设备地址)。
- 缺点:输入的代码无法保存,设备断电或重启后即丢失。
将以下代码复制到 Shell 窗口中,或逐行输入并回车:
import sys
import machine
freq = machine.freq() / 1000000
print(f"Device Info: {sys.platform}\nCPU Freq: {freq} MHz")
Shell 窗口将输出当前设备的平台名称以及 CPU 的工作频率。

2.2 脚本式运行
脚本式运行是开发复杂程序的标准方式。需在编辑器区域编写完整的代码文件,保存后发送给 ESP32 执行。
-
编写代码:在编辑器中输入以下测试代码。该程序将打印设备信息,并每秒输出一次累加计数。
import sys
import machine
import time
# 获取并打印 CPU 频率 (单位转换为 MHz)
freq = machine.freq() / 1000000
print(f"Device Info: {sys.platform}\nCPU Freq: {freq} MHz")
count = 0
while True:
# 打印当前计数值
print(f"Hello World! {count}")
count += 1
# 延时 1 秒
time.sleep(1) -
运行脚本:点击工具栏绿色的
运行按钮(或按 F5)。
-
观察现象:底部的 Shell 窗口将开始输出设备信息及循环计数。
如何停止程序?由于上面的代码中包含
while True死循环,Shell 会被一直占用,导致无法进行保存文件等其他操作。要停止程序,请点击工具栏红色的停止按钮,或在 Shell 中按 Ctrl + C。

强制中断可能会导致 Shell 抛出
KeyboardInterrupt错误。为实现更健壮的退出处理,可以使用 try-except 结构包裹主逻辑捕捉异常:import sys
import machine
import time
# 获取并打印 CPU 频率 (单位转换为 MHz)
freq = machine.freq() / 1000000
print(f"Device Info: {sys.platform}\nCPU Freq: {freq} MHz")
count = 0
try:
while True:
# 打印当前计数值
print(f"Hello World! {count}")
count += 1
# 延时 1 秒
time.sleep(1)
except KeyboardInterrupt:
# 当检测到键盘中断(CTRL+C)时执行此块代码
print("Exit") -
保存代码:将代码保存到 ESP32 中,以便后续使用。
-
停止程序,然后点击工具栏的
保存按钮(或按 Ctrl + S)。
-
系统将提示选择保存位置,选择 MicroPython 设备。

-
然后输入文件名(例如
test_print.py)并点击确认。
-
保存后,可在左侧文件视图的 MicroPython 设备区域看到
test_print.py。
-
3. ESP32 的启动机制
在上一步的操作中,代码虽然已保存到设备,但在拔掉 USB 线重新上电后,程序不会自动运行。这是由 MicroPython 的启动规则决定的。ESP32 上电复位后,会依次经历以下几个阶段:
3.1 boot.py (引导脚本)
- 优先级:系统启动后运行。
- 用途:通常用于配置系统底层参数,如配置 USB 连接模式、建立网络连接等。
- 建议:建议初学者保留默认设置,随意修改可能导致系统无法启动。
3.2 main.py (主程序)
- 优先级:在
boot.py执行完毕后运行。 - 用途:存放用户编写的应用程序代码。
- 关键点:只有名为
main.py的文件才会在上电后自动运行。 其他名称的脚本(如test_print.py)仅作为普通文件存储,不会自动执行。
3.3 交互式解释器 (REPL)
如果未找到 main.py ,或者 main.py 执行结束,MicroPython 将进入交互式解释器模式(REPL)。
-
在
boot.py和main.py中设置的全局变量仍将在 REPL 有效。 -
REPL 会继续执行,直到触发硬重置或软重置。
4 示例:自动运行脚本
若希望程序在脱机状态(仅连接电池或电源)下自动运行,需将脚本命名为 main.py。
-
定位文件:在 Thonny 左下角的
MicroPython 设备区域,双击打开上一步保存test_print.py。 -
另存为 main.py:在 Thonny 菜单栏点击
文件-保存为副本,选择保存到MicroPython 设备, 并将文件名设置为main.py。


-
验证:在 Shell 窗口按下 Ctrl + D (软重启) 验证
main.py是否在设备重启后自动运行。
为什么需要按 Ctrl+D ?当 Thonny 与 ESP32 建立连接时,默认会发送中断信号,停止当前运行的程序并进入 REPL 模式。(此行为可在设置中更改)

这意味着即使 ESP32 上电后自动运行了
main.py,一旦被 Thonny 连接,程序也会立即停止,导致 Shell 窗口无输出。在 REPL 中按下 Ctrl + D(软复位)可以让 MicroPython 解释器在保持 Thonny 连接状态下重新启动,这样就能在 Shell 窗口中完整观察
main.py从头开始的运行过程。
5. 上传文件
在开发过程中,若需使用外部驱动库(如 OLED 屏幕、温湿度传感器)时,通常需要使用外部库文件(.py 文件)。
将电脑上的库文件传输到 ESP32 的步骤如下:
-
在左上侧(本地文件)找到目标文件(例如
ssd1327.py)。 -
右键点击该文件,选择
上传到 /。
-
文件将被复制到 ESP32 的文件系统中。随后就可以在代码中通过
import ssd1327来使用它了。
6. 常用内置模块概览
MicroPython 在 ESP32 上提供了一系列与硬件相关的内置模块。以下是常用模块的简要说明:
6.1 machine 模块
machine 模块提供访问底层硬件的接口,是控制外设的核心模块:
machine.Pin:控制 GPIO 输入输出;machine.ADC:模拟信号采集;machine.PWM:输出 PWM 信号;machine.UART:串口通信;machine.I2C:I2C 总线;machine.SPI:SPI 总线;machine.Timer:定时器;machine.RTC:实时时钟。
例如,在 REPL 中查看当前 CPU 频率:
import machine
print(machine.freq()) # 查看 CPU 主频
6.2 time 模块
time(在旧版或部分固件中也称为 utime,但 u- 前缀的命名方式未来将被移除)模块提供延时和时间计数功能:
import time
time.sleep(1) # 延时 1 秒
time.sleep_ms(500) # 延时 500 毫秒
time.sleep_us(100) # 延时 100 微秒
print(time.ticks_ms()) # 返回自上电以来的毫秒计数
6.3 network 和 bluetooth 模块
network 和 bluetooth 模块用于配置 Wi-Fi 和蓝牙功能,为 ESP32 带来无线互联能力。可通过以下命令查看模块包含的接口:
import network, bluetooth
help(network)
help(bluetooth)
6.4 查看可用模块与帮助
不同版本的固件或芯片,所支持的内置模块略有差异。可通过以下方式查询当前设备支持情况:
-
列出当前固件的所有内置模块:
在 Shell 中输入:
help('modules') -
查询模块属性与函数:
使用
dir()函数列出对象的所有属性。例如查看machine模块下的内容:import machine
dir(machine) -
查看对象帮助文档:
MicroPython 的
help()函数可提供特定对象的简要说明:import machine
help(machine.Pin)备注help()仅提供简要说明,完整的 API 定义请参考官方文档。