2026年嵌入式开发趋势:Python 正在重塑嵌入式开发
01|开篇:别再只会写C语言了,Python已经杀进嵌入式了
上个月,一个做嵌入式的朋友找我吐槽,说他最近接了个项目,要求快速原型开发,本来想用C语言写,结果发现光是搭环境、写驱动、调通信就花了两周,还没开始写业务逻辑。
后来我建议他试试MicroPython,你猜怎么着?他用了三天就把原型跑起来了,代码量还减少了70%。
他跟我说的时候,语气里都是那种"早知道这么好用,我之前死磕C语言干嘛"的后悔。
说实话,这种感受我太懂了。前几年我也觉得,嵌入式开发不就是C语言的天下吗?Python那玩意儿,写写脚本还行,跑在嵌入式设备上?别开玩笑了,性能肯定不行,内存肯定不够用。
结果呢?这两年我用MicroPython做了好几个项目,脸被打得啪啪响。
今天这篇文章,我想跟你好好聊聊:Python到底是怎么杀进嵌入式领域的?什么时候该用Python,什么时候该用C/C++?MicroPython实战到底怎么玩?
02|为什么Python能在嵌入式领域立足?
先说说MicroPython到底是什么。简单说,就是一个精简版的Python 3解释器,专门为微控制器设计的,能跑在只有几十KB内存的MCU上。
第一次听说MicroPython的时候,我心里是打问号的:Python那么占内存,怎么可能跑在单片机上?
后来我查了一下数据,才发现自己真是孤陋寡闻。MicroPython的核心解释器,最小编译配置下只需要64KB Flash和16KB RAM,这是什么概念?就是一个普通的STM32F103C8T6(那款传说中的"蓝色药丸"开发板)就能轻松跑起来。
那为什么MicroPython能做得这么小?主要是做了这些取舍:
- 砍掉了Python标准库中不适合嵌入式的部分(比如多线程、网络库的完整版)
- 提供了硬件直接访问的API,可以直接操作寄存器、GPIO、定时器这些
你别说,这种"有所为有所不为"的思路,反而让MicroPython在嵌入式领域找到了自己的位置。
再说说开发效率的对比,这个我真的有发言权。
去年我做过一个项目,需要读取一个温度传感器的数据,通过WiFi上传到服务器,还要做一个简单的Web配置界面。
第一次用C语言做,光是:
前前后后花了我三周时间,代码写了快2000行,中间还踩了无数个坑。
后来项目要迭代,我干脆用MicroPython重写了一遍,你猜用了多久?
三天!代码量400行不到,而且逻辑清晰得多,可读性特别好。
那次之后我就明白一个道理:不是所有嵌入式项目都需要极致的性能和最小的资源占用,很多时候,开发效率才是最重要的。
而且MicroPython的生态现在真的越来越好了。你想读写个传感器?有现成的库。想连个WiFi?有现成的库。想用个显示屏幕?有现成的库。不用再像以前那样,每个项目都要从0开始写驱动,重复造轮子的时间省下来,都能多做几个项目了。
03|什么时候选Python,什么时候选C/C++?
这肯定是你最关心的问题:Python好是好,但总不能所有项目都用Python吧?
确实,Python不是万能的,得看场景。我给你总结了一张表,帮你快速判断:
不过我想多说一句:现在很多项目其实是混合开发的,Python做应用层,C/C++做底层,这才是最佳实践。
比如我之前做的一个工业数据采集项目:
- 底层用C语言写高速数据采集驱动(采样率1MHz,这个Python确实搞不定)
- 中间层用MicroPython做数据处理、网络传输、Web配置
这种组合,真的香!
04|MicroPython 实战:从0到1写一个项目
说了这么多理论,不如直接来个实战。今天我带你用MicroPython做一个最简单的项目:读一个DHT11温湿度传感器,把数据显示在OLED屏幕上。
别担心,即使你是第一次用MicroPython,跟着我一步步来,肯定能跑通。
第一步:准备硬件
你需要这些东西:
- 一块支持MicroPython的开发板(我推荐ESP32,性价比高,功能强)
- 一个0.96寸的I2C OLED屏幕(128x64分辨率)
ESP32真的是新手入门的最佳选择,二三十块钱,有WiFi有蓝牙,性能还强,最重要的是MicroPython对它的支持特别完善。
第二步:刷入MicroPython固件
这步其实很简单,比你想象的容易多了。
- 先去MicroPython官网下载ESP32的固件:https://micropython.org/download/ESP32_GENERIC/[1]
- 下载一个叫
esptool.py的工具,用Python安装就行:pip install esptool - 擦除原有固件:
esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash(Windows下端口是COMx) - 刷入新固件:
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 460800 write_flash -z 0x1000 esp32-20240222-v1.22.2.bin
就这么几步,MicroPython就刷好了!是不是比你想象的简单?
第三步:连接硬件
接线其实也不难,按照这个来:
DHT11 接线:
OLED 接线(I2C):
接好线之后,建议你用万用表检查一下有没有接反,特别是电源,接反了可能会烧东西,这个坑我踩过,别学我。
第四步:写代码
终于到了写代码的时候了!MicroPython的代码,真的比C语言简洁太多了。
你需要先安装一个IDE,我推荐Thonny,免费开源,对新手特别友好,还自带串口终端。
打开Thonny,把解释器选择为"MicroPython (ESP32)",然后就可以写代码了。
这是完整的代码,你可以直接复制:
from machine import Pin, I2Cimport dhtimport ssd1306import time# 初始化DHT11传感器dht_sensor = dht.DHT11(Pin(4))# 初始化I2C和OLED屏幕i2c = I2C(0, scl=Pin(22), sda=Pin(21))oled = ssd1306.SSD1306_I2C(128, 64, i2c)# 清屏oled.fill(0)oled.show()print("开始读取温湿度数据...")whileTrue:try:# 读取传感器数据 dht_sensor.measure() temp = dht_sensor.temperature() hum = dht_sensor.humidity()# 在串口打印数据print(f"温度: {temp}°C, 湿度: {hum}%")# 在OLED屏幕上显示 oled.fill(0) oled.text("Temperature:", 0, 0) oled.text(f"{temp} C", 0, 16) oled.text("Humidity:", 0, 32) oled.text(f"{hum} %", 0, 48) oled.show()except Exception as e:print(f"读取失败: {e}") oled.fill(0) oled.text("Read Error!", 0, 0) oled.show()# 等待2秒再读 time.sleep(2)
怎么样?这代码是不是特别清晰?每一行在做什么,一眼就能看出来。
第五步:运行代码
在Thonny里点击"运行"按钮,或者按F5,代码就会上传到ESP32并运行了。
如果一切正常,你应该能看到:
第一次看到自己写的代码在硬件上跑起来的时候,那种成就感,真的是太棒了!
避坑指南:我踩过的那些坑
写这篇文章的时候,我特意回忆了一下自己刚学MicroPython时踩过的坑,给你列出来,希望你别再踩:
电源问题:很多时候代码写得没问题,但硬件就是不工作,大概率是电源没供好。DHT11对电源还是有点敏感的,最好用3.3V,别用5V。
GPIO选择:ESP32的有些GPIO是启动时用于配置的,别乱用,建议先查一下ESP32的GPIO使用指南。
时序问题:DHT11的通信时序要求还是比较严的,如果你用的是其他开发板,可能需要调整一下时序参数。
内存问题:虽然MicroPython很省内存,但如果你的代码里有内存泄漏(比如不断创建大对象不释放),时间长了还是会出问题。
05|Python 嵌入式开发的最佳实践
既然要讲,那就讲透点。我给你分享几个我总结出来的Python嵌入式开发最佳实践。
性能优化:如何让Python代码跑得更快?
很多人担心Python在嵌入式上性能不够,其实只要方法得当,性能完全够用。
这几个优化技巧,都是我亲测有效的:
尽量用内置模块:MicroPython的内置模块都是用C语言写的,速度特别快,比如machine、time这些,能用就用。
避免频繁的内存分配:在循环里尽量不要创建新对象,最好在循环外创建好,循环里只更新值。
用数组代替列表:如果要存大量数字,用array.array代替普通的列表,内存占用更小,访问速度更快。
关键部分用C写:如果真的有性能瓶颈,可以把那部分用C语言写成扩展模块,然后在Python里调用。
内存管理:MicroPython的内存限制和应对策略
MicroPython的内存确实比PC上的Python小得多,所以写代码的时候得有点意识。
这几个方法能帮你省内存:
及时释放不用的对象:用del删除不用的变量,或者让变量超出作用域。
用gc.collect()手动垃圾回收:在合适的时机(比如主循环的末尾)手动调用一下垃圾回收,能让内存使用更稳定。
避免加载整个库:如果只用库的一个函数,就只导入那个函数,别导入整个库。
用 micropython.mem_info() 查看内存使用情况:这个函数能帮你了解内存都用在哪儿了,方便优化。
调试技巧:print调试、日志、错误处理
调试嵌入式代码,说实话,比调试PC上的代码麻烦点,因为没有那么方便的调试器。不过只要方法得当,还是能高效调试的。
print调试永远是王道:别小看print,在嵌入式开发里,print真的是最实用的调试方法。把关键变量的值打出来,把程序执行到哪儿了打出来,很多问题一下就清楚了。
写个简单的日志模块:可以封装一下print,加上时间戳和日志级别,比如DEBUG、INFO、WARNING、ERROR,这样日志更清晰。
用好异常处理:MicroPython支持完整的异常处理,try-except一定要用好,别让程序因为一个小错误就直接挂了。
用好REPL:MicroPython的REPL(交互式解释器)真的特别好用,可以直接输入代码测试,不用每次都上传整个文件。
代码组织:模块化、可维护性
代码写得多了,就会发现,代码组织得好不好,直接影响开发效率和维护成本。
这几个建议,都是我的经验之谈:
按功能分模块:把不同功能的代码分成不同的文件,比如sensor.py放传感器相关的代码,display.py放显示相关的代码。
写好注释和文档字符串:别觉得写注释浪费时间,等你过几个月再回来看自己的代码,就会感谢当初写注释的自己。
用配置文件:把硬件引脚、网络配置这些可变的东西放在配置文件里,别硬编码在代码里,改起来方便。
版本控制一定要用:Git真的是个好东西,即使是一个人开发,也建议用Git,能随时回退,能看到修改历史。
06|未来展望:Python 在嵌入式中的发展趋势
说了这么多现在,我也想跟你聊聊未来。我个人觉得,Python在嵌入式领域的发展,才刚刚开始。
这几个趋势,我觉得特别值得关注:
第一个趋势是TinyML + MicroPython。现在边缘AI越来越火,TensorFlow Lite for Microcontrollers已经能在很小的MCU上跑机器学习模型了,而MicroPython和TinyML的结合,能让AI嵌入式开发的门槛大大降低。
想想看,用Python写个图像识别或者语音识别的应用,直接跑在ESP32上,这在几年前想都不敢想,但现在已经可以实现了。
第二个趋势是WebAssembly + MicroPython。WebAssembly(Wasm)现在特别火,它能让代码在不同的平台上高效运行。如果能把Wasm带到MicroPython里,那很多现有的库就能很容易地移植到嵌入式平台了。
第三个趋势是生态的进一步完善。这两年我能明显感觉到,用MicroPython的人越来越多了,社区也越来越活跃。用的人多了,库自然就多了,工具自然就好用了,这是一个正向循环。
结尾|行动起来:今天就试试MicroPython
回顾一下,今天跟你聊了这么多:
- Python是怎么杀进嵌入式领域的,MicroPython的技术原理
- 什么时候该用Python,什么时候该用C/C++,还有混合开发的最佳实践
- 一个完整的MicroPython实战项目,从硬件准备到代码实现
- Python嵌入式开发的最佳实践,性能优化、内存管理、调试技巧、代码组织
- 未来的发展趋势,TinyML、WebAssembly这些值得关注的方向
说实话,我知道有些朋友可能还是会有顾虑:Python性能行不行?内存够不够用?出了问题好不好解决?
这些顾虑我都理解,因为当初我也有过。但我想跟你说:别光想,试试看。
找个周末,买一块ESP32开发板,花几个小时,跟着我今天的教程,把那个温湿度项目跑起来。当你看到自己写的Python代码在硬件上跑起来的时候,那种成就感,真的会让你上瘾。
而且,即使最后你发现Python不适合你的项目,那又怎么样?多学一个技能,多了解一种思路,对你来说只有好处,没有坏处。
最后,如果你在学习MicroPython的过程中遇到了什么问题,欢迎在评论区留言,我们一起讨论。
我也会在这个公众号里,持续分享更多嵌入式开发的实战内容,包括Python的,也包括C/C++的,还有FreeRTOS、嵌入式Linux这些。
关注我,我们一起,在嵌入式开发的路上,越走越远。
好了,今天的文章就到这里。如果觉得对你有帮助,别忘了点个「在看」,让更多的朋友看到。
我们下篇文章见!
引用链接
[1]https://micropython.org/download/ESP32_GENERIC/