MicroPython+STM32快速原型验证:一周完成物联网产品功能Demo
STM32跑MicroPython适合做物联网Demo:GPIO、I2C、SPI、UART、定时器全用Python调,网络走外挂WiFi/4G模块或片上网口,传感器驱动写几个类就能跑。官方stm32端口支持F401/F405/F429/F746等,Nucleo、Pyboard、部分国产F407板都可刷;Nucleo/Discovery用ST-LINK烧,DFU板用dfu-util,也可通过STM32CubeProgrammer下载。 立创天空星F407类板可用Web DFU烧hex,烧完出虚拟串口REPL,Thonny直接传main.py。
一、固件与点灯验收
先刷对应BOARD固件,UART接115200进REPL。点灯验证运行环境:
from machine import Pin
import time
led = Pin("PC13", Pin.OUT) # 按具体板卡改引脚
while True:
led.value(0); time.sleep(0.5)
led.value(1); time.sleep(0.5)
能闪再说传感器和网络;不要一上来写大循环,先把boot.py放网络初始化、main.py放业务。
二、I2C传感器与本地处理
以BME280温湿度气压为例,I2C读原始值后在板端做阈值、滑动平均,减少上云垃圾数据:
from machine import I2C, Pin
import bme280, time
i2c = I2C(1, scl=Pin("PB8"), sda=Pin("PB9"), freq=100000)
sensor = bme280.BME280(i2c=i2c)
buf = []
def sample():
t, h, p = sensor.read_compensated_data()
buf.append(t);
if len(buf) > 10: buf.pop(0)
avg = sum(buf)/len(buf)
return round(avg,2), round(h,2), round(p/100,2)
while True:
print(sample()); time.sleep(2)
没有BME280可换SHT30、AHT10,I2C地址不同而已;模拟量走ADC,电机/继电器走GPIO+PIN IRQ,结构不变。
三、外挂通信与MQTT上云
STM32多数F4/F7无内置WiFi,Demo用UART接ESP-AT或SPI以太网控制器最稳。网络通了再用umqtt.simple发布,umqtt.robust做重连:
from umqtt.robust import MQTTClient
import ujson, time, machine
def net_up():
# 以AT WiFi模块为例,实际封装UART发送AT指令
uart = machine.UART(3, 115200)
uart.write('AT+CWJAP="SSID","PWD"\r\n')
return uart
client = MQTTClient("stm32_demo", "192.168.1.10", port=1883, keepalive=60)
client.connect()
while True:
t,h,p = sample()
payload = ujson.dumps({"temp":t,"hum":h,"press":p,"ts":time.time()})
try:
client.publish("demo/env", payload, qos=1)
except Exception:
try: client.connect()
except: pass
client.check_msg() # 非阻塞收下行指令
time.sleep(5)
下行控制单独订阅"demo/cmd",回调里只置标志或改全局设定,别在回调做长延时。MQTT比HTTP省流量,弱网Demo优先用pub/sub。
四、一周落地计划
Day1:选板刷MicroPython,ST-LINK/DFU验证REPL、点灯、看machine.freq();Day2:I2C接温湿度/气压,写driver类,做本地平均和越限;Day3:UART AT WiFi或SPI以太网通外网,DNS、Broker连通;Day4:MQTT定时上云+订阅指令,云端用EMQX/Mosquitto看曲线;Day5:加看门狗、异常重启、离线缓存到Flash文件;Day6:OLED/串口屏显示、按键配参数;Day7:整合main.py+boot.py,写README和演示脚本。复杂项目把代码拆bootstrap/drivers/tasks/main,避免单文件大循环。
五、稳定性与转C边界
MicroPython原型别踩三坑:长期运行定期gc.collect()防碎片;MQTT用robust或自己指数退避重连;写Flash别每秒落盘,用RAM缓冲定时写。对实时性要求高、需要低功耗休眠几个月、或要跑大量加密/协议栈,Demo验证完再移植STM32Cube+C。原型阶段用Python确认点位、阈值、Topic模型和上云字段,量产后C侧基本照着同一套数据字典重写即可,不返工。
按“STM32刷MicroPython—I2C采传感器—UART/以太网通网—MQTT上云—看门狗缓存”推进,普通环境监控、资产上报、简单控制Demo一周可交;若涉及硬实时闭环,只把MicroPython当前期算法和点表验证,不在Python里做毫秒级控制。





