Raspberry Pi Pico + MicroPython 零基础入门:从点亮LED到温湿度监控
2026/9/12 17:55:36 网站建设 项目流程

我第一次拿到 Raspberry Pi Pico 的时候,第一反应是:就这?一块长得像内存条的小板子,卖十几块钱,能玩出什么花?结果用 MicroPython 写完第一个点灯程序,我只花了不到十分钟。那个瞬间我就明白了,这套组合拳对刚接触硬件开发的人来说,杀伤力太大了。

Pico 本身是树莓派基金会推出的微控制器开发板,主控叫 RP2040,双核 ARM Cortex-M0+,最高主频 133MHz,带 264KB SRAM 和 2MB Flash。听起来不夸张,但结合 MicroPython 的解释型开发体验,它把一个完整的硬件开发入门流程压缩到了“插线、写码、跑”三步。你不需要先啃完一本寄存器手册,不需要折腾编译链,跟着我一步步来,今天就能跑通第一个真正的项目。

这篇博文就是给零基础入门的你写的。我默认你没有玩过单片机,不知道什么是 GPIO,更没接触过 MicroPython,但如果你有 Arduino 或其他板子的经验,也不亏,里面有不少实操细节和踩坑记录是文档上翻不到的。

1. 为什么选 Raspberry Pi Pico 和 MicroPython 这套组合

1.1 Pico 这颗 RP2040 到底强在哪里

很多人一上来就问:Pico 和 Arduino、ESP32 比,到底选谁?我的答案很直接:玩入门、做课程设计、搞小项目,Pico 是当前最优解之一。

先看硬件底子。RP2040 是一颗双核芯片,这意味着在 MicroPython 里你可以用_thread模块让两个核心各干各的,一个跑传感器采集,一个跑数据显示,不会互相卡顿。264KB 的 SRAM 和 2MB Flash 虽然在 PC 眼里不算什么,但在单片机领域属于“富余配置”,跑复杂的字符串处理、做几个小型数据结构缓存都不至于抠抠搜搜。

更关键的是 Pico 的引脚资源富得流油。26 个 GPIO,其中包含 3 路 ADC(模数转换)、2 路 UART、2 路 SPI、2 路 I2C,还有 16 路 PWM 通道。这意味着你以后想接屏幕、接传感器、接电机驱动,几乎不需要做引脚冲突的取舍,对新手非常友好。

另外,Pico 的引脚基本都是 5V 容忍的(注意不是全部),供电电压 3.3V,逻辑电平也是 3.3V。很多 5V 传感器的信号线可以直接接,省掉电平转换模块,少烧好几个器件。

1.2 MicroPython 用起来有多爽

如果你用过 C/C++ 开发单片机,一定体会过交叉编译的繁琐:装工具链、写 Makefile、烧录、看串口调试,改一行代码又得重新走一遍流程。MicroPython 改变了这一切。

MicroPython 本质上是 Python 3 语言的一个精简实现,专门为微控制器设计。你在 PC 上写的 Python 语法,99% 都能直接在板子上跑。更爽的是它有交互式解释器(REPL),就是 Python 命令行那个东西,你可以一行一行地在板子上执行代码,立刻看到效果。

比如你想试试 GPIO 能不能输出高电平,在 Thonny 的 Shell 里敲一行:

Pin(25, Pin.OUT).value(1)

回车,灯就亮了。想验证某个传感器的 I2C 地址?敲两行扫描代码立刻出结果。这种交互式开发方式,对理解硬件行为、排查错误有奇效。我见过太多初学者在 C 语言开发环境里 Debug 半小时,结果发现只是引脚写错了,而用 MicroPython 你两分钟就能定位问题。

再说一个对比:用 C 语言写一个 PWM 呼吸灯,你需要翻数据手册,看 PWM 外设的寄存器配置,然后写一坨底层初始化代码。用 MicroPython 呢?

from machine import Pin, PWM pwm = PWM(Pin(25)) pwm.freq(1000) for duty in range(0, 65535, 100): pwm.duty_u16(duty)

四行搞定。这就是 MicroPython 对入门者的最大价值——把硬件底层的复杂性封装起来,让你把精力花在“我想做什么”而不是“芯片怎么运作”上。

1.3 和同类开发板的横向对比

要把 Pico 的定位讲清楚,最好和市面上常见的板子做个对比。我大概列了一下我手头的几块板子:

开发板主控主频内存开发语言价格(约)适合场景
Raspberry Pi PicoRP2040 双核133MHz264KBMicroPython/C15-25元入门学习、小项目
Arduino UnoATmega328P16MHz2KBC/C++30-60元传统电子教学、传感器实验
ESP32 DevKitXtensa 双核240MHz520KBMicroPython/C/Arduino25-50元WiFi/蓝牙联网项目

注意到没,Pico 最吸引人的不是性能碾压,而是性价比和生态。它比 Arduino 性能强、比 ESP32 便宜,而且 MicroPython 官方固件支持做得非常完善。如果你做的是一个“不需要联网”的本地硬件项目,Pico 是综合成本最低的选择。我身边有不少朋友先买了 ESP32 做入门,结果被 WiFi 配置和各种环境问题折腾得弃坑,换上 Pico 反而顺风顺水。

2. 上手准备:硬件清单与开发环境搭建

2.1 你需要准备哪些东西

别急着买一大堆模块,入门阶段这些东西就够你玩一个星期了:

  • Raspberry Pi Pico 主板 1 块(买带排针的版本,方便插面包板,大概 15-25 元)
  • Micro USB 数据线 1 根(注意:必须是能传数据的线,不是纯充电线,这个坑很多人踩)
  • 面包板 1 个
  • 杜邦线 公对公 若干
  • LED 灯珠 若干(颜色随意,建议买一堆 5mm 的)
  • 330Ω 电阻 若干(保护 LED 用)
  • 轻触按键 2-3 个
  • 10KΩ 电阻 2-3 个(按键上拉用)

这些基础物料淘宝一整套下来不超过 40 块钱。为什么强调别多买?我见过太多新手一开始就入手各种传感器模块,最后全在抽屉里吃灰。先把板子跑明白,再按项目需求一步步添置,这才是可持续的学习节奏。

2.2 固件烧录:BOOTSEL 模式全流程

Pico 出厂时不带 MicroPython 固件,所以第一步是烧录。这个过程非常简单,但很多人在这一步就卡住了,我详细拆一下。

Pico 板子上有一个物理按键 BOOTSEL。烧录固件的流程是:

  1. 先按住 BOOTSEL 按钮不放
  2. 再用 USB 线连接 Pico 和电脑
  3. 等待电脑弹出 U 盘图标(盘符名称通常是 RPI-RP2)
  4. 把下载好的 .uf2 固件文件拖进这个 U 盘
  5. 固件拖进去之后,U 盘会自动消失,板子自动重启

固件从哪下载?有两个渠道。第一个是 MicroPython 官方网站的 Raspberry Pi Pico 专区,直接下载最新的rp2-pico-xxxxxx.uf2文件。第二个是树莓派基金会官方文档页面的链接,两者本质上同一个东西。注意看清楚下载的是rp2版本,不是rp2350。如果你买的是带 WiFi 的 Pico W 或 Pico 2,固件选型不同,新手先分清就好。

有个细节值得提醒:下载的固件文件名自带版本号,比如rp2-pico-20240101-v1.22.0.uf2,可以直接重命名成firmware.uf2,不影响烧录。我把所有常用固件都放在一个文件夹里,按日期命名,方便以后升级回滚。

拖文件的时候如果电脑没任何反应,大概率是 USB 线只支持充电不支持数据。换线就好。如果换线还不行,试试按住 BOOTSEL 的状态下重新插拔一次。

2.3 编程环境:Thonny 安装与解释器配置

MicroPython 的官方推荐 IDE 是 Thonny,我强烈建议新手就用它。理由很简单:内置了 Pico 的固件烧录引导和文件管理,开箱即用。

安装方式就不赘述了,直接去 thonny.org 下载对应系统的安装包,或者 Linux 下用包管理器安装thonny。装完打开,重点讲配置:

  1. 点击右下角的解释器选择区域(默认显示“Python 3.x”或类似文字)
  2. 选择“MicroPython (Raspberry Pi Pico)”
  3. 如果板子还没烧录固件,Thonny 会弹窗提示你它检测到了 Pico 的恢复模式,问你要不要烧录固件
  4. 点击“Install MicroPython”即可自动完成烧录

这里有个常见坑:打开 Thonny 但识别不到板子。大概率是 USB 线的问题,或者 Thonny 版本过旧。建议安装最新版 Thonny,它在 Pico 识别上做了很多优化。

配置完成之后,Thonny 的界面会像 Python 的 IDLE:上面是代码编辑器,下面是 Shell(REPL 交互式终端)。你可以先在 Shell 里输入print("hello pico")看能不能执行,如果能输出结果,恭喜你,整个开发环境就通了。

另外一个很实用的小技巧:Thonny 的“文件”菜单里可以打开“树莓派 Pico”文件系统,也就是板子上的存储区。你可以像管理电脑文件一样,把 Python 脚本直接保存到板子上去。保存到板子的文件如果叫main.py,Pico 上电后会自动运行它——这就是你做“脱离电脑运行”项目的关键。

3. 第一个程序:点亮板载 LED 与外部 LED 控制

3.1 点灯背后的 GPIO 原理

所有单片机的入门之旅都从点灯开始,这已经变成一种传统了。Pico 板载 LED 在 GPIO25 上,它的意义不仅是一个灯,而是让你第一次感知“代码控制硬件”这个过程。

当你运行Pin(25, Pin.OUT)的时候,实际上是在配置 GPIO25 这个引脚为输出模式。什么是 GPIO?就是通用输入/输出引脚(General Purpose Input/Output),它可以被软件控制输出高电平(3.3V)或低电平(0V)。高电平点亮 LED,低电平熄灭,就这么简单。

用 MicroPython 点亮板载 LED 的完整代码如下:

from machine import Pin import time led = Pin(25, Pin.OUT) # 配置GPIO25为输出模式 while True: led.value(1) # 输出高电平,LED亮 time.sleep(0.5) # 延时0.5秒 led.value(0) # 输出低电平,LED灭 time.sleep(0.5) # 延时0.5秒

保存之后点击运行按钮,你会看到板载 LED 以 0.5 秒间隔闪烁。

我在教初学者的时候特别喜欢问一个问题:如果去掉time.sleep会发生什么?很多人答不上来。答案是程序在极短的时间内反复切换高低电平,由于人眼的视觉暂留效应,LED 看起来亮度会变暗一些。这个知识点后面做 PWM 调光时会反复用到,先记下来。

3.2 外部 LED 的接线方式

板载 LED 玩会了,一定要试试外接 LED,这才能理解电路的基本概念。接线如下:

  • Pico 的 GPIO 引脚和 3.3V 供电引脚在面包板上引出
  • 将 LED 长脚(阳极)通过 330Ω 限流电阻连接到 GPIO 引脚
  • 将 LED 短脚(阴极)连接到 GND(地线)

不明白为什么要串电阻的看这里:LED 本身的压降对红光来说是大约 1.8V,如果直接用 3.3V 的高电平驱动它,3.3V 减去 LED 压降剩下的电压全部落在 LED 内部阻抗上,电流会超过 LED 的最大额定值,轻则亮度异常,重则烧毁。330Ω 电阻把电流限制在 (3.3 - 1.8) / 330 ≈ 4.5mA,安全又有足够的亮度。

代码只需要改一行,把引脚号从 25 改成你实际接线的 GPIO 编号即可。我习惯把外部 LED 接在 GPIO15 上,这个位置避开了 I2C 和 UART 的默认引脚,后面扩展传感器时不容易冲突。

3.3 按键输入与上拉电阻的坑

点灯玩明白了,下一步就是按键输入。这一步是从“输出”到“输入”的跨越,也是理解 GPIO 模式的核心节点。

先看代码:

from machine import Pin import time button = Pin(14, Pin.IN, Pin.PULL_UP) # 配置GPIO14为输入模式,启用上拉电阻 led = Pin(25, Pin.OUT) while True: if button.value() == 0: # 按键按下时,引脚读到的值是0 led.value(1) else: led.value(0) time.sleep(0.05)

解释一下为什么按下时读到的是 0:我们把按键一端接 GND,另一端接 GPIO14。当按键没被按下时,GPIO14 通过内部上拉电阻连接到 3.3V,读到高电平(1);当按键按下,GPIO14 被直接短接到 GND,读到低电平(0)。

这里的关键就是Pin.PULL_UP。如果不启用内部上拉电阻,GPIO14 在按键未按下时处于悬空状态,电平不确定,程序读到的值会随机跳变。初学者最容易在这里困惑:明明没有按键,为什么 LED 总是乱闪?十有八九就是忘记设置上下拉。

还有一个我踩过的坑:按键存在“抖动”现象。就是按下和松开的瞬间,机械触点会弹跳几次,导致电平在几十毫秒内快速跳变。上面代码里的time.sleep(0.05)就是最简单的延迟消抖,实际项目中如果按键响应要求高,需要用定时器消抖或软件状态机。不过入门阶段,加个 sleep 已经够用了。

4. 核心外设实操:PWM、ADC、I2C 与串口通信

4.1 PWM 呼吸灯与电机调速

如果你已经会点灯了,下一个必修课就是 PWM(脉冲宽度调制)。这个外设的核心思路是:以极高的频率切换高低电平,通过控制高电平占一个周期内的比例(叫占空比),让外设“看起来”得到了一个介于 0 到 3.3V 之间的电压。LED 的亮度变化、电机转速调控、蜂鸣器音调变化,全靠它。

MicroPython 实现呼吸灯非常简洁:

from machine import Pin, PWM import time pwm = PWM(Pin(15)) pwm.freq(1000) # 频率1kHz while True: for duty in range(0, 65535, 100): pwm.duty_u16(duty) # 占空比从0逐渐增加到65535 time.sleep_ms(1) for duty in range(65535, 0, -100): pwm.duty_u16(duty) time.sleep_ms(1)

注意duty_u16的取值范围是 0 到 65535。为什么是 65535?因为 MicroPython 这个函数接受的是 16 位无符号数,0 代表 0% 占空比,65535 代表 100%,中间的数值等比映射。我见不少人会把旧例程里的duty函数和duty_u16混淆,旧版 MicroPython 用duty(0-1023),新版本推荐用duty_u16。你在网上搜教程时如果看到的取值范围不对,注意看是不是版本差异。

4.2 ADC 模拟信号采集

单片机世界不只有 0 和 1,现实中很多传感器的输出是连续变化的电压,这时候就需要 ADC(模数转换器)来把模拟电压转换成数字数值。Pico 有 3 个外部 ADC 引脚,分别对应 GPIO26、GPIO27、GPIO28,注意带 ADC 功能的 GPIO 在板子上位置比较集中,都在 31 脚到 34 脚附近。

接一个电位器(旋钮)到 ADC 引脚上,就能做一个简单的电压读取实验。接法:电位器两端分别接 3.3V 和 GND,中间抽头接 GPIO26。代码:

from machine import ADC, Pin import time adc = ADC(Pin(26)) # 或直接 ADC(0),两者等价 while True: value = adc.read_u16() voltage = value / 65535 * 3.3 print("ADC值:", value, "电压:", voltage, "V") time.sleep(0.5)

Pico 的 ADC 是 12 位的,但read_u16()会把 12 位结果拉伸到 16 位范围(左移 4 位),所以最大值是 65535。这在 MicroPython 里是统一做法,为了方便代码在不同的开发板之间移植。如果你需要精确的 12 位原始值,可以用read_u16() >> 4还原回来。

还有一个隐藏彩蛋:ADC 通道 4 连接的是芯片内部的温度传感器。你用ADC(4).read_u16()再套一个公式换算,就能读到 CPU 内部温度,不需要接任何外部元件。虽然精度一般,但拿来监测板子发热情况绰绰有余。我在做长时间运行的设备时会定期读这个值,超了 70 度就自动降频,也算一种最简单的温控策略。

4.3 I2C 总线和 OLED 显示屏驱动

等你要做项目、要看实时数据的时候,串口打印就不够直观了,这时候就该上一块小屏幕。SSD1306 驱动的 OLED 屏幕只要十几块钱,I2C 接口只需要 4 根线,是入门首选。

Pico 上有两个 I2C 外设,GPIO 可以和多个外设复用。最常用的分配是:

  • I2C0:SCL = GP1,SDA = GP0
  • I2C1:SCL = GP3,SDA = GP2

接线时注意把 Pico 的 SDA 接到 OLED 板的 SDA,SCL 接到 SCL,VCC 接 3.3V(有些模块标注为 5V 兼容,但用 3.3V 更稳妥),GND 接 GND。

MicroPython 官方没有内置 SSD1306 驱动,但 Thonny 里可以直接通过“工具 → 管理包”搜索micropython-ssd1306安装。或者你直接把驱动文件ssd1306.py复制到 Pico 的文件系统里,然后 import 它。我习惯把常用的驱动类文件统一放在板子的/lib目录下,这样主程序会干净很多。

基本显示代码如下:

from machine import Pin, I2C import ssd1306 i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000) oled = ssd1306.SSD1306_I2C(128, 64, i2c) oled.fill(0) # 清屏 oled.text("Hello Pico", 0, 0) # 显示文本 oled.show() # 刷新屏幕

OLED 这东西有个特点:自己不带内存,需要主控持续给数据,或者从机内部有自己的显示 RAM。SSD1306 驱动的屏幕内部有 1KB 显示缓冲,你通过 I2C 写入的数据实际上写进了这个缓冲,调用show()命令后屏幕才真正刷新。所以代码里text()后一定要记得show(),这个坑我见不少人踩过——写了字屏幕没反应,就是少了这一行。

4.4 UART 串口通信的常规用法

最后说说串口。Pico 板载的 USB 口会在 MicroPython 里创建一个 USB 虚拟串口,平时你用 Thonny 的 Shell 和板子交互走的其实就是这个通道。但如果想和电脑或者其他 MCU 进行真实串口通信,需要用到 UART 外设和 USB-TTL 转换器。

Pico 的两个 UART 默认引脚分配是:

  • UART0:TX = GP0,RX = GP1
  • UART1:TX = GP4,RX = GP5

注意 UART 的接线要交叉:Pico 的 TX 接设备端的 RX,Pico 的 RX 接设备端的 TX,而且要共地。我曾经在一次串口调试中忘记共地,结果数据全部乱码,排查了一下午。串口通信的接线三要素:TX-RX 交叉、RX-TX 交叉、GND 相连,缺一不可。

代码示例:

from machine import UART, Pin uart = UART(1, baudrate=9600, tx=Pin(4), rx=Pin(5)) uart.write("Pico says hello!") data = uart.read() # 读取接收缓冲区,没数据时返回None

串口通信的入门重点是理解波特率:通信双方必须使用相同的波特率,否则数据帧错位,全是乱码。9600、115200 是最常用的两个值,传感器通常用 9600,调试时 115200 更高效。我建议新手先固定用 9600,等熟悉了再提速。

5. 项目实战:小型温湿度环境监控站

5.1 项目功能拆解

学了这么多外设,是时候串起来做一个完整的项目了。这个项目的目标很简单:做一个桌面小工具,实时监测周围环境的温度和湿度,超过阈值时报警,所有数据实时显示在 OLED 屏幕上。

功能拆开就是三个模块:

  • 传感器采集:使用 DHT11 或 DHT22 温湿度传感器
  • 数据显示:OLED 屏幕显示温湿度数值
  • 报警联动:温度超过 30℃ 或湿度超过 70% 时,LED 闪烁、蜂鸣器响

这个项目麻雀虽小,但五脏俱全。它用到了 GPIO 输入输出、定时器、PWM、I2C、串口打印等多个知识点,而且整个工程代码只有五六十行,非常适合作为第一个完整项目。

5.2 DHT 传感器的接线与驱动

DHT11 和 DHT22 是入门最常见的温湿度传感器,都是单总线协议,一根数据线上完成所有通信。DHT11 精度低(温度±2℃,湿度±5%),但便宜、稳定,只要 3 块钱。DHT22 精度高一些,价格大约 15 块。入门阶段 DHT11 完全够用。

接线非常简单:

  • VCC 接 3.3V(有些模块标注 3.3V-5V,实测接 5V 也行,但新手建议统一 3.3V)
  • GND 接 GND
  • DATA 接 GPIO16

注意 DHT 传感器对时序要求极高,所以才需要厂商提供的库。MicroPython 内置了dht模块,直接在代码里 import 即可,不需要额外安装:

from machine import Pin import dht sensor = dht.DHT11(Pin(16)) # DHT22就用 dht.DHT22(Pin(16)) sensor.measure() temp = sensor.temperature() humi = sensor.humidity() print("温度:", temp, "°C 湿度:", humi, "%")

这里有个特别容易踩的坑:DHT 的measure()调用间隔不能太短,官方建议每次测量之间至少间隔 1-2 秒。如果间隔太短,传感器还在忙,measure()会报错或者返回错误数据。我在代码里都会在每次读取之间加time.sleep(2)

另外,DHT 传感器刚上电时可能需要等待 1 秒钟才能正常读数,我在项目初始化时会先试探读取一次,失败就重试几次,不行再报错。

5.3 完整代码整合与结构优化

这个项目的完整代码我贴在下面,结构上做了模块化拆分,方便你后面扩展:

from machine import Pin, I2C, PWM import dht import ssd1306 import time # 硬件初始化 sensor = dht.DHT11(Pin(16)) i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000) oled = ssd1306.SSD1306_I2C(128, 64, i2c) led = Pin(25, Pin.OUT) # 报警阈值 TEMP_LIMIT = 30 HUMI_LIMIT = 70 def read_sensor(): """读取温湿度,失败时重试3次""" for _ in range(3): try: sensor.measure() return sensor.temperature(), sensor.humidity() except OSError: time.sleep(0.2) return None, None def display(temp, humi): """在OLED上显示数据""" oled.fill(0) oled.text("Temp: {} C".format(temp), 0, 10) oled.text("Humi: {} %".format(humi), 0, 30) oled.show() def check_alarm(temp, humi): """超阈值时点亮板载LED""" if temp is not None and (temp > TEMP_LIMIT or humi > HUMI_LIMIT): led.value(1) else: led.value(0) while True: temp, humi = read_sensor() print("temp={}, humi={}".format(temp, humi)) display(temp, humi) check_alarm(temp, humi) time.sleep(2)

保存后把main.pyssd1306.py都传到 Pico 的文件系统,然后拔掉 USB 线再接回去(或者按复位键),你就能看到板子脱离电脑独立运行:OLED 每隔 2 秒刷新一次,温度湿度一目了然,超阈值时板载 LED 亮起报警。

5.4 项目扩展方向:自动上电运行与云端上报

这个项目跑通之后,你可以往两个方向扩展。第一个是脱离电脑独立运行:把脚本命名为main.py后,Pico 上电就会自动执行。这时候只需外接一根 USB 充电头或充电宝供电,就是一个真正可部署到实地的桌面设备。第二个方向是加网络功能:换用 Pico W 版本,或者给普通 Pico 外接一个 ESP8266 模块,通过串口把数据上报到云端或手机 App。

我实际做过一个远程温湿度监测盒子,就是在 Pico 上接了一个 DHT22 和 OLED,每隔 10 分钟采集一次数据并保存到 SD 卡(Pico 没有板载 SD 接口,但可以通过 SPI 外接模块),一个月后取出数据文件做图表分析。这套方案的成本不到 30 块钱,却完成了市面上两百多块成品温湿度记录仪的活。

6. 踩坑实录与常见问题速查表

6.1 固件烧录失败的三个典型原因

我见过太多新手在最初一步就卡住,把常见原因整理下:

现象可能原因解决办法
按住 BOOTSEL 插 USB 后电脑无弹出 U 盘USB 线是充电线,没有数据线芯换一根能传数据的线
U 盘出现了但是拖入固件没反应固件文件名格式不对或板子已烧录过改名firmware.uf2再拖一次
烧录后 Thonny 识别不到端口USB 驱动没装或 Thonny 版本太老升级 Thonny 到最新版
固件下载下来是 .bin 或 .hex 文件下载错了版本的固件到 MicroPython 官网找 .uf2 文件

排障顺序我建议:先换数据线,再换 USB 口,然后重启 Thonny,最后才考虑驱动问题。九成情况是线的问题。

6.2 运行代码时报错的排查思路

MicroPython 报错信息相对友好,但新手还是容易懵。我挑几个最常见的:

OSError: [Errno 19] ENODEV这个报错几乎等于“找不到设备”,通常出现在 I2C 上。排查方向:确认设备接线是否有松动、设备供电是否正常、地址是否正确。可以用一行代码扫描总线:

from machine import I2C, Pin i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000) print(i2c.scan())

如果输出的列表是空的,说明设备没被识别到,99% 是接线问题。如果输出的地址和你预期不同(比如 OLED 显示是 0x3C、0x3D 其中之一),把程序里的设备地址改成实际扫描到的值就行。Thonny 有时候会缓存模块代码,改完函数没生效,可以在 Shell 里执行import machine; machine.reset()软复位。

ValueError: invalid pin表示你用的引脚号不存在或已被复用。Pico 的 GPIO 编号是 0-28,但并不是每个都能当普通 IO 用,像是 GP23、GP24、GP25 在 MicroPython 里虽然有定义,但 GP23/24 是板载 Flash 芯片的专用引脚,如果你强行配置,板子会不稳定。GP25 是 LED 引脚,可以用。

MemoryError内存不足说不常见但确实存在。MicroPython 在 RP2040 上有 264KB 内存,串字符串处理偶尔会撑爆。解决思路:不要定义过大的列表、及时释放不再用的变量(比如del掉临时对象)、避免在循环里不断创建新对象。

6.3 电源方案的三个讲究

新手最容易忽略的就是电源。Pico 额定工作电流大约 20-50mA,但外接一堆传感器后电流需求会暴涨。我当时接一个 DHT22 + OLED + 蜂鸣器,瞬间电流能到 80mA 以上。用电脑 USB 口供电没问题,如果是用充电宝,要注意充电宝休眠机制:电流太小时有些充电宝会自动断电。解决方法:在项目中加一个周期性闪烁的 LED 保持最小电流输出(俗称“防休眠负载”),或者用带常电的充电头。

另外千万不要直接拿 5V 电源接到 Pico 的 3.3V 引脚上。Pico 板载稳压芯片只能从 VSYS 或 VBUS 输入 5V(或者从 3.3V 引脚输入 3.3V),搞混了会烧芯片。我刚上手时因为在面包板接线时不小心把 5V 和 3.3V 短接,直接报废了一块板子,到现在都在提醒学生“上电前查三遍线”。

6.4 MicroPython 版本兼容性问题

MicroPython 的 API 偶尔会调整,不同版本间代码兼容性不保证。比如旧版本用machine.Pin(25, machine.Pin.OUT)创建引脚,新版本支持直接Pin(25, Pin.OUT),两者都行;但是 PWM 的 duty 接口曾经是duty(0-1023),后来统一改成了duty_u16()。你在网上找例程时,如果跑的报错原因和 API 相关,第一件事就是去 MicroPython 官网查当前版本的文档。

我自己的习惯是每个项目文件夹里保存两个东西:requirements.txt一样的依赖说明(主要记录固件版本和库文件版本),外加一个firmware.bak.uf2备份好用的固件。这样无论什么时候回看项目,都能复现当时的运行环境。

6.5 送给入门者的几条实用心得

最后说几个我在带新手时反复强调的点。

第一,先跑通再理解。硬件开发有个特点:把你的第一个 LED 点亮,带给人的正反馈远超啃下十章理论。先按我的步骤把点灯跑通,再回头研究为什么。

第二,用交互式 Shell 验证一切。Thonny 的 Shell 是你最好的 Debug 工具,不确定某个函数怎么用?直接在 Shell 里敲help()查看对象方法列表。我在接手别人的旧代码时都会先在 Shell 里逐行执行,比看文档快得多。

第三,善用板载 LED 做状态指示。捕获异常时点亮它、启动完成时闪烁两下、某个条件满足时呼吸灯快闪,这些零成本的状态反馈会让你排查问题快很多。等到程序大到开始触摸到“逻辑复杂”的边缘,这三条习惯会帮你省下大量 Debug 时间。

我手头有几块 Pico 常年插在不同地方干着不同的活:一块在书桌上跑温湿度计,一块挂在阳台上做光照传感器,还有一块被我做成了迷你游戏机。说真的,在学会 MicroPython 之前,我从没想过做硬件能这么顺手。这个“第一课”覆盖的内容,足以支撑你完成生活中 90% 的小型电子创意。希望这篇文章能让你少走点弯路,把时间花在真正有意思的项目上。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询