跳转到内容

MicroPython编程入门

本节介绍MicroPython作为ESP32的另一种编程语言。通过本节学习,你将能够:

  • 将MicroPython固件刷入ESP32
  • 在ESP32上编写和运行Python脚本
  • 使用REPL(读取-求值-打印-循环)进行交互式开发
  • 使用Python读取传感器数据和控制GPIO
  • 理解何时选择MicroPython而非Arduino C++
  • Python编程基础知识
  • ESP32开发板
  • 已安装USB-UART驱动程序

MicroPython是为微控制器设计的Python 3的精简实现。它包含Python标准库的子集,以及用于GPIO、I2C、SPI、Wi-Fi等的硬件特定模块。

关键特性

  • 交互式:REPL(读取-求值-打印-循环)允许实时实验
  • Python语法:任何懂Python的人都熟悉
  • 文件系统:ESP32闪存分区中包含一个用于Python脚本的小型文件系统
  • RAM占用:只需256 KB RAM即可运行
  • 性能:比编译的C++慢5-10倍,但对大多数物联网任务足够
方面MicroPythonArduino C++
开发速度快(无需编译步骤)较慢(编译+上传)
执行速度较慢(解释执行)快(编译为原生代码)
RAM使用较高(解释器开销)较低
学习曲线低(懂Python的话)中等(C++语法)
库生态系统增长中但较小非常大,成熟
调试REPL + print语句串行打印、GDB + JTAG
实时控制有限(无抢占)完整(FreeRTOS)
文件大小二进制文件较大(包含解释器)二进制文件较小
最适合原型设计、教育、数据记录生产环境、精确定时、复杂项目

第一步:在ESP32上安装MicroPython固件

Section titled “第一步:在ESP32上安装MicroPython固件”

选项A:使用esptool(命令行)

  1. micropython.org/download/ESP32_GENERIC/ 下载最新的ESP32 MicroPython固件

  2. 安装esptool:

    Terminal window
    pip install esptool
  3. 擦除ESP32闪存:

    Terminal window
    esptool.py --chip esp32 --port /dev/cu.usbserial-XXXX erase_flash

    (将 /dev/cu.usbserial-XXXX 替换为你的端口)

  4. 刷写MicroPython固件:

    Terminal window
    esptool.py --chip esp32 --port /dev/cu.usbserial-XXXX --baud 460800 write_flash -z 0x1000 ESP32_GENERIC-20231005-v1.21.0.bin

选项B:使用Thonny IDE(图形界面——推荐初学者使用)

  1. thonny.org 下载并安装Thonny IDE
  2. 通过USB连接ESP32
  3. 在Thonny中进入 Run > Select Interpreter
  4. 选择 MicroPython (ESP32)
  5. 选择正确的端口
  6. 进入 Tools > Options > Interpreter
  7. 点击 Install or update MicroPython
  8. 选择ESP32型号并点击 Install
  9. 等待安装完成

MicroPython安装完成后:

  1. 打开到ESP32的串行连接:

    • 使用Thonny:Shell窗格自动连接
    • 使用 screen(macOS/Linux):screen /dev/cu.usbserial-XXXX 115200
    • 使用 putty(Windows):串行连接,波特率115200
  2. 你应该看到MicroPython的启动画面:

    MicroPython v1.21.0 on 2023-10-05; ESP32 module with ESP32
    Type "help()" for more information.
    >>>
  3. 测试REPL:

    >>> print("Hello from ESP32!")
    Hello from ESP32!
    >>> import machine
    >>> machine.freq()
    240000000

在Thonny中创建名为 main.py 的文件(File > New)并保存到ESP32(File > Save As > MicroPython Device):

import machine
import time
led = machine.Pin(2, machine.Pin.OUT)
while True:
led.on()
time.sleep(1)
led.off()
time.sleep(1)

将文件保存为ESP32上的 main.py 后,按复位按钮。脚本会自动启动,因为MicroPython在启动时执行 main.py

import machine
import dht
import time
# DHT22连接到GPIO 4
sensor = dht.DHT22(machine.Pin(4))
while True:
try:
sensor.measure()
temp = sensor.temperature()
humidity = sensor.humidity()
print(f"Temperature: {temp:.1f} C, Humidity: {humidity:.1f}%")
except Exception as e:
print("Sensor error:", e)
time.sleep(5)
import network
import time
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
ssid = "YourWiFiSSID"
password = "YourWiFiPassword"
print("Connecting to Wi-Fi...")
wlan.connect(ssid, password)
while not wlan.isconnected():
time.sleep(0.5)
print(".", end="")
print()
print("Connected!")
print("IP address:", wlan.ifconfig()[0])

安装 umqtt.simple 库(MicroPython包仓库中可用):

import network
import time
from umqtt.simple import MQTTClient
import machine
# Wi-Fi连接
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("YourWiFiSSID", "YourWiFiPassword")
while not wlan.isconnected():
time.sleep(0.5)
# MQTT设置
client = MQTTClient("esp32-client", "192.168.1.100", port=1883)
client.connect()
# 发布消息
client.publish(b"esp32/test", b"Hello from MicroPython!")
print("Message published")
client.disconnect()
  • MicroPython REPL响应Python命令
  • main.py 在ESP32复位时自动启动
  • LED按程序闪烁
  • 传感器读数准确且格式正确
  • Wi-Fi连接成功并获取正确的IP
  • MQTT消息被Broker接收

原因:固件版本错误或闪存地址错误。

解决方案

  1. 完全擦除闪存:esptool.py erase_flash
  2. 使用正确地址重新刷写:通用ESP32用 0x1000
  3. 尝试不同的USB端口或线缆

原因:MicroPython解释器使用了大部分可用RAM。

解决方案

  1. 减小缓冲区大小(如更小的JSON文档)
  2. 定期使用 gc.collect() 释放内存
  3. 使用 micropython.mem_total()micropython.mem_free() 监控
  4. 考虑使用带PSRAM的ESP32-S3运行MicroPython

原因:DHT库未包含在所有MicroPython构建中。

解决方案

  1. 使用包含DHT支持的其他MicroPython固件版本
  2. 手动将 dht.py 库复制到ESP32文件系统
  3. 使用onewire模块直接读取DHT传感器
  • 使用REPL进行探索:在编写脚本之前交互式测试传感器读数和引脚状态
  • 将常用代码保存为模块:创建可复用的 .py 模块并在 main.py 中导入
  • 使用 gc 监控内存gc.collect()gc.mem_free() 有助于防止内存不足错误
  • 使用 main.py 作为启动入口:MicroPython在启动时自动执行 main.py
  • 优雅处理Wi-Fi断开:使用try-except循环配合重连逻辑
  • 避免在时序关键型应用中使用MicroPython:解释器会引入抖动;精确定时请使用C/C++
  1. MicroPython将Python带到了ESP32,实现了快速开发和交互式实验
  2. 使用esptool或Thonny IDE(推荐初学者)刷写固件
  3. REPL允许与GPIO、传感器和Wi-Fi进行实时交互
  4. main.py 在启动时自动执行,实现独立运行
  5. MicroPython非常适合原型设计、教育和数据记录——但不适合生产环境或时序关键型应用