第一部分:MicroPython 基础
1. MicroPython简介
- 定义:专为微控制器设计的精简Python 3实现,支持硬件直接操作。
- 特点:
- 语法兼容Python 3,但移除复杂功能(如多线程)。
- 支持GPIO、PWM、I2C、SPI等硬件接口。
- 适用于ESP32、ESP8266、Raspberry Pi Pico等开发板。
2. 开发环境搭建
硬件准备
- 推荐开发板:ESP32(性价比高,WiFi/BLE双模)、Raspberry Pi Pico(低成本,RP2040芯片)。
- 外设:杜邦线、面包板、传感器(DHT11、超声波模块等)。
软件配置
- 固件烧录:
- 下载固件:MicroPython官网
- 烧录工具:
esptool
(ESP系列)、rp2-flash
(树莓派Pico)。
- 编程工具:
- Thonny IDE(新手友好,内置REPL)。
- VS Code + Pymakr插件(支持远程调试)。
第一个程序
# 点亮板载LED(ESP32示例)
from machine import Pin
import time
led = Pin(2, Pin.OUT)
while True:
led.toggle()
time.sleep(1)
第二部分:核心语法与硬件操作
1. 基础语法
变量与数据类型
# MicroPython支持标准Python类型
value = 42
name = "ESP32"
data = [1, 2, 3]
sensor_data = {"temp": 25.5, "humi": 60}
流程控制
# 条件与循环
if temperature > 30:
alert()
elif temperature < 0:
freeze()
else:
normal()
for i in range(10):
print(i)
while sensor.is_active():
read_data()
2. 硬件交互
GPIO控制
from machine import Pin
button = Pin(14, Pin.IN, Pin.PULL_UP) # 按钮输入(上拉模式)
led = Pin(2, Pin.OUT) # LED输出
if button.value() == 0: # 按钮按下
led.on()
PWM调光/调速
from machine import PWM, Pin
pwm = PWM(Pin(13), freq=1000, duty=512) # 频率1kHz,50%占空比
pwm.duty(256) # 调至25%亮度
I2C/SPI通信
# I2C扫描设备(OLED显示屏为例)
from machine import I2C, Pin
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000)
devices = i2c.scan() # 返回设备地址列表(如[0x3C])
第三部分:智能硬件开发案例
案例1:环境监测系统(温湿度+云端上传)
功能
- 使用DHT11传感器采集温湿度。
- 通过WiFi将数据上传到物联网平台(如阿里云、ThingsBoard)。
- OLED屏幕本地显示数据。
硬件
- ESP32开发板
- DHT11温湿度传感器
- OLED显示屏(SSD1306)
- 面包板及杜邦线
代码示例
import network
import dht
import machine
import time
from umqtt.simple import MQTTClient
from ssd1306 import SSD1306_I2C
# 硬件初始化
i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21))
oled = SSD1306_I2C(128, 64, i2c)
d = dht.DHT11(machine.Pin(4))
# WiFi连接
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.connect("你的WiFi名", "密码")
while not sta.isconnected():
time.sleep(1)
# MQTT配置
client = MQTTClient("esp32", "mqtt服务器地址", port=1883, user="用户名", password="密码")
client.connect()
# 主循环
while True:
d.measure()
temp = d.temperature()
humi = d.humidity()
# OLED显示
oled.fill(0)
oled.text(f"Temp: {temp}C", 0, 0)
oled.text(f"Humi: {humi}%", 0, 20)
oled.show()
# 上传到MQTT
client.publish(b"sensor/temp", str(temp))
client.publish(b"sensor/humi", str(humi))
time.sleep(60) # 每分钟上传一次
案例2:智能家居灯光控制(手机APP+语音)
功能
- 通过手机APP远程控制LED开关。
- 支持语音指令(如“开灯”)。
- 自动根据光线强度调节亮度(可选光敏电阻)。
硬件
- ESP32开发板
- LED灯模块
- 光敏电阻(ADC读取)
- 继电器模块(控制高功率灯具)
- 麦克风模块(如MAX9814,用于语音)
代码要点
- Web服务器控制(HTTP)
import socket
from machine import Pin
led = Pin(2, Pin.OUT)
def start_web_server():
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
while True:
conn, addr = s.accept()
request = conn.recv(1024)
if "GET /on" in request:
led.on()
elif "GET /off" in request:
led.off()
conn.send("HTTP/1.1 200 OK\n\nLight Control OK")
conn.close()
- 语音控制(需结合离线语音识别模块)
- 使用LD3320等模块,通过串口接收指令:
from machine import UART
uart = UART(1, 9600)
while True:
if uart.any():
cmd = uart.read().decode().strip()
if "开灯" in cmd:
led.on()
案例3:智能农业灌溉系统
功能
- 土壤湿度检测(湿度传感器)。
- 自动控制水泵浇水。
- 数据上报至云端并生成报警阈值。
硬件
- ESP8266开发板
- 土壤湿度传感器(模拟量输出)
- 5V水泵+继电器
- 18650电池供电
代码逻辑
from machine import ADC, Pin
import network
import time
# 初始化硬件
soil = ADC(Pin(34)) # ESP32的ADC引脚
pump = Pin(4, Pin.OUT)
# 湿度阈值(需根据实测调整)
DRY_THRESHOLD = 2000
WET_THRESHOLD = 1000
def check_soil():
value = soil.read()
if value > DRY_THRESHOLD:
pump.on() # 开启水泵
time.sleep(5)
pump.off()
return value
# 主循环
while True:
moisture = check_soil()
print(f"当前湿度: {moisture}")
time.sleep(3600) # 每小时检测一次
案例4:GPS定位追踪器
功能
- 通过GPS模块获取经纬度。
- 通过4G模块(如SIM800L)发送位置到服务器。
- 低功耗设计(定时唤醒)。
硬件
- Raspberry Pi Pico(低功耗模式)
- NEO-6M GPS模块
- SIM800L 4G模块
- 锂电池
关键代码
from machine import UART, Pin
import time
# GPS数据解析
gps = UART(1, baudrate=9600, tx=Pin(4), rx=Pin(5))
while True:
if gps.any():
data = gps.readline()
if b'GPRMC' in data: # 定位语句
parts = data.split(',')
if parts[2] == 'A': # 有效定位
lat = parts[3] # 纬度
lon = parts[5] # 经度
send_to_server(lat, lon) # 通过4G发送
time.sleep(10)
案例5:智能垃圾桶(超声波+舵机)
功能
- 超声波检测用户靠近。
- 舵机自动打开桶盖。
- 满载检测(压力传感器)。
硬件
- ESP32开发板
- HC-SR04超声波模块
- SG90舵机
- 压力传感器(HX711模块)
代码片段
from machine import Pin, PWM, time_pulse
import time
# 超声波测距
trigger = Pin(12, Pin.OUT)
echo = Pin(14, Pin.IN)
def get_distance():
trigger.off()
time.sleep_us(2)
trigger.on()
time.sleep_us(10)
trigger.off()
pulse = time_pulse(echo, 1, 30000) # 超时30ms
return pulse * 0.0343 / 2 # 单位:厘米
# 舵机控制
servo = PWM(Pin(13), freq=50)
def open_lid():
servo.duty(130) # 角度对应占空比
time.sleep(3)
servo.duty(40) # 关闭
# 主逻辑
while True:
dist = get_distance()
if dist < 20: # 距离小于20cm触发
open_lid()
time.sleep(1)
第四部分:调试与优化
1. 常见问题
问题 | 解决方案 |
---|---|
传感器无响应 | 检查供电/引脚/代码逻辑 |
WiFi连接失败 | 确认SSID/密码,重启路由器 |
内存不足 | 使用gc.collect() 手动回收 |
2. 性能优化
- 减少全局变量:优先使用局部变量。
- 硬件加速:使用
machine
模块原生函数(如time_pulse_us
)。 - 省电模式:
machine.deepsleep()
结合外部唤醒。
第五部分:扩展学习资源
-
官方文档
- MicroPython核心库
- ESP32硬件API
-
开源项目参考
- MicroPython GitHub仓库
- 物联网项目合集
-
推荐硬件
- 传感器包:DHT系列、MPU6050、BH1750。
- 通信模块:LoRa模块(SX1276)、4G模块(SIM800L)。
文档说明
- 本指南涵盖从基础到进阶的完整开发流程,建议按顺序学习并动手实践。
- 所有代码均需根据实际硬件调整引脚和参数。
- 建议搭配开发板实操,快速掌握物联网与智能硬件开发!