MicroPython编程入门
MicroPython编程入门
Section titled “MicroPython编程入门”本节介绍MicroPython作为ESP32的另一种编程语言。通过本节学习,你将能够:
- 将MicroPython固件刷入ESP32
- 在ESP32上编写和运行Python脚本
- 使用REPL(读取-求值-打印-循环)进行交互式开发
- 使用Python读取传感器数据和控制GPIO
- 理解何时选择MicroPython而非Arduino C++
- Python编程基础知识
- ESP32开发板
- 已安装USB-UART驱动程序
什么是MicroPython?
Section titled “什么是MicroPython?”MicroPython是为微控制器设计的Python 3的精简实现。它包含Python标准库的子集,以及用于GPIO、I2C、SPI、Wi-Fi等的硬件特定模块。
关键特性:
- 交互式:REPL(读取-求值-打印-循环)允许实时实验
- Python语法:任何懂Python的人都熟悉
- 文件系统:ESP32闪存分区中包含一个用于Python脚本的小型文件系统
- RAM占用:只需256 KB RAM即可运行
- 性能:比编译的C++慢5-10倍,但对大多数物联网任务足够
MicroPython vs Arduino C++
Section titled “MicroPython vs Arduino C++”| 方面 | MicroPython | Arduino C++ |
|---|---|---|
| 开发速度 | 快(无需编译步骤) | 较慢(编译+上传) |
| 执行速度 | 较慢(解释执行) | 快(编译为原生代码) |
| RAM使用 | 较高(解释器开销) | 较低 |
| 学习曲线 | 低(懂Python的话) | 中等(C++语法) |
| 库生态系统 | 增长中但较小 | 非常大,成熟 |
| 调试 | REPL + print语句 | 串行打印、GDB + JTAG |
| 实时控制 | 有限(无抢占) | 完整(FreeRTOS) |
| 文件大小 | 二进制文件较大(包含解释器) | 二进制文件较小 |
| 最适合 | 原型设计、教育、数据记录 | 生产环境、精确定时、复杂项目 |
第一步:在ESP32上安装MicroPython固件
Section titled “第一步:在ESP32上安装MicroPython固件”选项A:使用esptool(命令行)
-
从 micropython.org/download/ESP32_GENERIC/ 下载最新的ESP32 MicroPython固件
-
安装esptool:
Terminal window pip install esptool -
擦除ESP32闪存:
Terminal window esptool.py --chip esp32 --port /dev/cu.usbserial-XXXX erase_flash(将
/dev/cu.usbserial-XXXX替换为你的端口) -
刷写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(图形界面——推荐初学者使用)
- 从 thonny.org 下载并安装Thonny IDE
- 通过USB连接ESP32
- 在Thonny中进入 Run > Select Interpreter
- 选择 MicroPython (ESP32)
- 选择正确的端口
- 进入 Tools > Options > Interpreter
- 点击 Install or update MicroPython
- 选择ESP32型号并点击 Install
- 等待安装完成
第二步:连接REPL
Section titled “第二步:连接REPL”MicroPython安装完成后:
-
打开到ESP32的串行连接:
- 使用Thonny:Shell窗格自动连接
- 使用
screen(macOS/Linux):screen /dev/cu.usbserial-XXXX 115200 - 使用
putty(Windows):串行连接,波特率115200
-
你应该看到MicroPython的启动画面:
MicroPython v1.21.0 on 2023-10-05; ESP32 module with ESP32Type "help()" for more information.>>> -
测试REPL:
>>> print("Hello from ESP32!")Hello from ESP32!>>> import machine>>> machine.freq()240000000
第三步:闪烁LED
Section titled “第三步:闪烁LED”在Thonny中创建名为 main.py 的文件(File > New)并保存到ESP32(File > Save As > MicroPython Device):
import machineimport 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。
第四步:读取传感器(DHT22)
Section titled “第四步:读取传感器(DHT22)”import machineimport dhtimport time
# DHT22连接到GPIO 4sensor = 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)第五步:连接Wi-Fi
Section titled “第五步:连接Wi-Fi”import networkimport 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])第六步:使用MicroPython发布MQTT
Section titled “第六步:使用MicroPython发布MQTT”安装 umqtt.simple 库(MicroPython包仓库中可用):
import networkimport timefrom umqtt.simple import MQTTClientimport 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接收
刷写MicroPython后ESP32无响应
Section titled “刷写MicroPython后ESP32无响应”原因:固件版本错误或闪存地址错误。
解决方案:
- 完全擦除闪存:
esptool.py erase_flash - 使用正确地址重新刷写:通用ESP32用
0x1000 - 尝试不同的USB端口或线缆
运行脚本时出现”MemoryError”
Section titled “运行脚本时出现”MemoryError””原因:MicroPython解释器使用了大部分可用RAM。
解决方案:
- 减小缓冲区大小(如更小的JSON文档)
- 定期使用
gc.collect()释放内存 - 使用
micropython.mem_total()和micropython.mem_free()监控 - 考虑使用带PSRAM的ESP32-S3运行MicroPython
找不到’dht’文件或目录
Section titled “找不到’dht’文件或目录”原因:DHT库未包含在所有MicroPython构建中。
解决方案:
- 使用包含DHT支持的其他MicroPython固件版本
- 手动将
dht.py库复制到ESP32文件系统 - 使用onewire模块直接读取DHT传感器
- 使用REPL进行探索:在编写脚本之前交互式测试传感器读数和引脚状态
- 将常用代码保存为模块:创建可复用的
.py模块并在main.py中导入 - 使用
gc监控内存:gc.collect()和gc.mem_free()有助于防止内存不足错误 - 使用
main.py作为启动入口:MicroPython在启动时自动执行main.py - 优雅处理Wi-Fi断开:使用try-except循环配合重连逻辑
- 避免在时序关键型应用中使用MicroPython:解释器会引入抖动;精确定时请使用C/C++
- MicroPython将Python带到了ESP32,实现了快速开发和交互式实验
- 使用esptool或Thonny IDE(推荐初学者)刷写固件
- REPL允许与GPIO、传感器和Wi-Fi进行实时交互
main.py在启动时自动执行,实现独立运行- MicroPython非常适合原型设计、教育和数据记录——但不适合生产环境或时序关键型应用