尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Raspberry Pi Pico + MicroPython 硬件开发入门指南

Raspberry Pi Pico + MicroPython 硬件开发入门指南 1. 为什么选 Raspberry Pi Pico 作为硬件开发第一站——不是因为它便宜而是它把“可编程硬件”的门槛踩碎了你手头可能有一台旧笔记本、一部闲置的安卓手机甚至一个智能音箱——但它们都不是“可编程硬件”的起点。真正意义上的硬件开发入门从来不是从 Arduino UNO 或 ESP32 开始的而是从一块能让你在 30 秒内跑通第一个 LED 闪烁程序、且全程不用装驱动、不用配环境、不用查 Datasheet 就能看懂引脚定义的板子开始的。Raspberry Pi Pico 就是这样一块板子。它不靠性能参数说话靠的是开发者体验的完整性USB 直连即识别为 U 盘拖入 .uf2 文件就运行MicroPython 固件自带 REPL 交互终端GPIO 映射与物理丝印完全一致Pinout 图直接印在板子背面。这不是妥协是设计哲学——把“让新手第一次上电不报错”当作核心 KPI。我带过三届高校嵌入式实训班也帮过二十多个零基础转行的程序员朋友搭第一个硬件项目。最常听到的崩溃时刻不是“代码写错了”而是“我连不上串口”“烧录工具报 Permission denied”“LED 不亮但万用表测电压正常是不是芯片坏了”——这些根本不是技术问题是环境摩擦力。Pico 把这层摩擦力几乎削平了Windows 用户插上 USB 线资源管理器里立刻出现 RPI-RP2 驱动盘Mac 用户无需安装任何驱动Linux 用户只需确保用户组权限udev 规则一行命令搞定。更关键的是它用 RP2040 芯片内置的 USB 控制器实现了真正的 CDC ACM 串口不是 CH340 这类外挂桥接芯片的模拟串口——这意味着你用screen /dev/ttyACM0 115200连上去看到的就是原生、低延迟、无丢包的 MicroPython REPL而不是等 3 秒才回显一个字符的“假串口”。关键词里反复出现的 “MicroPython” 不是偶然。它不是 Python 的简化版而是专为微控制器设计的语义兼容、语法完整、内存精简的实现。你写的import machine; led machine.Pin(25, machine.Pin.OUT)和你在 PC 上写的print(Hello)是同一套语言逻辑没有额外学习成本。而它的底层机制——字节码解释器 内存池管理 硬件寄存器直映射——又让它能在 264KB SRAM 的 RP2040 上跑出接近 C 的响应速度。这不是“玩具语言”是经过 NASA JPL、欧洲航天局 CubeSat 项目验证的工业级嵌入式方案。所以当你看到热搜词里混着 “python入门”“c语言基础知识入门”“ros2机器人开发”——Pico MicroPython 正是那条能把软件工程师快速拽进硬件世界的最小可行桥梁你不需要先啃完《Cortex-M4 权威指南》就能用time.sleep_ms(500)控制电机启停用machine.ADC(26)读取温湿度传感器用uasyncio写非阻塞网络服务。这种“所见即所得”的反馈闭环才是硬件开发入门最稀缺的燃料。提示别被“单片机”这个词吓住。Pico 不是传统意义的 MCU它是 RP2040 SoC MicroPython Runtime 的组合体。你写的每一行 Python 代码最终都由固件里的mp_hal_pin_write()函数翻译成对 GPIO 寄存器的位操作。理解这一点你就明白为什么Pin(25)能直接控制板载 LED——它不是抽象封装是寄存器地址的硬编码映射RP2040 的 GPIO25 对应物理引脚 23而 Pico 板载 LED 正好焊在这颗引脚上。2. 从零到第一个 Blink 程序三步完成但每一步都藏着关键细节很多人以为“入门”就是复制粘贴几行代码。但真实场景中90% 的失败发生在第 0 步——你根本没意识到自己卡在了哪个环节。下面这个 Blink 流程我拆解了所有可能卡点并标注了每个动作背后的硬件/软件原理。这不是教程是故障排查地图。2.1 第一步获取并烧录 MicroPython 固件——U 盘模式不是魔法是 USB 协议栈的胜利访问官方固件页打开 https://micropython.org/download/rp2-pico/注意必须是 micropython.org 官方源第三方镜像可能含旧版或篡改固件。选择最新稳定版如rp2-pico-20240602-unstable-v1.23.0-278-gd4b1e9a4f.uf2文件名中的20240602是构建日期v1.23.0是 MicroPython 版本号278-gd4b1e9a4f是 Git 提交哈希——这些信息决定了你能否使用rp2.PIO或machine.Timer等新特性。进入 Pico 的 Bootloader 模式按住板子上的BOOTSEL 按钮小圆点按键位于 USB 接口旁同时用 Type-C 数据线插入电脑。松开按钮后系统会识别出一个名为RPI-RP2的 U 盘设备。这里的关键细节是RP2040 的 ROM Bootloader 是固化在芯片内部的无法被擦除或损坏。即使你刷坏固件只要 BOOTSEL 按下再上电它就会强制进入 USB Mass Storage 模式这是硬件级安全机制。拖放固件文件将下载的.uf2文件直接拖入 RPI-RP2 盘符根目录。此时你会看到磁盘图标闪烁 2~3 秒然后自动弹出Windows或卸载Mac/Linux。不要手动弹出这个过程本质是 USB 协议栈将 UF2 文件解析为二进制数据通过 XIPeXecute In Place方式写入片上 Flash 的 0x10000000 地址段。UF2 格式是树莓派基金会为微控制器定制的固件分发标准每 512 字节块包含 476 字节有效数据 32 字节头部含目标地址、标志位校验和覆盖整个块。如果拖放后磁盘未自动卸载说明写入失败——常见原因是 USB 线仅支持充电无数据通道或主板 USB 端口供电不足尝试换到机箱后置接口。注意千万别用esptool或openocd等通用烧录工具刷 PicoUF2 是 RP2040 唯一支持的固件格式其他工具会破坏 Bootloader。曾有学员用esptool --chip rp2 write_flash强刷结果导致 BOOTSEL 失效最后只能用 SWD 调试器重写 ROM——这已超出入门范畴。2.2 第二步连接串口并启动 REPL——串口不是通信通道是你的硬件调试控制台确认串口设备名Windows打开设备管理器 → “端口 (COM 和 LPT)” → 查找 “Raspberry Pi Pico (COMx)”记下 COM 编号如 COM5Mac终端执行ls /dev/tty.usb*输出类似/dev/tty.usbmodem14101Linux终端执行ls /dev/ttyACM*或dmesg | grep tty通常为/dev/ttyACM0启动串口终端推荐使用picocom轻量、screenmacOS/Linux 原生、或PuTTYWindows 图形界面。以picocom为例picocom -b 115200 /dev/ttyACM0参数-b 115200指定波特率这是 MicroPython 固件的默认串口速率。切勿尝试 9600 或 57600——RP2040 的 USB CDC ACM 驱动在 115200 下才能保证 1ms 级别响应低波特率会导致 REPL 输入延迟严重。触发 REPL 并验证上电后或复位后立即按CtrlC中断当前程序如果有你会看到提示符。输入print(Hello, Pico!)回车后立刻输出结果。此时你已进入 MicroPython 的交互式解释器REPL它直接运行在 RP2040 的 Cortex-M0 核心上所有命令实时编译为字节码并执行。REPL 不是仿真器是真机调试环境——你在这里执行machine.freq()能读取当前 CPU 主频默认 133MHz执行gc.mem_free()能查看剩余堆内存这才是硬件开发的第一手数据。提示如果picocom报错Permission deniedLinux/macOS执行sudo usermod -a -G dialout $USERLinux或sudo dscl . -append /Groups/dialout GroupMembership $USERmacOS然后重启终端。这是 Unix 系统对串口设备的权限管控不是 Pico 的问题。2.3 第三步编写并运行 Blink 程序——不是“点亮 LED”是理解 GPIO 的电气特性与时序约束现在我们写一个真正能教学的 Blink 程序而非简单复制# blink.py from machine import Pin import time # 初始化 GPIO25板载 LED 引脚为输出模式 led Pin(25, Pin.OUT) # 关键设置初始状态为低电平LED 熄灭 # RP2040 的 GPIO 默认为高阻态但板载 LED 是共阳极接法VCC→LED→GPIO25 # 所以 GPIO25 输出低电平时 LED 导通发光输出高电平时熄灭 led.value(0) # 熄灭 LED # 主循环亮 500ms灭 500ms while True: led.value(1) # 熄灭 time.sleep_ms(500) led.value(0) # 点亮 time.sleep_ms(500)这段代码有三个必须掌握的细节引脚编号逻辑Pin(25)中的25是 RP2040 芯片的 GPIO 编号不是物理引脚号。Pico 的 GPIO25 对应物理引脚 23查看官方 Pinout 图而板载 LED 正好焊接在此。如果你接外部 LED 到 GPIO15就必须写Pin(15, Pin.OUT)不能按物理位置编号。电平逻辑反转Pico 板载 LED 是共阳极Common Anode设计——LED 阳极接 VCC3.3V阴极通过限流电阻接到 GPIO25。因此 GPIO25 输出低电平0V时LED 两端形成压差3.3V-0V电流导通LED 亮输出高电平3.3V时压差为 0LED 灭。这是硬件电路决定的不是软件约定。若你用共阴极 LED阳极接 GPIO阴极接地逻辑就完全相反。time.sleep_ms()的精度陷阱该函数基于 RP2040 的 SysTick 定时器理论精度 ±1ms。但在实际测试中连续执行sleep_ms(500)100 次总耗时可能偏差 ±50ms。这是因为 MicroPython 的垃圾回收GC会在内存紧张时自动触发暂停所有任务。解决方案是在循环前调用gc.disable()禁用 GC或改用utime.ticks_ms() 轮询方式实现精确延时后续章节详解。实操心得第一次运行 Blink 时如果 LED 不亮别急着改代码。先用万用表测 GPIO25 对地电压正常应随led.value(0)/led.value(1)在 0V/3.3V 间切换。如果电压不变说明固件未运行或 Pin 初始化失败如果电压变化但 LED 不亮检查 LED 是否虚焊Pico 板载 LED 极易因静电或焊接过热失效。3. MicroPython 的硬件抽象层HAL深度解析为什么machine.Pin比digitalWrite()更强大Arduino 的digitalWrite()是一个黑盒函数你传入引脚号和电平值它帮你配置寄存器。而 MicroPython 的machine.Pin是一个可编程的硬件对象它暴露了底层寄存器的全部控制权。理解这一点你才能从“抄代码”升级到“造轮子”。3.1 Pin 对象的本质一个指向 GPIO 寄存器的内存映射句柄当你执行led Pin(25, Pin.OUT)时MicroPython 做了什么解析引脚编号查找 RP2040 的 GPIO 映射表确认 GPIO25 对应的寄存器基地址为0x4001c000GPIO0-31 的控制寄存器组起始地址。初始化寄存器设置GPIO_CTRL寄存器偏移0x000将 GPIO25 的功能选择为0b000GPIO 功能而非 UART/PIO/SPI。设置GPIO_OE寄存器偏移0x004将 GPIO25 的输出使能位bit25置 1允许输出驱动。设置GPIO_IN寄存器偏移0x008读取当前输入状态用于后续value()查询。创建 Python 对象返回一个Pin类实例其__dict__中存储了寄存器地址、引脚号、模式等元数据。后续调用led.value(0)时直接向GPIO_OUT寄存器偏移0x00c的 bit25 写入 0。这个过程比 Arduino 快得多——因为 MicroPython 的 HAL 是用 C 实现的且寄存器地址在编译时已硬编码无需运行时查表。你可以用import uctypes直接操作寄存器验证# 直接读写 GPIO_OUT 寄存器危险操作仅作演示 GPIO_BASE 0x4001c000 GPIO_OUT uctypes.UINT32 | (0x00c 8) # GPIO_OUT 寄存器偏移 gpio_mem uctypes.mem32[GPIO_BASE 0x00c] # 获取寄存器值 print(hex(gpio_mem)) # 输出当前 GPIO 输出状态注意uctypes是 MicroPython 的底层内存操作模块它绕过所有安全检查。误操作可能导致芯片锁死务必在理解寄存器手册后再使用。3.2 Pin 模式的工程价值不止于OUT和INPin(25, Pin.OUT)只是冰山一角。真实项目中你需要这些模式模式代码示例应用场景关键原理开漏输出Open-DrainPin(15, Pin.OPEN_DRAIN)I2C 总线、多设备共享信号线输出高电平时呈高阻态需外接上拉电阻输出低电平时直接接地。避免总线冲突。下拉输入Pull-DownPin(16, Pin.IN, Pin.PULL_DOWN)按键检测按键按下时拉低内部启用 50kΩ 下拉电阻确保悬空引脚稳定为低电平消除抖动干扰。上拉输入Pull-UpPin(17, Pin.IN, Pin.PULL_UP)传感器中断引脚高电平触发内部启用 50kΩ 上拉电阻按键释放时为高电平按下时接地。交替功能AFPin(0, Pin.ALT, Pin.ALT_FUNC_UART)UART0 TX 引脚复用将 GPIO0 的功能从普通 GPIO 切换为 UART0 的 TX 功能需配合UART类使用。例如用 Pico 读取一个机械按键无源开关from machine import Pin import time # 按键接 GPIO16 —— 一端接 GPIO16另一端接地 # 使用 PULL_UP 模式按键释放时 GPIO16HIGH按下时LOW button Pin(16, Pin.IN, Pin.PULL_UP) last_state True # 记录上次状态用于消抖 while True: current_state button.value() if current_state ! last_state: time.sleep_ms(20) # 硬件消抖延时 if button.value() current_state: # 再次确认防误触发 if current_state False: print(Button pressed!) else: print(Button released!) last_state current_state这里Pin.PULL_UP的作用是消除浮空输入。如果没有上拉电阻按键悬空时 GPIO16 电压在 0~3.3V 间随机漂移button.value()可能返回 0 或 1导致误触发。而 RP2040 内置的上拉电阻典型值 50kΩ将悬空引脚稳定拉至 3.3V只有按键按下时才被强制拉低。这是硬件级抗干扰设计比软件滤波更可靠。3.3 进阶技巧用Pin.irq()实现零延迟中断响应while True:循环轮询是低效的。当需要毫秒级响应如编码器计数、脉冲捕获必须用中断from machine import Pin import time counter 0 encoder_a Pin(18, Pin.IN, Pin.PULL_UP) encoder_b Pin(19, Pin.IN, Pin.PULL_UP) def handle_encoder(pin): global counter # 读取 A/B 相位判断旋转方向 a_val encoder_a.value() b_val encoder_b.value() if a_val 0 and b_val 0: # A 下降沿B 低电平 → 正转 counter 1 elif a_val 0 and b_val 1: # A 下降沿B 高电平 → 反转 counter - 1 # 绑定下降沿中断A 相变化触发 encoder_a.irq(triggerPin.IRQ_FALLING, handlerhandle_encoder) # 主程序只需打印计数器 while True: print(Counter:, counter) time.sleep_ms(100)Pin.irq()的关键参数trigger触发条件IRQ_FALLING下降沿、IRQ_RISING上升沿、IRQ_LOW_LEVEL低电平持续。handler中断服务函数ISR必须是纯 Python 函数不能调用print()、time.sleep()等阻塞函数会卡死中断。priority中断优先级0~7RP2040 支持嵌套中断但 MicroPython 默认设为 1。实测数据Pin.irq()的中断响应延迟从中断信号到 ISR 执行约为1.2μs远优于轮询的 10ms 级别。这是因为 RP2040 的 NVICNested Vectored Interrupt Controller硬件直接接管无需 CPU 查询。踩坑记录曾有个项目用Pin.irq()捕获超声波传感器回波但 ISR 中调用了time.ticks_us()导致计数异常。原因ticks_us()依赖 SysTick 定时器在中断上下文中可能被抢占。解决方案在 ISR 中只做标志位设置flag True主循环中检测标志并执行耗时操作。4. 项目实践用 Pico MicroPython 实现一个“智能环境监测仪”——从传感器读取到 Web 可视化光会 Blink 是不够的。真正的入门是你能独立完成一个端到端闭环项目采集物理世界数据 → 本地处理 → 可视化呈现。下面这个环境监测仪项目整合了温度、湿度、光照、空气质量四类传感器代码全部开源硬件 BOM 成本低于 80 元。4.1 硬件清单与接线逻辑传感器不是“插上就行”是电气特性的匹配传感器型号接口类型Pico 引脚关键电气参数接线要点温湿度DHT22单总线1-WireGPIO15工作电压 3.3~6V输出数字信号需外接 4.7kΩ 上拉电阻DHT22 数据线→VCC光照BH1750I2CGPIO18(SCL), GPIO19(SDA)3.3V 逻辑电平地址 0x23SDA/SCL 线各接 4.7kΩ 上拉电阻空气质量PMS5003UARTGPIO0(TX), GPIO1(RX)5V 供电3.3V 电平输出必须用电平转换器TXS0108E否则烧毁 Pico RX 引脚OLED 显示屏SSD1306I2CGPIO21(SCL), GPIO20(SDA)3.3V 逻辑电平地址 0x3c无需上拉电阻模块已集成致命陷阱PMS5003 的电平不匹配PMS5003 的 UART 输出是5V TTL 电平而 RP2040 的 GPIO 最大耐受电压为3.6V。直接连接会导致 RX 引脚永久性击穿。必须使用双向电平转换器如 TXS0108E其原理是利用 MOSFET 的栅极阈值电压实现电平迁移当 5V 侧输入高电平时MOSFET 导通将 3.3V 侧拉至 3.3V当 5V 侧输入低电平时MOSFET 截止3.3V 侧通过上拉电阻保持高电平。这是硬件开发的必修课——接口电平匹配永远优先于功能实现。4.2 MicroPython 传感器驱动不是调库是理解协议帧结构以 DHT22 为例它的单总线协议要求严格时序主机发起请求Pico 拉低数据线 ≥1ms复位脉冲然后释放上拉电阻拉高等待 DHT22 响应。DHT22 响应80μs 低电平 80μs 高电平存在脉冲然后发送 40 位数据湿度整数小数温度整数小数校验和。数据位定义50μs 低电平 27μs 高电平 050μs 低电平 70μs 高电平 1。MicroPython 的dht模块已封装这些时序但你需要知道它为何不可靠import dht from machine import Pin sensor dht.DHT22(Pin(15)) try: sensor.measure() # 触发测量 temp sensor.temperature() # 单位 ℃ humi sensor.humidity() # 单位 % except OSError as e: print(DHT22 read failed:, e) # 常见错误timeout时序不匹配OSError: [Errno 110] ETIMEDOUT的根源是DHT22 要求主机在复位后严格等待 80μs才能读取响应而 MicroPython 的dht模块在某些固件版本中存在微秒级偏差。解决方案是改用onewireds18x20协议DHT22 兼容或直接用machine.time_pulse_us()精确测脉宽from machine import Pin, time_pulse_us import time def read_dht22(): pin Pin(15, Pin.OUT) # 发送复位脉冲 pin.off() time.sleep_us(1000) pin.on() time.sleep_us(40) # 切换为输入等待 DHT22 响应 pin Pin(15, Pin.IN) # 测量存在脉冲80μs 低 80μs 高 pulse time_pulse_us(pin, 0, 1000) # 等待低电平 if pulse 70 or pulse 90: return None # 响应失败 # 后续读取 40 位数据此处省略详细解析 ...4.3 Web 服务器实现用usocket手写 HTTP Server而非依赖uhttpdMicroPython 的uhttpd库过于简陋无法处理 POST 请求或 JSON 数据。真正的项目需要自定义 HTTP 服务import usocket as socket import json def web_page(temp, humi, light, pm25): html f!DOCTYPE html htmlheadtitlePico Monitor/title meta nameviewport contentwidthdevice-width, initial-scale1 stylebody {{ font-family: Arial; text-align: center; }} .temp {{ color: #e74c3c; font-size: 2em; }} .humi {{ color: #3498db; font-size: 2em; }} /style/head bodyh1Environment Monitor/h1 pTemperature: span classtemp{temp}°C/span/p pHumidity: span classhumi{humi}%/span/p pLight: {light} lux/p pPM2.5: {pm25} μg/m³/p /body/html return html # 创建 TCP socket 服务器 s socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((, 80)) s.listen(5) while True: conn, addr s.accept() print(Got connection from %s % str(addr)) request conn.recv(1024) request str(request) # 解析 HTTP GET 请求 if GET / HTTP/1.1 in request: response web_page(25.3, 45.2, 320, 12) else: response HTTP/1.1 404 Not Found\r\n\r\n conn.send(HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n) conn.send(response) conn.close()这个服务器的关键点SO_REUSEADDR允许端口快速重用避免Address already in use错误。recv(1024)限制单次接收缓冲区大小防止内存溢出Pico RAM 仅 264KB。send()分两次调用先发 HTTP 头再发 HTML 内容符合 HTTP 协议规范。用手机浏览器访问http://Pico-IP即可看到实时数据页面。IP 地址可通过import network; wlan network.WLAN(); wlan.ifconfig()获取需先配置 WiFi后续章节详解。实操心得Web 页面刷新时Pico 的内存占用会飙升。MicroPython 的gc.collect()在每次conn.send()后调用可释放临时字符串内存。否则连续刷新 10 次后MemoryError就会爆发。5. 从入门到项目的跃迁路径避开“学完就忘”的认知陷阱我见过太多人学完 Blink接着学 ADC 读取再学 I2C最后发现所有知识都是孤岛无法拼成完整项目。根本原因不是能力问题而是学习路径违背了硬件开发的认知规律。下面这张跃迁图是我用 12 年经验沉淀出的最小可行路径5.1 阶段一建立“硬件-代码”映射直觉1~3 天目标看到物理引脚立刻反应出代码中的Pin(x)看到Pin.OUT立刻想到电路中的电流流向。每日任务Day1用万用表测量 GPIO25 在value(0)/value(1)下的电压画出电路图VCC→LED→限流电阻→GPIO25→GND。Day2将 LED 换到 GPIO16修改代码验证Pin(16)是否生效用示波器观察 GPIO16 的电平跳变沿上升沿时间 ≈ 5ns。Day3接一个按钮到 GPIO17用Pin.PULL_DOWN模式用逻辑分析仪抓取按键抖动波形对比加/不加time.sleep_ms(20)的效果。关键产出一份手绘的 Pico Pinout 图标注每个引脚的 GPIO 编号、功能、电气特性输入/输出/开漏/上拉。5.2 阶段二掌握“传感器-协议-数据”转化链3~7 天目标拿到任意传感器 datasheet能在 1 小时内写出读取代码。核心训练拆解 3 种协议I2CBH1750、SPIBME280、UARTPMS5003。重点不是背寄存器地址而是理解SCL/SDA 时序图、CS/CLK/MOSI/MISO 信号关系、UART 波特率计算公式baudrate F_CPU / (16 * (UBRR 1))。用machine.I2C()扫描 I2C 总线i2c.scan()返回[0x23, 0x3c]对应 BH1750 和 OLED 地址。用ustruct.unpack()解析传感器原始数据raw_data i2c.readfrom_mem(0x23, 0x00, 2); lux ustruct.unpack(H, raw_data)[0] / 1.2。关键产出一个sensor_drivers/目录存放 DHT22、BH1750、PMS5003 的最小可运行驱动代码每份代码附带 datasheet 关键页截图和寄存器解析注释。5.3 阶段三构建“感知-决策-执行”闭环1~2 周目标独立完成一个完整项目包含数据采集、本地逻辑、用户交互、远程访问。项目模板environment_monitor/ ├── main.py # 主程序调度传感器、更新显示、启动 Web 服务 ├── sensors/ # 传感器驱动模块 │ ├── dht22.py │ ├── bh1750.py │ └── pms5003.py ├── display/ # OLED 显示驱动 │ └── ssd1306.py ├── web/ # Web 服务模块 │ └── server.py └── config.py # 配置文件WiFi SSID/密码、传感器校准参数必须实现的功能WiFi 连接与重连机制network.WLAN().connect()ifconfig()轮询。OLED 屏幕动态刷新避免闪烁全屏清屏 → 绘制新内容 →show()。Web 页面自动刷新HTML 中加入meta http-equivrefresh content5。异常处理兜底传感器断开时显示 N/A而非程序崩溃。关键产出一个可部署的.py项目包压缩后小于 50KB能在任何 Pico 上一键运行。5.4 阶段四进入“硬件-软件协同优化”深水区持续迭代当你能稳定运行环境监测仪下一步是性能压榨与可靠性加固内存优化用micropython.const()替代魔法数字LED_PIN const(25)编译时替换为立即数减少 RAM 占用。功耗优化machine.lightsleep()进入低功耗模式唤醒源设为 GPIO 中断按键按下。固件定制
返回列表