跳到主要内容

第2节 基础知识

本节将带你进一步了解 MicroPython,并熟悉 Thonny IDE 的用法。

重要提示:关于开发板的兼容性

本教程的核心逻辑适用于所有 ESP32 开发板,但所有操作步骤均以 微雪 ESP32-S3-Zero 迷你开发板 为例进行讲解。如果您使用其他型号的开发板,请根据实际情况修改相应设置。

1. Thonny 的文件视图

在嵌入式开发过程中,经常需要在“计算机本地”和“ESP32 设备”之间进行文件传输与管理。Thonny 提供了可视化的文件视图功能来实现此操作。

  1. 开启文件视图:打开 Thonny,在顶部菜单栏选择 视图 -> 文件

    打开 Thonny 文件视图
  2. 界面布局:此时左侧栏会出现两个区域:

    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 的工作频率。

Shell 窗口将输出当前设备的平台名称以及 CPU 的工作频率

2.2 脚本式运行

脚本式运行是开发复杂程序的标准方式。需在编辑器区域编写完整的代码文件,保存后发送给 ESP32 执行。

  1. 编写代码:在编辑器中输入以下测试代码。该程序将打印设备信息,并每秒输出一次累加计数。

    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)
  2. 运行脚本:点击工具栏绿色的 运行 按钮(或按 F5)。

    运行脚本
  3. 观察现象:底部的 Shell 窗口将开始输出设备信息及循环计数。

    如何停止程序?

    由于上面的代码中包含 while True 死循环,Shell 会被一直占用,导致无法进行保存文件等其他操作。要停止程序,请点击工具栏红色的停止按钮,或在 Shell 中按 Ctrl + C

    停止按钮

    KeyboardInterrupt 错误

    强制中断可能会导致 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")
  4. 保存代码:将代码保存到 ESP32 中,以便后续使用。

    • 停止程序,然后点击工具栏的 保存 按钮(或按 Ctrl + S)。

      停止按钮
    • 系统将提示选择保存位置,选择 MicroPython 设备

      选择 MicroPython 设备
    • 然后输入文件名(例如 test_print.py)并点击确认。

      保存文件名
    • 保存后,可在左侧文件视图的 MicroPython 设备区域看到 test_print.py

      保存成功

3. ESP32 的启动机制

在上一步的操作中,代码虽然已保存到设备,但在拔掉 USB 线重新上电后,程序不会自动运行。这是由 MicroPython 的启动规则决定的。ESP32 上电复位后,会依次经历以下几个阶段:

MicroPython 启动序列

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.pymain.py 中设置的全局变量仍将在 REPL 有效。

  • REPL 会继续执行,直到触发硬重置或软重置。

4 示例:自动运行脚本

若希望程序在脱机状态(仅连接电池或电源)下自动运行,需将脚本命名为 main.py

  1. 定位文件:在 Thonny 左下角的 MicroPython 设备 区域,双击打开上一步保存 test_print.py

  2. 另存为 main.py:在 Thonny 菜单栏点击 文件 - 保存为副本,选择保存到 MicroPython 设备, 并将文件名设置为 main.py

    另存为 main.py
    选择 MicroPython 设备
    设置文件名
  3. 验证:在 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 的步骤如下:

  1. 在左上侧(本地文件)找到目标文件(例如 ssd1327.py)。

  2. 右键点击该文件,选择 上传到 /

    上传文件操作
  3. 文件将被复制到 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 networkbluetooth 模块

networkbluetooth 模块用于配置 Wi-Fi 和蓝牙功能,为 ESP32 带来无线互联能力。可通过以下命令查看模块包含的接口:

import network, bluetooth
help(network)
help(bluetooth)

6.4 查看可用模块与帮助

不同版本的固件或芯片,所支持的内置模块略有差异。可通过以下方式查询当前设备支持情况:

  1. 列出当前固件的所有内置模块

    在 Shell 中输入:

    help('modules')
  2. 查询模块属性与函数

    使用 dir() 函数列出对象的所有属性。例如查看 machine 模块下的内容:

    import machine
    dir(machine)
  3. 查看对象帮助文档

    MicroPython 的 help() 函数可提供特定对象的简要说明:

    import machine
    help(machine.Pin)
    备注

    help() 仅提供简要说明,完整的 API 定义请参考官方文档

7. 参考链接