MicroPython 入门到实战:让Python跑在单片机与嵌入式设备上

一、MicroPython 简介与核心特点

MicroPython 是一款专门为微控制器、嵌入式硬件、物联网设备量身定制的精简版 Python 3 解释器,由剑桥大学教授 Damien George 主导开发,采用 MIT License 开源许可,可自由商用、修改与分发。

它完整保留了 Python 简洁易用、语法清晰的核心特性,同时深度裁剪了不必要的功能,专门适配内存极小、算力有限的嵌入式硬件,能够直接运行在 ESP32、ESP8266、STM32、RP2040(树莓派 Pico)等主流单片机上。

1.1 工作原理

MicroPython 本质是一个可烧录到硬件 Flash 中的固件。将固件刷入开发板后,开发板就拥有了 Python 运行环境,用户可以通过串口、WebREPL 等方式直接输入 Python 代码,由板载的 MicroPython 解释器实时解释执行,无需像传统嵌入式开发那样经过复杂的编译、链接、下载过程,极大降低了嵌入式开发门槛。

1.2 优点

  • 语法与标准 Python 高度兼容,学习成本极低
  • 支持交互式运行,代码即写即测,开发效率远超 C 语言
  • 内置丰富硬件驱动库,可直接控制 GPIO、I2C、SPI、UART、WiFi、蓝牙等硬件
  • 资源占用极低,可在几十KB内存、几十MHz主频的硬件上流畅运行
  • 开源免费,生态完善,社区活跃,资料丰富

1.3 缺点

  • 执行效率低于编译型语言(如 C/C++),不适合超高频实时控制场景
  • 功能裁剪后,部分标准 Python 库无法直接使用
  • 对硬件有一定适配要求,并非所有单片机都支持

二、MicroPython 环境搭建与固件烧录

2.1 准备工作

想要使用 MicroPython,需要准备:

  • 支持 MicroPython 的开发板(本文以最常用的 ESP32 为例)
  • USB 数据线
  • 电脑(Windows / macOS / Linux 均可)
  • 烧录工具与串口工具

2.2 安装烧录工具

我们使用 esptool.py 来给 ESP32 烧录 MicroPython 固件,它是 Python 编写的开源烧录工具,直接通过 pip 安装即可:

pip install esptool

安装完成后,在命令行输入以下命令验证是否安装成功:

esptool.py version

2.3 下载对应固件

前往 MicroPython 官方下载页面,选择自己开发板对应的固件,以 ESP32 为例:

  • 下载后缀为 .bin 的稳定版固件
  • 保存到电脑本地,方便后续烧录

2.4 擦除原有固件

在烧录新固件前,建议先擦除开发板原有程序,避免冲突:

esptool.py --chip esp32 erase_flash

执行后等待提示擦除成功即可。

2.5 烧录 MicroPython 固件

将下载好的固件文件拖入命令行,替换路径,执行烧录命令:

esptool.py --chip esp32 --port COM3 write_flash -z 0x1000 你的固件路径.bin
  • COM3 为开发板在电脑上的串口号,Windows 可在设备管理器查看
  • 烧录完成后,开发板就成功搭载了 MicroPython 环境

三、MicroPython 基础使用:交互式命令行

3.1 连接开发板

烧录完成后,我们可以通过串口工具连接开发板,常用工具有:

  • PuTTY
  • Tera Term
  • Thonny(推荐,自带 MicroPython 支持)

本文推荐使用 Thonny,简单易用,适合新手。

  • 打开 Thonny
  • 点击右上角「运行」→「选择解释器」
  • 选择「MicroPython (ESP32)」,选择对应串口
  • 点击确定,即可自动连接

连接成功后,下方 Shell 窗口会出现 >>> 提示符,代表已经进入 MicroPython 交互式环境。

3.2 基础交互测试

在交互式环境中,可以直接输入 Python 代码,实时执行:

# 输出 Hello World
print("Hello MicroPython!")

# 基础运算
1 + 2
5 * 8
10 / 2

# 定义变量
name = "MicroPython"
print("I love", name)

这些代码与标准 Python 完全一致,新手可以快速上手。

四、GPIO 控制:点亮 LED(最经典入门案例)

控制硬件是 MicroPython 的核心用途,GPIO 控制是嵌入式开发的基础,下面实现点亮与闪烁 LED。

4.1 硬件连接

大多数 ESP32 开发板自带板载 LED,通常连接在 GPIO2 引脚,无需外接电路,直接使用。

4.2 点亮 LED 代码

# 导入 Pin 类
from machine import Pin
# 定义 LED 引脚,设置为输出模式
led = Pin(2, Pin.OUT)
# 输出高电平,点亮 LED
led.value(1)

代码解释:

  • machine 是 MicroPython 核心模块,提供硬件控制功能
  • Pin 用于操作 GPIO 引脚
  • Pin.OUT 代表将引脚设置为输出模式
  • value(1) 输出高电平,点亮 LED;value(0) 输出低电平,熄灭 LED

4.3 LED 闪烁代码

加入延时函数,实现 LED 循环闪烁:

from machine import Pin
import time

# 初始化 LED
led = Pin(2, Pin.OUT)

# 无限循环
while True:
    led.value(1)  # 点亮
    time.sleep(0.5)  # 延时 0.5 秒
    led.value(0)  # 熄灭
    time.sleep(0.5)  # 延时 0.5 秒

代码解释:

  • time.sleep(秒数) 用于延时,单位为秒
  • while True 实现无限循环,让 LED 持续闪烁

将代码复制到 Thonny 中,点击运行,即可看到开发板 LED 不停闪烁。

五、按键输入检测

MicroPython 不仅可以输出控制硬件,还可以读取外部输入信号,下面实现按键控制 LED。

5.1 硬件连接

  • 按键一端接 GPIO0
  • 按键另一端接 GND

5.2 按键检测代码

from machine import Pin
import time

led = Pin(2, Pin.OUT)
# 初始化按键,上拉输入模式
key = Pin(0, Pin.IN, Pin.PULL_UP)

while True:
    # 读取按键电平
    if key.value() == 0:  # 按键按下
        time.sleep_ms(20)  # 消抖
        if key.value() == 0:
            led.value(not led.value())  # 翻转 LED 状态
            while key.value() == 0:  # 等待按键松开
                pass
    time.sleep_ms(10)

代码解释:

  • Pin.PULL_UP 开启内部上拉电阻,未按下时为高电平,按下为低电平
  • time.sleep_ms(20) 毫秒级延时,用于消除按键抖动
  • led.value(not led.value()) 实现 LED 状态翻转

按下按键,LED 状态切换;再次按下,状态再次切换,非常直观。

六、WiFi 连接与网络请求(物联网基础)

ESP32 自带 WiFi 功能,MicroPython 提供了便捷的 WiFi 控制库,可以轻松连接路由器、发送 HTTP 请求,实现物联网功能。

6.1 连接 WiFi 代码

import network
import time

# WiFi 名称和密码
ssid = "你的WiFi名称"
password = "你的WiFi密码"

# 初始化 STA 模式(连接路由器)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)

# 连接 WiFi
if not wlan.isconnected():
    print("正在连接 WiFi...")
    wlan.connect(ssid, password)
    # 等待连接成功
    while not wlan.isconnected():
        time.sleep(0.5)

print("WiFi 连接成功")
print("网络信息:", wlan.ifconfig())

代码解释:

  • network.STA_IF 为客户端模式,用于连接路由器
  • wlan.active(True) 开启 WiFi
  • wlan.isconnected() 判断是否连接成功
  • wlan.ifconfig() 返回 IP 地址、子网掩码、网关、DNS

运行后,开发板即可连接路由器,并打印出获取到的 IP 地址。

6.2 发送 HTTP 请求

连接网络后,可以请求网页接口,获取数据:

import urequests

# 发送 GET 请求
response = urequests.get("http://httpbin.org/get")
# 打印返回内容
print(response.text)
# 关闭连接
response.close()

代码解释:

  • urequests 是 MicroPython 简化版的 requests 库
  • get() 发送 HTTP GET 请求
  • response.text 获取返回的文本数据

通过该功能,可以获取天气、时间、服务器数据等,实现物联网设备的数据交互。

七、PWM 调光:呼吸灯效果

PWM(脉冲宽度调制)是嵌入式常用技术,可用于 LED 调光、电机调速。下面使用 PWM 实现呼吸灯效果。

7.1 呼吸灯代码

from machine import Pin, PWM
import time

# 初始化 PWM,绑定 GPIO2,频率 1000Hz
pwm_led = PWM(Pin(2), freq=1000)

while True:
    # 逐渐变亮
    for i in range(0, 1024):
        pwm_led.duty(i)
        time.sleep_ms(1)
    # 逐渐变暗
    for i in range(1023, -1, -1):
        pwm_led.duty(i)
        time.sleep_ms(1)

代码解释:

  • PWM 用于创建 PWM 对象
  • freq 设置 PWM 频率
  • duty(值) 设置占空比,范围 0~1023
  • 循环修改占空比,实现呼吸灯效果

运行后,LED 会像呼吸一样,缓慢变亮再缓慢变暗,效果流畅。

八、I2C 驱动 OLED 显示屏

MicroPython 支持大量外设驱动,I2C 是最常用的通信协议之一,下面驱动 0.96 寸 OLED 屏幕显示文字。

8.1 硬件连接

  • VCC → 3.3V
  • GND → GND
  • SDA → GPIO21
  • SCL → GPIO22

8.2 OLED 驱动代码

首先需要上传 OLED 驱动文件(ssd1306.py),然后编写主代码:

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import time

# 初始化 I2C
i2c = I2C(0, sda=Pin(21), scl=Pin(22), freq=400000)
# 初始化 OLED,分辨率 128*64
oled = SSD1306_I2C(128, 64, i2c)

# 清屏
oled.fill(0)

# 显示文字
oled.text("MicroPython", 0, 0)
oled.text("Hello World", 0, 16)
oled.text("GPIO:2", 0, 32)
oled.text("OLED Test", 0, 48)

# 刷新显示
oled.show()

代码解释:

  • I2C 初始化 I2C 通信
  • SSD1306_I2C 驱动 OLED 屏幕
  • text(内容, x坐标, y坐标) 在指定位置显示文字
  • show() 将缓存内容显示到屏幕

运行后,OLED 屏幕会显示多行文字,可用于显示传感器数据、设备状态等信息。

九、综合实战:WiFi 环境监测终端

结合前面所学知识,制作一个WiFi 环境监测终端,实时采集温度数据并显示在 OLED 屏幕上,同时连接 WiFi 准备上传数据。

9.1 功能说明

  • 连接 WiFi
  • 采集内部温度数据(ESP32 自带温度传感器)
  • 在 OLED 屏幕上实时显示温度与 WiFi 信息
  • LED 闪烁代表系统运行

9.2 完整代码

from machine import Pin, PWM, I2C
from ssd1306 import SSD1306_I2C
import network
import time
import esp

# WiFi 信息
SSID = "你的WiFi名称"
PASSWORD = "你的WiFi密码"

# 硬件初始化
led = Pin(2, Pin.OUT)
i2c = I2C(0, sda=Pin(21), scl=Pin(22), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)

# WiFi 连接函数
def connect_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print("正在连接 WiFi...")
        wlan.connect(SSID, PASSWORD)
        while not wlan.isconnected():
            led.value(1)
            time.sleep(0.2)
            led.value(0)
            time.sleep(0.2)
    print("WiFi 连接成功")
    return wlan.ifconfig()[0]

# 主程序
def main():
    ip = connect_wifi()
    oled.fill(0)
    oled.text("WiFi Connected", 0, 0)
    oled.text("IP:" + ip, 0, 16)
    oled.show()
    time.sleep(2)

    while True:
        # 读取温度
        temp = esp32.raw_temperature()
        temp_c = (temp - 32) / 1.8  # 转摄氏度

        # 显示数据
        oled.fill(0)
        oled.text("IP:" + ip[:15], 0, 0)
        oled.text("Temp: {:.1f} C".format(temp_c), 0, 16)
        oled.text("Running...", 0, 48)
        oled.show()

        # 运行指示灯
        led.value(1)
        time.sleep(0.1)
        led.value(0)
        time.sleep(1)

if __name__ == "__main__":
    main()

该案例整合了 WiFi、OLED、GPIO、温度读取,是非常典型的物联网终端项目,可在此基础上扩展湿度传感器、气压传感器、光照传感器等,制作完整的环境监测站。

相关资源

  • Pypi地址:https://pypi.org/project/micropython
  • Github地址:https://github.com/micropython/micropython
  • 官方文档地址:https://docs.micropython.org

关注我,每天分享一个实用的Python自动化工具。