MicroPython快速上手:在ESP32上用Python开发物联网传感器节点
做物联网传感器节点,传统嵌入式开发往往被C语言、交叉编译、烧录工具链拖慢。MicroPython的出现改变了这一局面——它在ESP32上内置Python解释器和REPL,让你能像写脚本一样开发嵌入式设备。本文带你半小时跑通"固件烧录→传感器读取→WiFi数据上报"的完整链路。
一、固件烧录:让ESP32学会Python
首先从MicroPython官网下载对应ESP32的固件bin文件。注意区分:常规版本、SPIRAM版本(支持外部PSRAM的型号),初学者使用稳定版固件即可。然后用esptool擦除Flash并烧录:
pip install esptool
# 擦除旧固件(避免残留数据干扰)
esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash
# 烧录MicroPython,0x1000是ESP32的标准起始地址
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 460800 \
write_flash -z 0x1000 esp32-20220618-v1.19.1.bin
烧录完成后,用串口终端连接开发板(波特率115200),按复位键应看到>>>提示符。开发工具推荐Thonny IDE,其提供了简洁的代码编辑器和直接的设备交互界面,在解释器设置中选择ESP32对应的串口端口即可开始编程。
二、硬件连接:DHT11温湿度传感器
ESP32的GPIO工作电压为3.3V,连接传感器时务必注意电压电平匹配。以DHT11为例:
DHT11 VCC → ESP32 3.3V
DHT11 DATA → ESP32 GPIO4
DHT11 GND → ESP32 GND
DATA线需接上拉电阻。若使用多个传感器或读数异常,建议单独给DHT11供电,避免供电不足。
三、读取传感器数据
在Thonny中新建文件,编写如下代码并运行:
import machine, dht, time
sensor = dht.DHT11(machine.Pin(4))
while True:
try:
sensor.measure()
temp = sensor.temperature()
hum = sensor.humidity()
print("温度: {}°C, 湿度: {}%".format(temp, hum))
except OSError as e:
print("传感器读取失败:", e)
time.sleep(2)
DHT11的测量范围是20-90%RH和0-50℃,精度±5%。如需更高精度可换用DHT22,仅需将dht.DHT11改为dht.DHT22即可。
四、连接WiFi并上报数据
物联网节点的核心是数据上云。下面示例连接WiFi,并通过socket搭建一个轻量HTTP服务,浏览器访问即可看到实时数据:
import network, socket, dht
from machine import Pin
# 1. 连接WiFi
def connect_wifi(ssid, pwd):
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, pwd)
while not wlan.isconnected():
pass
print("IP地址:", wlan.ifconfig()[0])
connect_wifi("你的SSID", "你的密码")
# 2. 启动HTTP服务
sensor = dht.DHT11(Pin(4))
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
print("HTTP服务已启动")
while True:
cl, _ = s.accept()
sensor.measure()
resp = """HTTP/1.0 200 OK
Content-type: text/html
<h1>温度: {t}°C</h1><h1>湿度: {h}%</h1>""".format(
t=sensor.temperature(), h=sensor.humidity())
cl.send(resp)
cl.close()
将代码保存为main.py并上传到ESP32,设备每次上电便会自动运行。
五、进阶:MQTT上报
若需要管理数百个设备,HTTP轮询效率太低,应改用MQTT。通过umqtt.simple库,每10秒向Broker推送一次数据:
from umqtt.simple import MQTTClient
client = MQTTClient("ESP32_01", "192.168.1.50")
client.connect()
client.publish(b"home/sensors/temp_hum", "temp:{},hum:{}".format(temp, hum))
注意MicroPython中MQTT主题必须是bytes对象,这是新手最常踩的坑。
六、开发调试技巧
三个实战经验:
1. 主动GC:处理完大JSON或长HTML后调用gc.collect(),避免内存碎片
2. 循环让出CPU:while True中务必加time.sleep_ms(10),否则芯片温度会飙升5-10°C
3. 异常处理:WiFi/I2C代码必须用try...except包裹,一次网络抖动就可能导致设备挂死
写在最后
MicroPython的价值不仅是"不用写C",更在于它把嵌入式开发迭代速度提升了三倍——改代码、保存、立即在板子上运行,没有编译等待。从环境搭建到WiFi数据上报,整个流程可控制在30分钟内。对于智能家居、环境监测、工业传感等场景,ESP32+MicroPython是当前性价比最高的组合:硬件成本不到50元,软件开发效率却堪比云端。当你熟悉这套套路后,还可以进一步探索蓝牙BLE、MQTT、WebREPL无线升级等高级玩法,让传感器节点真正融入物联网大生态。





