这个基于树莓派Pico的嵌入式Python项目实战,是我最近完成的一个非常有意思的实践。通过三个典型应用场景 - 环境监测、声控风扇和安防报警,我深入掌握了Python在嵌入式系统中的实际应用。这个项目不仅让我理解了传感器数据采集、智能控制等核心概念,更重要的是学会了如何将编程知识与硬件操作相结合,解决实际问题。
作为一名嵌入式开发爱好者,我发现树莓派Pico是一款非常适合入门的开发板。它体积小巧但功能强大,支持MicroPython编程,拥有丰富的GPIO接口和ADC/PWM功能。通过这个项目,我实现了从环境数据采集到智能控制的完整链路,包括温湿度监测、气体检测、声音控制风扇启停以及人体红外报警等功能。
在开始项目前,我们需要准备以下硬件设备:
首先需要为Pico开发板烧录MicroPython固件:
注意:务必使用优质USB数据线,仅充电线无法完成烧录过程。如果电脑无法识别Pico,尝试更换数据线或USB接口。
我推荐使用VS Code作为开发环境,配置步骤如下:
安装完成后,连接Pico开发板,VS Code会自动识别并建立连接,底部状态栏会显示"Connected to Raspberry Pi Pico"。
环境监测系统需要连接三个主要传感器:
DHT11温湿度传感器:
MQ-2气体传感器:
OLED显示屏:
首先导入必要的库:
python复制import machine
import time
from machine import Pin, I2C, ADC
import dht
from ssd1306 import SSD1306_I2C
初始化DHT11传感器:
python复制dht11 = dht.DHT11(Pin(2))
读取温湿度数据(带滤波处理):
python复制def read_dht11():
try:
dht11.measure()
temp = dht11.temperature()
humi = dht11.humidity()
return temp, humi
except:
return None, None
def get_filtered_data(samples=5):
temps = []
humis = []
for _ in range(samples):
t, h = read_dht11()
if t is not None and h is not None:
temps.append(t)
humis.append(h)
time.sleep(1)
return sum(temps)/len(temps), sum(humis)/len(humis) if temps else (0, 0)
MQ-2气体传感器数据读取:
python复制adc = ADC(Pin(26))
gas_value = adc.read_u16()
gas_percent = gas_value / 65535 * 100 # 转换为百分比
初始化OLED显示屏:
python复制i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=200000)
oled = SSD1306_I2C(128, 64, i2c)
数据显示函数:
python复制def display_data(temp, humi, gas):
oled.fill(0)
oled.text("Environment Monitor", 0, 0)
oled.text(f"Temp: {temp:.1f}C", 0, 16)
oled.text(f"Humid: {humi:.1f}%", 0, 32)
oled.text(f"Gas: {gas:.1f}%", 0, 48)
oled.show()
主循环:
python复制while True:
temp, humi = get_filtered_data()
gas_value = adc.read_u16()
gas_percent = gas_value / 65535 * 100
display_data(temp, humi, gas_percent)
time.sleep(2)
注意事项:
- DHT11传感器读取间隔建议不小于1秒,否则可能导致读取失败
- OLED显示时注意文本位置,避免超出屏幕范围
- 气体传感器需要预热2-3分钟才能稳定工作
声控风扇系统组件连接方式:
声音传感器:
继电器模块:
风扇:
LED指示灯:
初始化引脚:
python复制sound_sensor = Pin(3, Pin.IN)
relay = Pin(4, Pin.OUT)
led = Pin(5, Pin.OUT)
fan_timeout = 0
声音检测中断处理:
python复制def sound_detected(pin):
global fan_timeout
if sound_sensor.value() == 1:
relay.value(1) # 打开风扇
led.value(1) # 点亮LED
fan_timeout = time.time() + 10 # 设置10秒超时
sound_sensor.irq(trigger=Pin.IRQ_RISING, handler=sound_detected)
主循环处理超时:
python复制while True:
if fan_timeout > 0 and time.time() > fan_timeout:
relay.value(0)
led.value(0)
fan_timeout = 0
time.sleep(0.1)
实用技巧:
- 声音传感器灵敏度可通过板载电位器调节
- 继电器控制大功率设备时,建议使用独立电源供电
- 中断处理函数应尽量简短,避免复杂操作
安防报警系统连接方式:
HC-SR501人体红外传感器:
蜂鸣器模块:
报警LED(可选):
初始化传感器和蜂鸣器:
python复制pir = Pin(21, Pin.IN)
buzzer = Pin(22, Pin.OUT)
alarm_led = Pin(23, Pin.OUT)
报警触发函数:
python复制def buzzer_alarm():
for _ in range(3):
buzzer.value(1)
alarm_led.value(1)
time.sleep(0.5)
buzzer.value(0)
alarm_led.value(0)
time.sleep(0.2)
主检测循环:
python复制print("Initializing PIR sensor (30s warm-up)...")
time.sleep(30) # 人体红外传感器需要预热
while True:
if pir.value() == 1:
print("Motion detected! Alarm triggered!")
buzzer_alarm()
time.sleep(0.1)
注意事项:
- HC-SR501传感器需要30秒左右的预热时间
- 传感器上有两个电位器,可调节灵敏度和延时时间
- 安装时避免阳光直射,减少误报
通过UART串口实现设备间通信:
环境监测设备(发送端):
python复制uart = machine.UART(0, baudrate=9600, tx=Pin(4), rx=Pin(5))
def send_environment_data():
temp, humi = get_filtered_data()
gas = adc.read_u16() / 65535 * 100
data = f"ENV:{temp:.1f},{humi:.1f},{gas:.1f}\n"
uart.write(data)
print("Sent:", data.strip())
安防报警设备(接收端):
python复制uart = machine.UART(0, baudrate=9600, tx=Pin(5), rx=Pin(4))
def read_uart():
if uart.any():
data = uart.readline()
try:
decoded = data.decode('utf-8').strip()
if decoded.startswith("ENV:"):
_, values = decoded.split(":")
temp, humi, gas = map(float, values.split(","))
print(f"Received - Temp: {temp}C, Humi: {humi}%, Gas: {gas}%")
except:
pass
实现环境监测与风扇的联动:
python复制# 在环境监测设备中
if gas_percent > 50: # 气体浓度超过50%
uart.write("FAN_ON\n") # 发送开启风扇指令
# 在风扇控制设备中
def handle_uart():
if uart.any():
cmd = uart.readline().decode('utf-8').strip()
if cmd == "FAN_ON":
relay.value(1)
print("Fan turned ON by environment alert")
elif cmd == "FAN_OFF":
relay.value(0)
print("Fan turned OFF by environment alert")
Pico连接问题:
传感器数据不稳定:
OLED显示乱码:
继电器频繁开关:
电源管理:
代码优化:
扩展功能:
通过这个项目,我不仅掌握了Python在嵌入式系统中的应用,更重要的是学会了如何将理论知识转化为实际应用。从最初的硬件连接到最后的系统集成,每一步都遇到了不同的问题,但通过查阅资料、分析调试,最终都找到了解决方案。这种从理论到实践的过程,让我对嵌入式开发有了更深入的理解。